2014-01-03 4 views
1

Я написал сервер в perl, ожидая tcp-соединений. Каждый раз, когда сервер получает один, он разворачивает нового ребенка, который отвечает за него, и продолжает прослушивать другое соединение. (И поэтому он не может ждать SIGCHILD.) Ребенок делает то, что он должен делать и выходит, но продолжает «жить» как зомби. Какое решение, пожалуйста?Избавление от зомби в perl

+0

Вы пробовали 'wait()'/'waitpid()'? –

+0

спасибо за ваш ответ el.pescdo проблема в том, что waitpid блокирует родителя. У моего родителя есть что-то еще. – babak

+0

'waitpid (-1, & WNOHANG)' не должен блокироваться. См. Ниже – grebneke

ответ

5

Установите $SIG{CHLD} = 'IGNORE';, чтобы система автоматически обрабатывала их для вас.

Или установите $SIG{CHLD} в подпрограмму и waitpid:

use POSIX qw(WNOHANG); 

$SIG{CHLD} = sub { 
    while((my $child = waitpid(-1, WNOHANG)) > 0) { 
     print "SIGNAL CHLD $child\n"; 
    } 
}; 

Если вы действительно хотите понять, как это работает (конечно, вы делаете :), вы должны прочитать perlipc

Существует также многое другое! info here on Stack Overflow

+1

спасибо grebneke. Я искал его надолго :) – babak

+2

Не стесняйтесь отмечать ответ как принято, если вы чувствуете, что на ваш вопрос был дан ответ – grebneke

Смежные вопросы