试图杀死一个产生过程的过程最终会导致失效

时间:2013-05-27 11:30:50

标签: c linux process zombie-process

情境: 我正在开发一个守护程序监视应用程序,它根据请求启动和停止守护程序(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()解决它?

1 个答案:

答案 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 /这个孩子的死亡。