Como matar o processo zumbi mantendo seu pai vivo? [duplicado]

0

Estou fazendo impressão no framework núcleo .net.

Para imprimir cada etiqueta, inicio um processo. Então, para 100 rótulos, ele cria 100 processos de zumbis.

O processo zumbi é removido da tabela de processos, somente quando eu paro o aplicativo pai, que criou o processo de impressão.

Mas não consigo parar o aplicativo todas as vezes, pois isso afetará outras funcionalidades.

Como posso matar zumbis, sem matar o aplicativo pai? Quantos processos zumbis o Ubuntu pode manipular?

Eu tentei todas as formas dadas no link: Existe alguma maneira de matar um processo zumbi sem reiniciar? mas nenhum está funcionando.

Eu não posso matar o processo pai.

    
por Purnima Naik 07.12.2016 / 11:36

1 resposta

1

Você não pode criar um processo zumbi. Quando você bifurca um processo e esse processo bifurcado (filho) termina, ele envia um código de retorno. Se o processo pai não estiver esperando por esse código de retorno, o processo filho se tornará um zumbi (o processo filho, que morre e o pai não sabe).

Na linguagem C, seria uma função wait () no processo pai que lê o valor de retorno.

Uma solução alternativa comum para isso (se você não tiver intenção no processo pai de esperar por um código de retorno do filho) é dobrar o fork. Isso significa que o seu processo principal A criará um novo processo B, que iniciará o processo C. O processo B termina imediatamente, o processo A pode receber seu código de retorno logo após iniciá-lo. O processo C fará o que for necessário (imprimindo etiquetas no seu caso) e, quando terminar, enviará um código de retorno. Seu processo pai B já está morto, então o sistema cuidará dele (processo com o pid 1 no passado, não tenho certeza de como isso funciona agora). E não vai se tornar um zumbi.

Editar: Aqui está um exemplo que encontrei no link A primeira, se a sequência for o processo A depois de uma bifurcação, apenas aguardará que seu processo filho B seja concluído.

int main()
{
pid_t p1 = fork();

if (p1 != 0)
{
    printf("p1 process id is %d", getpid());
    wait();
    system("ps");
}
else
{
    pid_t p2 = fork();
    int pid = getpid();

    if (p2 != 0) 
    {
        printf("p2 process id is %d", pid);
    }
    else
    {
        printf("p3 process id is %d", pid);
    }

    exit(0);
}
}
    
por marosg 07.12.2016 / 14:51