情境:
我正在开发一个守护程序监视应用程序,它根据请求启动和停止守护程序(TCP-IP)。
为了实现这一点,在分叉之后,我正在调用setsid()
以便将新进程从父进程“分离”(监视进程)。
当我尝试杀死监控应用程序创建的其中一个进程时,它最终会被解除。
这是我的代码:
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);
}
据我所知,defunct / zombie进程意味着父进程尚未加入该进程。不要setsid()
解决它?
答案 0 :(得分:3)
父母需要致电wait()
或waitpid()
让儿童进程从已解散/僵尸状态“释放”。
这可以在父母的线程中完成,也可以在父母的信号处理程序中完成,以便在孩子死亡时收到SIGCHLD
信号。
<强>更新强>
如 Mellowcandle 的评论中所述,提及需要让一个孩子重新定位到init
以让它像一个达蒙一样生活:
只需fork()
两次。这就是:第一个fork()
ed进程只是fork()
s off另一个。
让第二个fork()
ed进程执行exec*()
,并让第一个fork()ed
进程结束。
当第一个fork()
ed进程结束时,其子进程(第二个fork()
ed进程以及它的后继进程:exec*()
'ed进程)由{{1}继承然后处理init
/这个孩子的死亡。