在父进程中杀死僵尸儿童

时间:2011-11-10 21:01:27

标签: php mysql pear pcntl

所以我想做以下事项:
设置一个授权一堆进程的守护进程。

所以守护进程会分叉一堆进程 然后分叉另一堆流程

问题是子进程可能需要很长时间才能退出。如果父进程有其他工作要做,尽管要求孩子,我如何防止僵尸儿童?

父进程(守护进程)执行以下操作:

while(true)
{
SQL QUERY EXECUTED

   while(mysql_fetch_array)
   {
       Fork children
   }
}

问题是,如果父进程除了分支子进程以及子进程需要很长时间退出之外还必须做其他工作,我该如何等待子进程退出。

我正在使用System守护进程PEAR函数来创建守护进程和pcntl_fork函数来创建进程。

3 个答案:

答案 0 :(得分:4)

我不记得我在哪里看到了这个:

Parent forks child
  Waits until child is dead  (this won't take long, see ahead)
  Goes on

Child does only 2 things:
  Forks a grandchild
  Exits

Grandchild does whatever work is needed
  Exits

诀窍是当Granchild去世时,它的父母(你的一个孩子)已经死了。但有人必须通知死亡。看起来在Linux系统中,并不是通知祖父母,而是所有人的祖母 - 祖父母。因为这个过程知道它的工作,它会定期检查死去的孩子,并且不允许他们成为僵尸。

以下是一个解释链接:http://fixunix.com/unix/533215-how-avoid-zombie-processes.html

  

当进程的父进程终止时,“init”进程接管为其进程   家长。因此,当子进程退出时,孙子就会失去它   父,由init 采用。 Init 总是收获死去的孩子,所以   他们不会变成僵尸。

答案 1 :(得分:2)

你应该考虑让父母除了等孩子之外什么也不做。如果父母因任何原因去世,那么孩子们将成为僵尸。如果父母不任何事情,那么它很可能会意外死亡。

答案 2 :(得分:0)

如果您明确将SIGCHLD处理程序设置为SIG_IGN(而不是SIG_DFL),这将阻止您的孩子成为僵尸进程,假设您对退出代码不感兴趣。或者在较新的Linux上,您应该使用sigaction的{​​{1}}标志。