Risposte:
I processi di zombi sono già morti. Non puoi ucciderli. Il kill
comando o la chiamata di sistema non ha alcun effetto su un processo di zombi. (Puoi far sparire uno zombi kill
, ma devi sparare al genitore, non allo zombi, come vedremo tra un minuto.)
Un processo di zombi non è in realtà un processo, è solo una voce nella tabella dei processi. Non ci sono altre risorse associate al processo zombie: non ha memoria o codice in esecuzione, non tiene aperti i file, ecc.
Quando un processo termina, l'ultima cosa da fare, dopo aver ripulito tutte le altre risorse, è la voce nella tabella del processo. Questa voce viene mantenuta in giro, formando uno zombi, per consentire al processo genitore di tenere traccia dello stato di uscita del bambino. Il genitore legge lo stato di uscita chiamando una delle wait
famiglie di syscalls; a questo punto, lo zombi scompare. wait
Si dice che la chiamata raccolga il bambino, estendendo la metafora di uno zombi morto ma in qualche modo ancora non completamente trasformato nell'aldilà. Il genitore può anche indicare che non gli interessa (ignorando il segnale SIGCHLD o chiamando sigaction
con il SA_NOCLDWAIT
flag), nel qual caso la voce nella tabella dei processi viene eliminata immediatamente quando il bambino muore.
Quindi uno zombi esiste solo quando un processo è morto e il suo genitore non ha ancora chiamato wait
. Questo stato può durare solo finché il genitore è ancora in esecuzione. Se il genitore muore prima del figlio o muore senza leggere lo stato del figlio, il processo genitore dello zombi viene impostato sul processo con PID 1, ovvero init
. Uno dei compiti di init
è quello di chiamare wait
in un ciclo e quindi raccogliere qualsiasi processo di zombi lasciato indietro dal suo genitore.
Non si tratta di kill
un processo di zombi, poiché è già morto.
I processi degli zombi devono essere modificati wait
dai loro genitori, in modo che il loro stato di uscita sia raccolto.
L'unico "meccanismo di pulizia incorporato" che esiste in Linux, funziona nel caso in cui qualsiasi processo genitore muoia prima di raccogliere lo stato di uscita dei propri figli. In questo caso, ogni figlio viene ereditato dal init
processo, che verrà wait
acquisito dal figlio, raccoglierà il suo stato di uscita e rimuoverà la voce nella tabella del processo.
Non appena il genitore di un processo muore, il processo diventa orfano, ignorando se si tratta di uno zombi o meno. Cosa succede agli orfani? Ricevono un nuovo genitore, chiamato init
. init
volontà wait
su ogni orfano che ha raccolto, raccogliendo così l'orfano (che potrebbe anche essere stato uno zombi).
No, non esiste un meccanismo di pulizia integrato per gli zombi. Gli zombi vanno nel paradiso degli zombi una volta ucciso il loro genitore. Fino ad allora, il sistema operativo li mantiene per riportare lo stato di uscita al genitore.
init
processo prende il sopravvento e chiamerà wait
esso
init
non uccide alcun processo. Spetta solowait
ai suoi figli raccogliere il loro status.