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