убийство детей-зомби в родительских процессах - PullRequest
9 голосов
/ 11 ноября 2011

Итак, я хочу сделать следующее:
Установить демон, который разветвляет несколько процессов.

Таким образом, демон разветвляет группу процессов, а затем разветвляет другую группу процессов

проблема в том, что дочерние процессы могут занять много времени для выхода.Как я могу предотвратить детей-зомби, если родительский процесс должен выполнять другую работу, несмотря на разветвление детей?

Родительский процесс (демон) делает что-то вроде этого:

while(true)
{
SQL QUERY EXECUTED

   while(mysql_fetch_array)
   {
       Fork children
   }
}

Проблема заключается в том, как мне ждать завершения дочерних процессов, если родительский процесс должен выполнять другую работу, кромеразветвление потомков, и если потомкам требуется много времени для выхода.

Я использую функцию PEAR System daemon для создания демона и функцию pcntl_fork для создания процессов.

Ответы [ 3 ]

4 голосов
/ 11 ноября 2011

Я не помню, где я видел это:

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 всегда пожинает своих мертвых детей , поэтому они не становятся зомби.

2 голосов
/ 11 ноября 2011

Вам следует подумать о том, чтобы родитель ничего не делал, кроме как ждать детей. Если родитель умирает по какой-либо причине, дети становятся зомби. Однако если родитель ничего не делает , то у него очень мало шансов неожиданно умереть.

0 голосов
/ 11 ноября 2011

Если вы явно установите обработчик SIGCHLD на SIG_IGN (вместо SIG_DFL), это не позволит вашим детям становиться процессами зомби, если вы не заинтересованы в их кодах выхода. В качестве альтернативы в более новых версиях Linux вместо этого следует использовать флаг sigaction SA_NOCLDWAIT.

...