Sobes.tech
Middle

Ktorý signál: SIGTERM alebo SIGKILL môže spôsobiť zombie procesy?

sobes.tech AI

Odpoveď od AI

SIGTERM nemôže priamo generovať zombie procesy. Posiela upozornenie procesu o potrebe správneho ukončenia, dávajúc mu šancu uvoľniť zdroje. Ak proces ignoruje SIGTERM, nezastaví sa.

SIGKILL nemôže generovať zombie procesy. Ihneď zabíja proces, nedávajúc mu možnosť správneho ukončenia alebo vytvorenia dcérskych procesov.

Zombie proces vzniká, keď dcérsky proces skončí, ale jeho rodič nevolá funkciu wait() alebo waitpid() na zber stavu ukončenia. Rodičovský proces je zodpovedný za zber stavu ukončených dcérskych procesov. Bez ohľadu na spôsob ukončenia dcérskeho procesu (SIGTERM, SIGKILL alebo iným spôsobom), stáva sa zombie, kým ho rodič "nezbiera" alebo sám rodič nezlyhá.

Preto zombie spôsobuje rodičovský proces, ktorý neobsluhuje ukončenie svojich dcérskych procesov, bez ohľadu na signál, ktorý viedol k ich ukončeniu.

Príklad v jazyku C, ktorý demonštruje vytvorenie zombie:

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

int main() {
    pid_t pid = fork(); // Vytvárame dcérsky proces

    if (pid == 0) {
        // Kód dcérskeho procesu
        printf("Dcérsky proces (PID: %d) končí.\n", getpid());
        exit(0); // Dcérsky proces končí
    } else if (pid > 0) {
        // Kód rodičovského procesu
        printf("Rodičovský proces (PID: %d) vytvoril dcérsky (PID: %d).\n", getpid(), pid);
        // Rodič nevolá wait() alebo waitpid(), čím vytvára zombie pri ukončení dcérskeho

        printf("Rodič spí. Dcérsky by sa mal stať zombie.\n");
        sleep(60); // Rodič spí, aby dcérsky mohol ukončiť a stať sa zombie
    } else {
        // Chyba pri fork()
        perror("Chyba pri fork()");
        return 1;
    }

    return 0;
}

V tomto príklade dcérsky proces končí, ale rodičovský proces nevolá wait(), čo spôsobí vznik zombie. Ukončenie dcérskeho procesu v tomto prípade nebolo spôsobené priamo SIGTERM alebo SIGKILL, ale princíp je rovnaký: rodič nezhromaždil stav.

Ak by bol dcérsky proces zabitý SIGKILL, tiež by sa stal zombie, ak rodič nezhromaždil jeho stav. SIGKILL jednoducho nútene ukončí proces, ale stav jeho ukončenia zostáva v tabuľke procesov, kým ho rodič nezhromaždí.