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

  • 相关阅读:
    洛谷—— P3353 在你窗外闪耀的星星
    洛谷—— P1238 走迷宫
    洛谷—— P1262 间谍网络
    9.8——模拟赛
    洛谷—— P1189 SEARCH
    算法
    May 22nd 2017 Week 21st Monday
    May 21st 2017 Week 21st Sunday
    May 20th 2017 Week 20th Saturday
    May 19th 2017 Week 20th Friday
  • 原文地址:https://www.cnblogs.com/nysanier/p/1979168.html
Copyright © 2011-2022 走看看