守护进程的两种实现

直接上代码了,参考unix环境高级编程

 1 void daemon()
 2 {
 3     struct rlimit rl;
 4     umask(0);
 5     pid_t pid ;
 6     pid = fork();
 7     if(pid <0 )
 8     {
 9         perror("fork error");
10         return 0;
11     }
12     if(pid > 0) /* parent */
13     {
14         exit(0);
15     }
16     else /* child */
17     {
18         /*
19          * 在关闭描述符之前仍旧可以使用标准输入,标准输出
20          */
21         setsid();
22         getrlimit(RLIMIT_NOFILE,&rl);
23         printf("the max file num is %d: 
",rl.rlim_max);/*setsid()已经与控制终端分离*/
24         printf("the max file num is %d: 
",RLIM_INFINITY);
25         if(rl.rlim_max == RLIM_INFINITY)
26             rl.rlim_max = 1024;
27 
28         int i ;
29         for(i=0; i<rl.rlim_max; i++)
30             close(i);
31         int fd0, fd1, fd2;
32         fd0 = open("/dev/null",O_RDWR);
33         fd1 = dup(0);
34         fd2 = dup(0);
35         openlog("hello", LOG_CONS, LOG_DAEMON);
36     }
37 }

有些喜欢在上述基础之上再fork一次,因为上述的子进程是整个回话的首进程,回话首进程有机会获取控制终端,daemon使不能和终端相连的,所以再fork一下,第一个子进程(第一次fork产生的进程)退出,最新的子进程(第二次fork产生的进程)就不是回话首进程就没有资格获取回去控制终端。

有些还处理SIGHUP信号,关于SIGHUP信号请看unix环境高级编程

第二种方法:

直接利用linux提供的函数daemon()

1 #include <unistd.h>
2 
3 int main()
4 {
5     daemon(0,0);
6     while(1){  /* 不会马上结束 */
7 
8     }
9 }

ok...

原文地址:https://www.cnblogs.com/cdwodm/p/5023940.html