一个关于守护进程的问题

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<sys/resource.h>
  4. #include<stdlib.h>
  5. int daemon_init(void)
  6. {
  7.   pid_t pid;
  8.   struct rlimit r1;
  9.   int i;
  10.   pid=fork();
  11.   if(pid>0)
  12.     exit(0);
  13.   setsid();
  14.   pid=fork();
  15.   if(pid>0)
  16.     exit(0);
  17.   chdir("/");
  18.   umask(0);
  19.   getrlimit(RLIMIT_NOFILE,&r1);
  20.   if(r1.rlim_max==RLIM_INFINITY)
  21.     r1.rlim_max=1024;
  22.   for(i=0;i<r1.rlim_max;i++)
  23.     close(i);
  24.   return 0;
  25. }
  26. int main()
  27. {
  28.   daemon_init();
  29.   sleep(5);
  30.   return 0;
  31. }
复制代码
我在ubuntu10.10下测试这个程序,遇到一个问题搞不懂。这个问题是:
守护进程只是在main函数睡眠的这5秒中内存在,当main函数退出时,守护进程消失,当不执行sleep函数时根本看不到守护进程。请问这是为什么?(守护进程编写的很不规范,只是测试一下而已)

作者: flike   发布时间: 2011-01-12

因为你的守护进程要做的事情仅仅是close+sleep而已。

程序运行的时候,有一个进程;
第一次fork,有两个进程。紧接着,exit了,还剩一个进程;
第二次fork,有两个进程。紧接着,exit了,还剩一个进程;
然后执行一堆close,就return了,回到了main函数里面,就到了sleep……

作者: kouu   发布时间: 2011-01-12