Processos de zumbis já estão mortos. Você não pode matá-los. O comando kill
ou a chamada do sistema não tem efeito em um processo zumbi. (Você pode fazer um zumbi acabar com kill
, mas você tem que atirar no pai, não no zumbi, como veremos em um minuto).
Um processo de zumbi não é realmente um processo, é apenas uma entrada na tabela de processos. Não há outros recursos associados ao processo de zumbis: ele não tem nenhuma memória ou código em execução, ele não mantém nenhum arquivo aberto, etc.
Quando um processo morre, a última coisa a seguir, depois que todos os outros recursos são limpos, é a entrada na tabela de processos. Esta entrada é mantida, formando um zumbi, para permitir que o processo pai rastreie o status de saída da criança. O pai lê o status de saída chamando uma das wait
família de syscalls; Neste ponto, o zumbi desaparece. Chamando wait
é dito para colher a criança, ampliando a metáfora de um zumbi sendo morto mas de alguma forma ainda não totalmente processado para a vida após a morte. O pai também pode indicar que não se importa (ignorando o sinal SIGCHLD ou ligando para sigaction
com o SA_NOCLDWAIT
flag), caso em que a entrada na tabela de processos é excluída imediatamente quando a criança morre.
Assim, um zumbi só existe quando um processo morreu e seu pai não chamou wait
ainda. Esse estado pode durar apenas enquanto o pai ainda estiver em execução. Se o pai morre antes da criança ou morre sem ler o status da criança, o processo pai do zumbi é definido como o processo com o PID 1, que é init
. Um dos trabalhos de init
é chamar wait
em um loop e, assim, colher qualquer processo de zumbi deixado pelo pai.