Sobes.tech
Middle

Melyik jel: SIGTERM vagy SIGKILL okozhat zombiprocesszeket?

sobes.tech MI

Válasz az MI-től

A SIGTERM nem közvetlenül zombiprocesszusokat hoz létre. Egy értesítést küld a folyamatnak, hogy helyesen fejezze be, így lehetőséget adva neki az erőforrások felszabadítására. Ha a folyamat figyelmen kívül hagyja a SIGTERM-et, nem fog befejeződni.

A SIGKILL nem hozhat létre zombiprocesszusokat. Azonnal megöli a folyamatot, anélkül, hogy lehetőséget adna neki a helyes befejezésre vagy gyermekfolyamatok létrehozására.

Egy zombiprocesszus akkor keletkezik, amikor egy gyermekfolyamat befejeződik, de a szülőfolyamat nem hívja meg a wait() vagy waitpid() függvényt, hogy összegyűjtse a befejezési állapotát. A szülő felelős a befejezett gyermekfolyamatok állapotának összegyűjtéséért. Függetlenül attól, hogyan ért véget a gyermekfolyamat (SIGTERM, SIGKILL vagy más okból), zombivá válik, amíg a szülő "összegyűjti" vagy maga is befejezi.

Ezért a zombik a szülőfolyamat által keletkeznek, amely nem kezeli a gyermekfolyamatok befejezését, függetlenül attól, milyen jelzés vezetett a gyermek folyamatának végéhez.

Példa C nyelven, amely bemutatja a zombik létrehozását:

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

int main() {
    pid_t pid = fork(); // Gyermekfolyamat létrehozása

    if (pid == 0) {
        // Gyermekfolyamat kódja
        printf("Gyermekfolyamat (PID: %d) befejeződik.\n", getpid());
        exit(0); // Gyermekfolyamat befejeződik
    } else if (pid > 0) {
        // Szülőfolyamat kódja
        printf("Szülőfolyamat (PID: %d) létrehozta a gyermeket (PID: %d).\n", getpid(), pid);
        // A szülő nem hív `wait()` vagy `waitpid()`, zombikat hozva létre

        printf("A szülő alszik. A gyermek zombivá válik.\n");
        sleep(60); // A szülő alszik, hogy a gyermek befejeződjön és zombivá váljon
    } else {
        // Hiba a fork során
        perror("Hiba a fork során");
        return 1;
    }

    return 0;
}

Ebben a példában a gyermekfolyamat befejeződik, de a szülő nem hív wait()-et, ami zombik kialakulásához vezet. A gyermek befejezése ebben az esetben nem közvetlenül SIGTERM vagy SIGKILL által történt, de az elv ugyanaz: a szülő nem gyűjtötte össze az állapotát.

Ha a gyermeket SIGKILL-lel ölnék meg, akkor is zombivá válna, ha a szülő nem gyűjtötte össze az állapotát. A SIGKILL egyszerűen erőszakosan befejezi a folyamatot, de a befejezési állapota továbbra is a folyamat táblában marad, amíg a szülő nem gyűjti össze.