Непонятый ребенок и его будущее - PullRequest
1 голос
/ 14 декабря 2011

Таким образом, когда ребенок умирает, родитель получает SIGCHLD, но если родитель умирает до выполнения wait (), ребенок переходит в init. На данный момент ребенок является zombie, т.е. <defunct>.

Что будет дальше?

Ожидает ли init () этого ребенка? если да, когда он это делает? Какие-либо гарантии относительно сроков?

1 Ответ

2 голосов
/ 14 декабря 2011

Да, 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)

...