UNIX Зомби и Демоны

Я понимаю, что зомби создается, когда процесс плохо очищается (его ресурсы не утилизируются / не собираются). После вызова fork() для создания нового процесса родитель должен всегда вызывать waitpid для этого процесса, чтобы очистить его.

Я также узнал, что демон создается путем разветвления ребенка, который сам был создан с помощью fork, и затем позволением ребенку умереть. Очевидно, что процесс init (pid #1) в UNIX запустит процесс, как только вы сделаете это.

То, что я хочу знать, - насколько я знаю, когда родитель умирает, он автоматически очищает ребенка - так как же вообще создать зомби?

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

2 ответа

Решение

То, что я хочу знать, - насколько я знаю, когда родитель умирает, он автоматически очищает ребенка - так как же вообще создать зомби?

Нет, родитель не очищает детей автоматически. Всякий раз, когда процесс завершается, все его дочерние элементы (работающие или зомби) принимаются init процесс.

Зомби - это дочерние процессы, которые уже завершены и существуют, когда их родитель еще жив, но еще не вызвал wait чтобы получить их статус выхода. Если родитель умирает (и не позвонил wait), все дети зомби усыновлены init процесс и в конце концов вызывает wait на всех них, чтобы пожать их, чтобы они исчезли из таблицы процессов.

Идея сохранения процесса зомби состоит в том, чтобы сохранить соответствующие структуры данных о завершении процесса в случае, если родитель когда-либо заинтересуется через wait,

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

Родители демонизированных процессов отмирают, но демонизированный процесс отсоединяется от управляющего терминала и становится лидером группы процессов через setsid системный вызов.

Когда дочерний процесс запущен, на уровне ядра создается запись вместе с идентификатором родительского процесса. По тем или иным причинам (рука сервера, родительский процесс был завершен с конца приложения и т. Д.) Родительский процесс завершен, а дочерний процесс оставлен. Ядро не может убрать такой процесс. Только родительский процесс уполномочен на это. Потому что такой процесс все еще лежит в таблице в ядре, поэтому он также ест ресурсы, но ничего не делает. Итак, его называют зомби.

Другие вопросы по тегам