UNIX Зомби и Демоны - PullRequest
       35

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

8 голосов
/ 02 сентября 2011

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 02 сентября 2011

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

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

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

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

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

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

0 голосов
/ 17 января 2013

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

...