Да, init
немедленно пожнет всех детей. Если вы выполняете процесс, который игнорирует SIGCHLD
и накапливает много зомби, вы можете избавиться от них, убив этого родителя с помощью описанного вами механизма.
Для справки приведем основной цикл init
в многопользовательском режиме. requested_transition
устанавливается сигналом init
(например, классический kill -1 1
для чтения обновленного inittab
):
while (!requested_transition)
if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
collect_child(pid);
(collect_child
обрабатывает случаи, когда init проявляет особый интерес к процессу, например, оболочка входа в систему, которой теперь требуется новый getty
)