守护进程的两种实现
直接上代码了,参考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...