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

时间:2011-06-03 15:05:54

标签: c fork wait

fork()进入过程X和Y,之后Y forks()再次进入自身并多次处理Z.

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

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

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

我已经想过删除器会保留另一个带有僵尸的列表(退出时发出信号),但这与我保存pid时的情况相同,我想以不同的方式进行。

有人知道如何做到这一点吗?

3 个答案:

答案 0 :(得分:2)

唯一可以从其第N代第二代孙子中获取退出状态的进程是'init'进程,这是内核实现的特殊情况规则。

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

病态生意......


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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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