zoukankan      html  css  js  c++  java
  • linux下创建守护进程(daemon process)代码详细注释

    1 #include <stdio.h>
    2 #include <unistd.h>
    3 #include <stdlib.h>
    4 #include <sys/param.h>
    5 #include <sys/stat.h>
    6 #include <sys/types.h>
    7 #include <fcntl.h>
    8 #include <signal.h>
    9
    10 void my_daemon() {
    11 int pid, fd;
    12
    13 // 1.转变为后台进程
    14 if ((pid = fork()) == -1) exit(1);
    15 if (pid != 0) exit(0); // 父进程(前台进程)退出
    16
    17 // 2.离开原先的进程组,会话
    18 if (setsid() == -1) exit(1); // 开启一个新会话
    19
    20 // 3.禁止再次打开控制终端
    21 if ((pid = fork()) == -1) exit(1);
    22 if (pid != 0) exit(0); // 父进程(会话领头进程)退出
    23
    24 // 4.关闭打开的文件描述符,避免浪费系统资源
    25 for (int i = 0; i < NOFILE; i++)
    26 close(i);
    27
    28 // 5.改变当前的工作目录,避免卸载不了文件系统
    29 if (chdir("/") == -1) exit(1);
    30
    31 // 6.重设文件掩码,防止某些属性被父进程屏蔽
    32 if (umask(0) == -1) exit(1);
    33
    34 // 7.重定向标准输入,输出,错误流,因为守护进程没有控制终端
    35 if ((fd = open("/dev/null", O_RDWR)) == -1) exit(1); // 打开一个指向/dev/null的文件描述符
    36 dup2(fd, STDIN_FILENO);
    37 dup2(fd, STDOUT_FILENO);
    38 dup2(fd, STDERR_FILENO);
    39 close(fd);
    40
    41 // 8.本守护进程的子进程若不需要返回信息,那么交给init进程回收,避免产生僵尸进程
    42 if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) exit(1);
    43 }
    44
    45 #define INTERVAL 2
    46
    47 int main(int argc, char *argv[]) {
    48 my_daemon(); // 首先使之成为守护进程
    49
    50 int t = 0;
    51 FILE *fp = fopen("/root/tmp.txt", "a");
    52 fprintf(fp, "ppid = %d, pid = %d, sid = %d, pgrp = %d\n", getppid(), getpid(), getsid(0), getpgrp());
    53 fflush(fp);
    54
    55 do { // 测试此后台进程,每INTERVAL秒打印当前时间t,30秒后退出此后台进程
    56 fprintf(fp, "%d\n", t);
    57 fflush(fp); // 输出缓冲区内容到文件中
    58 sleep(INTERVAL);
    59 t += INTERVAL;
    60 } while(t < 30);
    61
    62 fclose(fp);
    63
    64 return 0;
    65 }

    保存为daemon.c
    编译命令 gcc daemon.c
    运行 ./a.out
    查看tmp.txt文件内容 cat /root/tmp.txt

  • 相关阅读:
    win10系统激活 快捷方式
    echarts 图表自适应外部盒子大小
    JS开发常用工具函数 总结
    课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    基于mykernel 2.0编写一个操作系统内核
    框架复习_SpringMvc
    框架复习_Mybatis
    框架复习_Spring
    IDEA调试
  • 原文地址:https://www.cnblogs.com/nysanier/p/1979168.html
Copyright © 2011-2022 走看看