Sobes.tech
Middle

Care dintre semnale: SIGTERM sau SIGKILL poate genera procese zombie?

sobes.tech AI

Răspuns de la AI

SIGTERM nu poate genera direct procese zombie. El trimite o notificare procesului pentru a se termina corect, oferindu-i șansa de a elibera resursele. Dacă procesul ignoră SIGTERM, nu se va termina.

SIGKILL nu poate genera procese zombie. El ucide imediat procesul, fără a-i oferi posibilitatea de a se termina corect sau de a crea procese fiice.

Un proces zombie apare atunci când un proces fiu se termină, dar procesul părinte nu apelează funcția wait() sau waitpid() pentru a colecta starea sa de finalizare. Procesul părinte este responsabil pentru colectarea stării proceselor fiice terminate. Indiferent de modul în care s-a încheiat procesul fiu (prin SIGTERM, SIGKILL sau alt motiv), acesta devine zombie până când părinte îl "colectează" sau și el se termină.

Prin urmare, zombie sunt generate de procesul părinte, care nu gestionează finalizarea proceselor sale fiice, indiferent de semnalul care a dus la finalizarea acestora.

Exemplu în C care demonstrează crearea de zombie:

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

int main() {
    pid_t pid = fork(); // Crează un proces fiu

    if (pid == 0) {
        // Codul procesului fiu
        printf("Proces fiu (PID: %d) se termină.\n", getpid());
        exit(0); // Procesul fiu se termină
    } else if (pid > 0) {
        // Codul procesului părinte
        printf("Proces părinte (PID: %d) a creat fiul (PID: %d).\n", getpid(), pid);
        // Părintele nu apelează `wait()` sau `waitpid()`, creând zombie

        printf("Proces părinte doarme. Fiu ar trebui să devină zombie.\n");
        sleep(60); // Părintele doarme pentru ca fiul să se termine și să devină zombie
    } else {
        // Eroare la fork
        perror("Eroare la fork");
        return 1;
    }

    return 0;
}

În acest exemplu, procesul fiu se termină, dar procesul părinte nu apelează wait(), ceea ce duce la apariția zombie-urilor. Încheierea procesului fiu în acest caz nu a fost cauzată direct de SIGTERM sau SIGKILL, dar principiul este același: procesul părinte nu a colectat starea.

Dacă fiul ar fi fost ucis prin SIGKILL, tot zombie ar fi devenit dacă procesul părinte nu și-a colectat starea. SIGKILL pur și simplu termină forțat procesul, iar starea sa de finalizare rămâne în tabelul de procese până când procesul părinte o colectează.