2011-06-03 76 views
0

fork()制作成处理X和Y,然后ÿforks()再次入本身和步骤Z多次过程孙子。等待和/或杀死通过叉

现在处理Y是某种“监听者”,我希望X是删除者。 Z进程执行实际的操作。 ž过程X.

随着FIFO和一些信令的孙子,X已产生在Z过程的所有PID的清单。现在的问题是我想用X删除Z进程僵尸(通过pid列表)。

我和waitpid()试过,但当然不工作(它只做直接孩子)。但是我已经读过关于自己做这个扩展的可能性。但我真的不知道该怎么做。

我认为缺失者保持僵尸另一个列表(信号退出时),但是这仅仅是因为我做了节能的PID一样,我想以不同的方式去做。

有没有人有如何做到这一点的想法?

回答

1

你的问题做了一个令人难以理解的实际问题的出色工作。不过,我相信我可以看出以下几点:“我想摆脱僵尸”。那么,我们不都是。

这样做有多种方式:

  • Y忽略SIGCHLD。当他们死
  • Y定期收割(wait)对任何儿童

forked孩子不会变成僵尸这是你自己的选择使用哪一个,但在我看来,第一个是你想要的。

2

可以从它的遥远的第N代盛大儿童习得的退出状态,唯一的过程是“初始化”的过程,这是由内核实现的一种特殊情况规则。

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

病态业务...


如果你在充电的过程Y码的,或者可以影响它,也许这个过程应该设置signal(SIGCHLD, SIG_IGN),使Z进程不会创建僵尸。流程X甚至可以做到这一点本身,而它由fork()后忽略了孩子的过程SIGCHILD和前Y过程中的任何exec*()叉子Y过程。如果Y进程为SIGCHLD明确设置了不同的处理程序,则只会覆盖它。如果Y代码明确设置了SIGCHLD处理并且实际上并未收集其僵尸(Z进程),那么您可以在Y代码中报告错误。

1

这不支持。如果您唯一的意图是防止'Z'过程(即,孙子)从变成僵尸,你可以使用setsid()。但是,如果你真的需要他们的退出状态,你真的需要从'Y'过程中收获他们。