等待和/或杀死由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
忽略SIGCHLD
。forked
孩子死后不会变成僵尸 - 让
Y
定期收获(wait
)任何孩子
这是你选择使用哪一个,但在我看来,第一个是你想要的。
这不受支持。 如果你的唯一目的是阻止’Z’进程(即孙子)变成僵尸,你可以使用setsid()
。 但是,如果您确实需要退出状态,则确实需要从“Y”流程中获取它们。