Sobes.tech
Middle

Welke van de signalen: SIGTERM of SIGKILL kan zombie-processen veroorzaken?

sobes.tech AI

Antwoord van AI

SIGTERM kan niet rechtstreeks zombie-processen veroorzaken. Het stuurt een melding naar het proces dat het correct moet afsluiten, waardoor het de kans krijgt om resources vrij te maken. Als het proces SIGTERM negeert, zal het niet afsluiten.

SIGKILL kan geen zombie-processen veroorzaken. Het beëindigt het proces onmiddellijk, zonder het de mogelijkheid te geven om correct af te sluiten of kindprocessen te creëren.

Een zombie-proces ontstaat wanneer een kindproces eindigt, maar het ouderproces niet de functie wait() of waitpid() aanroept om de beëindingsstatus op te halen. Het ouderproces is verantwoordelijk voor het ophalen van de status van beëindigde kindprocessen. Ongeacht hoe het kindproces is geëindigd (door SIGTERM, SIGKILL of een andere reden), wordt het een zombie totdat de ouder het "ophaalt" of zelf eindigt.

Zodoende worden zombies gegenereerd door het ouderproces, dat de beëindiging van zijn kindprocessen niet afhandelt, ongeacht het signaal dat tot de beëindiging heeft geleid.

Voorbeeld in C dat het creëren van zombies demonstreert:

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

int main() {
    pid_t pid = fork(); // Creëer een kindproces

    if (pid == 0) {
        // Code van het kindproces
        printf("Kindproces (PID: %d) eindigt.\n", getpid());
        exit(0); // Het kindproces eindigt
    } else if (pid > 0) {
        // Code van het ouderproces
        printf("Ouderproces (PID: %d) heeft kind (PID: %d) gemaakt.\n", getpid(), pid);
        // Het ouderproces roept niet `wait()` of `waitpid()` op, wat zombies creëert

        printf("Ouderproces slaapt. Het kind zou zombie moeten worden.\n");
        sleep(60); // Het ouderproces slaapt, zodat het kind kan eindigen en zombie worden
    } else {
        // Fout bij fork
        perror("Fout bij fork");
        return 1;
    }

    return 0;
}

In dit voorbeeld eindigt het kindproces, maar het ouderproces roept niet wait(), wat leidt tot het ontstaan van zombies. Het beëindigen van het kind in dit geval is niet direct veroorzaakt door SIGTERM of SIGKILL, maar het principe is hetzelfde: het ouderproces heeft de status niet verzameld.

Als het kind door SIGKILL werd gedood, zou het ook een zombie worden als het ouderproces zijn status niet verzamelt. SIGKILL beëindigt het proces onmiddellijk, maar de status van de beëindiging blijft in de proceslijst totdat het door het ouderproces wordt verzameld.