码迷,mamicode.com
首页 > 系统相关 > 详细

守护进程的两种实现

时间:2015-12-06 19:08:02      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

直接上代码了,参考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: \n",rl.rlim_max);/*setsid()已经与控制终端分离*/
24         printf("the max file num is %d: \n",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...

守护进程的两种实现

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!