Ответы:
Зомби-процессы уже мертвы. Вы не можете убить их. Команда kill
или системный вызов не влияют на процесс зомби. (Вы можете заставить зомби уйти kill
, но вы должны застрелить родителя, а не зомби, как мы увидим через минуту.)
Процесс зомби на самом деле не процесс, а всего лишь запись в таблице процессов. Других ресурсов, связанных с процессом зомби, нет: у него нет памяти или запущенного кода, он не держит открытых файлов и т. Д.
Когда процесс умирает, последним, что нужно сделать после очистки всех других ресурсов, является запись в таблице процессов. Эта запись сохраняется, образуя зомби, чтобы позволить родительскому процессу отслеживать состояние выхода дочернего элемента. Родитель читает статус выхода, вызывая одно из wait
семейства системных вызовов; в этот момент зомби исчезает. wait
Говорят, что призвание пожинает ребенка, расширяя метафору о том, что зомби мертв, но каким-то образом все еще не полностью переработан в загробную жизнь. Родитель также может указать, что ему все равно (игнорируя сигнал SIGCHLD или вызывая sigaction
с SA_NOCLDWAIT
флагом), и в этом случае запись в таблице процессов удаляется сразу после смерти ребенка.
Таким образом, зомби существует только тогда, когда процесс умер, а его родитель еще не вызвал wait
. Это состояние может длиться только до тех пор, пока родитель еще работает. Если родитель умирает раньше ребенка или умирает без чтения статуса ребенка, родительский процесс зомби устанавливается на процесс с PID 1, то есть init
. Одна из задач init
состоит в том, чтобы вызывать wait
цикл и таким образом пожинать любой процесс зомби, оставленный его родителем.
Вы не kill
зомби-процесс, так как он уже мертв.
Процессы зомби должны wait
редактироваться их родителями, чтобы можно было получить их статус выхода.
Единственный «встроенный механизм очистки», существующий в Linux, работает в том случае, если любой родительский процесс умирает до того, как он соберет свой дочерний статус выхода. В этом случае каждый дочерний объект наследуется init
процессом, который wait
на дочернем элементе собирает свой статус выхода и удаляет свою запись в таблице процессов.
Как только родитель процесса умирает, процесс становится сиротой - независимо от того, зомби это или нет. Что происходит с сиротами? Они получают новый родитель, называется init
. init
будет wait
на каждой сироте, которую он собрал, таким образом пожиная сироту (которая, возможно, также была зомби).
Нет, встроенного механизма очистки для зомби нет. Зомби попадают в рай зомби, как только их родитель убит. До тех пор ОС сохраняет их, чтобы они возвращали родительский статус выхода.
init
не убивает любой процесс. Толькоwait
его дети собирают свой статус.