Por que não podemos matar um zumbi? [duplicado]

1

Estou editando esta questão, pois ela foi marcada como duplicada como outra pergunta sobre como matar um processo de zumbi.

Eu não estou procurando uma resposta sobre como matar um processo de zumbi. Eu não tenho zumbis no meu sistema e estou ciente de 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, em primeiro lugar, poderia ser porque o pai não estava respondendo adequadamente ao SIGCHLD.

  • Eliminando o processo pai.

  • Corrigindo o bug no programa que criou o zumbi.
  • Reiniciando.
  • Ou, conforme mencionado em aqui

  • 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 há um método direto e direto para limpar zumbis ou zumbis?

  • Quais seriam os efeitos colaterais / conseqüências se zumbis poderiam ter sido mortos com um sinal?

  • O que está parando os maitainers * NIX para criar um SIGNAL ou um comando (minhas desculpas, se a frase 'criando um novo sinal' não for tecnologicamente aceitável) que limpa um zumbi.

por Sree 04.01.2015 / 09:29

1 resposta

3

O processo já está morto no momento. Não faz sentido matá-lo novamente. Ele ainda é gravado na tabela de processos para permitir que o pai / mãe ative seu status.

Note que todos os processos se tornam zumbis depois de 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 limpos por init quando o processo pai sair.

Sua pergunta adicional é por que SIGKILL não o remove da tabela de processos. Você deve primeiro nos dizer por que deveria. Não tenho conhecimento de nenhum motivo único para permitir que o usuário remova um processo defunto da tabela de processos. No design do sistema operacional, você deve sempre ter um bom motivo para fazer algo antes de perguntar por que não fazê-lo . Você está solicitando um recurso sem nenhum caso de uso real.

Além da falta de propósito, isso teria consequências ruins. O pai chama wait() e / ou waitpid() para saber o status dos filhos que saíram. O resultado da chamada é consistente, quer seja chamado antes de o processo se tornar defunto , antes de você 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 enfrentá-lo sem motivo válido. Em sistemas que reutilizariam antigos valores de pid , não manter os registros poderia resultar em problemas muito mais graves, como um software matando um processo totalmente diferente por acidente.

Veja também: link

    
por 04.01.2015 / 10:15