9

所以我想做以下事情:
设置一个分叉一堆进程的守护进程。

所以守护进程分叉了一堆进程,然后再分叉了另外一堆进程

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

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

while(true)
{
SQL QUERY EXECUTED

   while(mysql_fetch_array)
   {
       Fork children
   }
}

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

我正在使用系统守护进程 PEAR 函数来创建守护进程,并使用pcntl_fork函数来创建进程。

4

3 回答 3

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

诀窍是,当外孙去世时,其父母(您的孩子之一)已经死了。但是必须通知某人死亡。似乎在 Linux 系统中,通知的不是祖父母,而是所有的祖父母。而且因为该进程知道它的工作,它会定期检查死去的孩子并且不允许他们成为僵尸。

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

当一个进程的父进程终止时,“init”进程作为它的父进程接管。所以当子进程退出时,孙子进程就失去了父进程,并被 init收养。Init总是收割死去的孩子,所以他们不会变成僵尸。

于 2011-11-10T23:19:31.213 回答
2

您应该考虑让父母除了等待孩子之外什么都不做。如果父母因任何原因死亡,那么孩子将成为僵尸。但是,如果父母不做任何事情,那么它意外死亡的机会就很小。

于 2011-11-10T21:04:46.333 回答
0

如果您将SIGCHLD处理程序显式设置为SIG_IGN(而不是SIG_DFL),这将阻止您的孩子成为僵尸进程,假设您对他们的退出代码不感兴趣。或者,在较新的 Linux 上,您应该改用sigaction'SA_NOCLDWAIT标志。

于 2011-11-10T22:11:50.887 回答