等待和/或杀死由fork生成的进程孙子

我将fork()分解为进程X和Y,之后Y forks()再次进入自身并多次处理Z.

现在流程Y是某种“听众”,我希望X成为删除者。 Z进程执行实际操作。 Z过程是X的孙子。

通过FIFO和一些信令,X生成了Z进程的所有pid列表。 现在的问题是我想用X删除Z进程僵尸(通过pid列表)。

我已经尝试使用waitpid() ,但当然这不起作用(它只适用于直接孩子)。 但我已经读到了为此自己做扩展的可能性。 但我真的不知道该怎么做。

我已经想到了删除器与僵尸保持另一个列表(退出时的信号)但这与我保存pid时的情况相同,我想以不同的方式做到这一点。

有人知道怎么做吗?

唯一可以从其远端的第N代祖母中获取退出状态的进程是’init’进程,这是内核实现的特殊情况规则。

一般来说,一个过程只能等待其直接的孩子死亡; 它不能等待其子女的后代死亡。

病态的商业……


如果您负责过程Y代码,或者可以影响它,那么该过程可能应该设置signal(SIGCHLD, SIG_IGN)以便Z进程不会创建僵尸。 进程X甚至可以通过在fork()Y进程的任何exec*()之前忽略子进程中的SIGCHILD而自行exec*() 。 如果Y进程显式为SIGCHLD设置了不同的处理程序,则只会覆盖它。 如果Y代码显式设置了SIGCHLD处理并且实际上没有收集其僵尸( Z进程),那么您可以报告Y代码中的错误。

你的问题对于让实际问题难以理解是一项了不起的工作。 不过,我相信我能辨别出以下内容:“我想摆脱僵尸”。 好吧,不是我们所有人。

有多种方法可以做到这一点:

  • Y忽略SIGCHLDforked孩子死后不会变成僵尸
  • Y定期收获( wait )任何孩子

这是你选择使用哪一个,但在我看来,第一个是你想要的。

这不受支持。 如果你的唯一目的是阻止’Z’进程(即孙子)变成僵尸,你可以使用setsid() 。 但是,如果您确实需要退出状态,则确实需要从“Y”流程中获取它们。