UNIX Зомби и Демоны
Я понимаю, что зомби создается, когда процесс плохо очищается (его ресурсы не утилизируются / не собираются). После вызова fork() для создания нового процесса родитель должен всегда вызывать waitpid для этого процесса, чтобы очистить его.
Я также узнал, что демон создается путем разветвления ребенка, который сам был создан с помощью fork, и затем позволением ребенку умереть. Очевидно, что процесс init (pid #1) в UNIX запустит процесс, как только вы сделаете это.
То, что я хочу знать, - насколько я знаю, когда родитель умирает, он автоматически очищает ребенка - так как же вообще создать зомби?
Во-вторых, родитель демонизированного процесса умирает, так почему же демонизированный процесс не считается зомби?
2 ответа
То, что я хочу знать, - насколько я знаю, когда родитель умирает, он автоматически очищает ребенка - так как же вообще создать зомби?
Нет, родитель не очищает детей автоматически. Всякий раз, когда процесс завершается, все его дочерние элементы (работающие или зомби) принимаются init
процесс.
Зомби - это дочерние процессы, которые уже завершены и существуют, когда их родитель еще жив, но еще не вызвал wait
чтобы получить их статус выхода. Если родитель умирает (и не позвонил wait
), все дети зомби усыновлены init
процесс и в конце концов вызывает wait
на всех них, чтобы пожать их, чтобы они исчезли из таблицы процессов.
Идея сохранения процесса зомби состоит в том, чтобы сохранить соответствующие структуры данных о завершении процесса в случае, если родитель когда-либо заинтересуется через wait
,
Во-вторых, родитель демонизированного процесса умирает, так почему же демонизированный процесс не считается зомби?
Родители демонизированных процессов отмирают, но демонизированный процесс отсоединяется от управляющего терминала и становится лидером группы процессов через setsid
системный вызов.
Когда дочерний процесс запущен, на уровне ядра создается запись вместе с идентификатором родительского процесса. По тем или иным причинам (рука сервера, родительский процесс был завершен с конца приложения и т. Д.) Родительский процесс завершен, а дочерний процесс оставлен. Ядро не может убрать такой процесс. Только родительский процесс уполномочен на это. Потому что такой процесс все еще лежит в таблице в ядре, поэтому он также ест ресурсы, но ничего не делает. Итак, его называют зомби.