2015-11-15 4 views
2

У меня есть скрипт perl с несколькими дочерними процессами, сгенерированными с помощью fork. Родитель обрабатывает SIGINT, а дочерние процессы игнорируют SIGINT ($ SIG {INT} = 'IGNORE').Почему дети не становятся зомби в perl

$SIG{'INT'} = sub { 
    print "Caught Ctrl+C by $$\n"; 
    # while($result != -1){ 
     # $result = wait(); 
    #} 
    die "Stopping..."; 
}; 

a) Если включить прокомментированные строки, скрипт ждет, пока дети завершатся, а затем выйдут.

б) Но если я комментирую линию «ждать» Я предполагаю, что это работает, как этот - выходы сценария и родительский процесс завершается - дети продолжают работать в фоновом режиме и отображать некоторое сообщение, как ожидаются, перед выходом.

Я понимаю а) случай, но как работает б) работа, пожалуйста, объясните, почему это не порождает процессы зомби?

Этот вопрос простирается/связан с Wait for children to complete if parent intercepts SIGINT

ответ

2

Это не имеет ничего конкретного делать с Perl.

Когда процесс завершается, все дочерние элементы процесса «возвращаются» к init - их ppid сбрасывается на 1, что является pid процесса init, который запускается при загрузке машины.

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

+0

Итак, в моем случае дети становятся «сиротскими процессами» (а не зомби) и принимаются init. Если да, то что создаст зомби? (Я пробовал НЕ игнорировать сигнал от детей, но это все еще выглядит нормально). .. Я прочитал некоторую информацию, но все еще не могу четко определить, когда именно я получаю зомби против сироты (в контексте перехвата SIGINT в родительском и дочернем) –

+3

«Зомби» - это процесс, который вышел, но его родительский но называется 'wait', чтобы получить статус выхода. Всякий раз, когда родитель вызывает 'wait', чтобы получить статус выхода или завершения, зомби будет очищен. –

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