【问题标题】:Wait for and/or kill process grandchildren produced by fork等待和/或杀死 fork 产生的进程孙子进程
【发布时间】:2011-06-03 15:05:54
【问题描述】:

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

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

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

我已经用waitpid() 尝试过,但这当然行不通(它只适用于直系子女)。但是我已经阅读了有关为此自己进行扩展的可能性。但我真的不知道该怎么做。

我曾想过删除器会保留另一个僵尸列表(退出时发出信号),但这与我保存 pid 时所做的一样,我想以不同的方式进行。

有人知道怎么做吗?

【问题讨论】:

    标签: c fork wait


    【解决方案1】:

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

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

    病态的生意...


    如果您负责进程Y 代码,或者可以影响它,也许该进程应该设置signal(SIGCHLD, SIG_IGN) 以便Z 进程不会创建僵尸。进程X 甚至可以通过在fork() 之后和Y 进程的任何exec*() 之前忽略子进程中的SIGCHILD 来分叉Y 进程时自己执行此操作。仅当Y 进程为 SIGCHLD 显式设置不同的处理程序时,这才会被覆盖。如果Y 代码明确设置了 SIGCHLD 处理并且实际上并没有收集它的僵尸(Z 进程),那么您可以在Y 代码中报告错误。

    【讨论】:

      【解决方案2】:

      您的问题在使实际问题难以理解方面做得非常好。不过,我相信我可以看出以下几点:“我想摆脱僵尸”。好吧,我们都不是。

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-10
          • 2016-08-31
          • 1970-01-01
          • 1970-01-01
          • 2013-07-27
          相关资源
          最近更新 更多