试图杀死一个产卵的过程结束了一个不成熟的过程

场景:我正在开发一个守护进程监视应用程序,它根据请求(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 /这个孩子的死亡。