Por que não podemos matar um zumbi?

Por que não podemos matar um zumbi?

Estou editando esta pergunta porque ela foi marcada como duplicada como outra pergunta sobre como matar um processo zumbi.

Não estou procurando uma resposta sobre como eliminar um processo zumbi. Não tenho zumbis em meu sistema e sei como os zumbis são criados.

Deixe-me tentar reformular a pergunta. Atualmente, estes são os métodos aceitos para remover um zumbi:

  • Enviando SIGCHLD para o pai. Funciona teoricamente, nem sempre na prática, já que uma das razões pelas quais o zumbi foi criado pode ser porque o pai não estava respondendo adequadamente ao SIGCHLD.

  • Matando o processo pai.

  • Corrigindo bug no programa que criou o Zumbi.
  • Reiniciando.
  • Ou como mencionado emaqui

  • Ou por este motivo mencionado por @richard nos comentários à minha pergunta antes desta edição:

    ..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.

Agora minhas perguntas são:

  • Por que não existe um método direto e direto para limpar um zumbi ou zumbis?

  • Quais seriam os efeitos colaterais/consequências se o zumbi pudesse ter sido morto com um sinal.

  • O que está impedindo os maitainers do *NIX de criar um SINAL ou um comando (peço desculpas, se a frase 'criar um novo sinal' não for tecnologicamente aceitável) que limpe um zumbi.

Responder1

O processo já está morto na época. Não faz sentido matá-lo novamente. Ele ainda é registrado na tabela de processos para permitir que o pai obtenha seu status.

Observe que todos os processos se tornam zumbis após serem mortos. Você simplesmente não os vê porque a maioria dos processos parentais limpa seus filhos muito rapidamente. Você pode querer enviar um relatório de bug se um software não limpar seus zumbis e eles só forem limposiniciarassim que o processo pai terminar.

Sua pergunta adicional é por que SIGKILLnão a remove da tabela de processos. Você deve primeiro nos dizer por que deveria. Não conheço nenhum motivo para permitir que o usuário remova um processo extinto da tabela de processos. No projeto do sistema operacional, você deve sempre ter umum bom motivo para fazer algoantes de você perguntarpor que não fazer isso. Você está solicitando um recurso sem caso de uso real.

Além da falta de propósito, teria consequências ruins. O pai liga wait()e/ou waitpid()para saber o status dos filhos que saíram. O resultado da chamada é consistente se for chamado antes do processo se tornarextinto, antes de emitir o SIGKILL, ou depois disso.

Se o kernel não mantivesse os registros (ou seja, o processo seria removido da tabela de processos), o comportamento teria que ser inconsistente e o pai teria que esperar a inconsistência e lidar com ela sem motivo válido. Em sistemas que reutilizariam antigospidvalores, não manter os registros pode resultar em problemas muito mais graves, como um software matando um processo totalmente diferente por acidente.

Veja também:http://en.wikipedia.org/wiki/Zombie_process

informação relacionada