Sobes.tech
Middle

Welches Signal: SIGTERM oder SIGKILL kann Zombie-Prozesse verursachen?

sobes.tech KI

Antwort von AI

SIGTERM kann keine Zombie-Prozesse direkt erzeugen. Es sendet eine Benachrichtigung an den Prozess, dass er ordnungsgemäß beendet werden soll, und gibt ihm die Chance, Ressourcen freizugeben. Wenn der Prozess SIGTERM ignoriert, wird er nicht beendet.

SIGKILL kann keine Zombie-Prozesse erzeugen. Es beendet den Prozess sofort, ohne ihm die Möglichkeit zu geben, ordnungsgemäß zu beenden oder Kindprozesse zu erstellen.

Ein Zombie-Prozess entsteht, wenn ein Kindprozess beendet wird, aber sein Elternprozess nicht die Funktion wait() oder waitpid() aufruft, um seinen Beendigungsstatus zu sammeln. Der Elternprozess ist verantwortlich für das Sammeln des Status der beendeten Kindprozesse. Unabhängig davon, wie der Kindprozess beendet wurde (durch SIGTERM, SIGKILL oder aus anderen Gründen), wird er zum Zombie, bis der Elternprozess ihn "sammelt" oder selbst beendet wird.

Daher werden Zombies durch den Elternprozess erzeugt, der das Beenden seiner Kindprozesse nicht behandelt, unabhängig vom Signal, das zum Beenden des Kindes geführt hat.

Beispiel in C, das die Erstellung eines Zombies demonstriert:

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

int main() {
    pid_t pid = fork(); // Erstellen eines Kindprozesses

    if (pid == 0) {
        // Code des Kindprozesses
        printf("Kindprozess (PID: %d) beendet.\n", getpid());
        exit(0); // Kindprozess beendet
    } else if (pid > 0) {
        // Code des Elternprozesses
        printf("Elternprozess (PID: %d) hat Kind (PID: %d) erstellt.\n", getpid(), pid);
        // Eltern ruft nicht wait() oder waitpid() auf, was zu Zombies führt

        printf("Elternprozess schläft. Das Kind sollte zum Zombie werden.\n");
        sleep(60); // Eltern schläft, damit das Kind beendet wird und zum Zombie wird
    } else {
        // Fehler beim fork
        perror("Fehler beim fork");
        return 1;
    }

    return 0;
}

In diesem Beispiel beendet sich das Kind, aber der Elternprozess ruft nicht wait() auf, was zur Entstehung von Zombies führt. Der Abschluss des Kindes wurde in diesem Fall nicht direkt durch SIGTERM oder SIGKILL verursacht, aber das Prinzip ist dasselbe: Der Elternprozess hat den Status nicht gesammelt.

Wenn das Kind durch SIGKILL getötet würde, würde es ebenfalls zum Zombie, wenn der Elternprozess seinen Status nicht gesammelt hat. SIGKILL beendet den Prozess sofort, aber sein Beendigungsstatus verbleibt in der Prozesstabelle, bis der Elternprozess ihn sammelt.