4

场景: 我正在开发一个守护程序监控应用程序,它根据请求(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);
}

据我了解,已失效/僵尸进程意味着父母尚未加入该进程。不setsid()解决?

4

1 回答 1

3

父进程需要调用wait()waitpid()让子进程从失效/僵尸状态中“释放”出来。

这可以在父母的线程中完成,也可以在父母的信号处理程序中完成,该信号处理程序服务SIGCHLD于在孩子死亡时接收到的信号。


更新

正如Mellowcandle的评论中所述,提到需要让孩子重新成为父母init,让它像恶魔一样生活:

fork()两次。那就是:第一个fork()ed 进程刚刚fork()关闭另一个。

让第二个fork()ed 进程执行exec*(),并让第一个fork()ed进程结束。

当第一个fork()ed 进程结束时,它的子进程(第二个fork()ed 进程和它的继任者:exec*()'ed 进程)被继承init,然后处理SIGCHLD这个子进程的死亡。

于 2013-05-27T11:48:22.840 回答