Sobes.tech
Middle

Qual dos sinais: SIGTERM ou SIGKILL pode gerar processos zumbi?

sobes.tech IA

Resposta da IA

O SIGTERM não pode gerar processos zombi diretamente. Ele envia uma notificação ao processo para terminar corretamente, dando-lhe a oportunidade de libertar recursos. Se o processo ignorar o SIGTERM, ele não terminará.

O SIGKILL não pode gerar processos zombi. Ele termina imediatamente o processo, sem lhe dar a oportunidade de terminar corretamente ou criar processos filhos.

Um processo zombi ocorre quando um processo filho termina, mas o seu processo pai não chama a função wait() ou waitpid() para recolher o seu estado de finalização. O processo pai é responsável por recolher o estado dos processos filhos terminados. Independentemente de como o processo filho terminou (por SIGTERM, SIGKILL ou por outro motivo), ele torna-se zombi até que o pai o "recolha" ou também termine.

Assim, os zombi são gerados por o processo pai, que não trata a finalização dos seus processos filhos, independentemente do sinal que levou à finalização do filho.

Exemplo em C que demonstra a criação de zombi:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    pid_t pid = fork(); // Criar processo filho

    if (pid == 0) {
        // Código do processo filho
        printf("Processo filho (PID: %d) termina.\n", getpid());
        exit(0); // Processo filho termina
    } else if (pid > 0) {
        // Código do processo pai
        printf("Processo pai (PID: %d) criou filho (PID: %d).\n", getpid(), pid);
        // O pai não chama wait() ou waitpid(), criando zombi ao terminar o filho

        printf("Processo pai a dormir. O filho deve tornar-se zombi.\n");
        sleep(60); // O pai dorme para que o filho termine e se torne zombi
    } else {
        // Erro no fork
        perror("Erro no fork");
        return 1;
    }

    return 0;
}

Neste exemplo, o processo filho termina, mas o processo pai não chama wait(), o que leva ao aparecimento de zombi. A terminação do filho neste caso não foi causada diretamente por SIGTERM ou SIGKILL, mas o princípio é o mesmo: o pai não recolheu o estado.

Se o filho fosse morto por SIGKILL, também se tornaria zombi se o pai não tivesse recolhido o seu estado. SIGKILL termina forçosamente o processo, mas o seu estado de finalização permanece na tabela de processos até que o pai o recolha.