• 量化交易之linux高级篇 - 守护进程的写法


    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. // 创建守护进程
    8. int ngx_daemon() {
    9. int fd;
    10. switch(fork()) {
    11. case -1:
    12. // 创建子进程失败, 这里可以写日志...
    13. return -1;
    14. case 0:
    15. // 子进程, 走到这里直接break
    16. break;
    17. default:
    18. // 父进程, 直接退出
    19. exit(0);
    20. }
    21. // 只有子进程流程才能走到这里
    22. if (setsid() == -1) { // 脱离终端, 终端关闭将与此子进程无关
    23. // 记录错误日志...
    24. return -1;
    25. }
    26. umask(0); // 设置为0, 不要让它来限制文件权限, 以免引起混乱
    27. fd = open("/dev/null", O_RDWR); // 打开黑洞设备 (以读写方式打开)
    28. if (fd == -1) {
    29. // 记录错误日志...
    30. return -1;
    31. }
    32. if (dup2(fd, STDIN_FILENO) == -1) { // 先关闭 STDIN_FILENO (这是规矩, 已经打开的描述符, 改动之前先关闭), 类似于指针指向null, 让/dev/null成为标准输入
    33. // 记录错误日志...
    34. return -1;
    35. }
    36. if (dup2(fd, STDOUT_FILENO) == -1) { // 先关闭 STDOUT_FILENO, 类似于指针指向 null, 让 /dev/null 成为标准输出
    37. // 记录错误日志...
    38. return -1;
    39. }
    40. if (fd > STDERR_FILENO) { // fd 应该是 3, 这里应该成立
    41. if (close(fd) == -1) { // 释放资源, 这样这个文件描述符就可以被复用; 不然这个数字(文件描述符)会被一直占用
    42. // 记录错误日志...
    43. return -1;
    44. }
    45. }
    46. return 1;
    47. }
    48. int main(int argc, char *argv[]) {
    49. if (ngx_daemon() != 1) {
    50. // 创建守护进程失败, 可以做失败后的处理(如 写日志等);
    51. return 1;
    52. } else {
    53. // 创建守护进程成功, 执行守护进程中要做的工作
    54. for (;;) {
    55. printf("sleep 1s, process id: %d!\n", getpid()); // 即使打印也没用, 现在标准输出指向黑洞(/dev/null), 打印不出任何结果(不显示任何结果)
    56. sleep(1);
    57. }
    58. }
    59. return 0;
    60. }

  • 相关阅读:
    家政服务小程序,家政维修系统,专业家政软件开发商;家政服务小程序,家政行业软件开发
    通过20天预测7天
    QE01/QA11/QA02屏幕增强
    Js实现时间函数
    Ajax跨域问题
    Isaac-gym(8):Tensor API
    【地平线 开发板】实现模型转换并在地平线开发板上部署的全过程操作记录(魔改开发包)
    R语言绘图-3-Circular-barplot图
    Redis基础特性及应用练习-php
    设计模式概述
  • 原文地址:https://blog.csdn.net/Michael_234198652/article/details/127719360