Sobes.tech
Middle

Který signál: SIGTERM nebo SIGKILL může způsobit zombie procesy?

sobes.tech AI

Odpověď od AI

SIGTERM nem může přímo vytvářet zombie procesy. Posílá upozornění procesu, aby správně ukončil, dává mu šanci uvolnit zdroje. Pokud proces SIGTERM ignoruje, neskončí.

SIGKILL nem může vytvářet zombie procesy. Ihned zabije proces, aniž by mu dal šanci správně ukončit nebo vytvořit potomky.

Zombie proces vzniká, když potomek skončí, ale jeho rodič nevolá funkci wait() nebo waitpid(), aby shromáždil jeho stav ukončení. Rodič je zodpovědný za shromáždění stavu ukončených potomků. Bez ohledu na to, jak potomek skončil (SIGTERM, SIGKILL nebo jinak), stává se zombie, dokud ho rodič "nesbírá" nebo sám nezkončí.

Proto jsou zombie vytvářeny rodičovským procesem, který neřeší ukončení svých potomků, bez ohledu na signál, který k tomu vedl.

Příklad v C demonstrující tvorbu zombie:

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

int main() {
    pid_t pid = fork(); // Vytvoření potomka

    if (pid == 0) {
        // Kód potomka
        printf("Potomek (PID: %d) končí.\n", getpid());
        exit(0); // Potomek končí
    } else if (pid > 0) {
        // Kód rodiče
        printf("Rodič (PID: %d) vytvořil potomka (PID: %d).\n", getpid(), pid);
        // Rodič nevolá `wait()` nebo `waitpid()`, čímž vznikají zombie

        printf("Rodič spí. Potomek by se měl stát zombie.\n");
        sleep(60); // Rodič spí, aby potomek mohl skončit a stát se zombie
    } else {
        perror("Chyba při fork()\n");
        return 1;
    }

    return 0;
}

V tomto příkladu potomek skončí, ale rodič nevolá wait(), což vede ke vzniku zombie. Ukončení potomka v tomto případě nebylo přímo způsobeno SIGTERM nebo SIGKILL, ale princip je stejný: rodič nesbírá stav.

Pokud by byl potomek zabit SIGKILL, stal by se také zombie, pokud rodič jeho stav nesbírá. SIGKILL prostě násilně ukončí proces, ale jeho stav ukončení zůstává v tabulce procesů, dokud ho rodič nesbírá.