场景:我正在开发一个守护进程监视应用程序,它根据请求(TCP-IP)启动和停止守护进程。 为了实现这一点,分叉之后,我调用setsid()
以便从父进程(监视进程)“分离”新进程。
当我试图杀死监视应用程序创build的其中一个进程时,它结束了。
这是我的代码:
int retval; char* arg_list[] = { NULL /* The argument list must end with a NULL. */ }; retval = fork(); if (retval == 0) { umask(0); setsid(); execv(LBSDPATH, arg_list); exit(0); }
据我了解,死/僵尸进程意味着父母还没有join进程。 不setsid()
解决它?
父母需要调用wait()
或waitpid()
来让子进程从“死亡/僵尸”状态中“释放”。
这可以在父母的线程中完成,也可以在服务于儿童死亡时收到的SIGCHLD
信号的父母信号处理程序中完成。
更新
提到有必要让一个孩子重新回到init
,让它像Mellowcandle的评论中所说的那样生活 :
只需fork()
两次。 也就是说:第一个fork()
过程只是fork()
从另一个fork()
。
让第二个fork()
ed过程执行exec*()
,并让第一个fork()ed
过程结束。
当第一个fork()
过程结束时,它的子进程(第二个fork()
进程,并且与它继承: exec*()
'ed一个)被init
继承,然后处理SIGCHLD
/这个孩子的死亡。