Antworten:
Zombie-Prozesse sind bereits tot. Du kannst sie nicht töten. Der kill
Befehl oder Systemaufruf hat keine Auswirkungen auf einen Zombie-Prozess. (Sie können einen Zombie dazu bringen, mit kill
ihm zu verschwinden, aber Sie müssen den Elternteil erschießen, nicht den Zombie, wie wir gleich sehen werden.)
Ein Zombie-Prozess ist eigentlich kein Prozess, sondern nur ein Eintrag in der Prozesstabelle. Es gibt keine anderen Ressourcen, die mit dem Zombie-Prozess verbunden sind: Er hat keinen Speicher oder laufenden Code, er hält keine Dateien offen usw.
Wenn ein Prozess stirbt, ist das Letzte, was zu tun ist, nachdem alle anderen Ressourcen bereinigt wurden, der Eintrag in der Prozesstabelle. Dieser Eintrag wird als Zombie gespeichert, damit der übergeordnete Prozess den Austrittsstatus des untergeordneten Elements nachverfolgen kann. Das übergeordnete wait
Element liest den Beendigungsstatus, indem es eine der Systemaufruffamilien aufruft. Zu diesem Zeitpunkt verschwindet der Zombie. Die Berufung wait
soll das Kind ernten und die Metapher eines Zombies erweitern, der tot ist, aber in gewisser Weise immer noch nicht vollständig zum Leben nach dem Tod verarbeitet wird. Der Elternteil kann auch angeben, dass es ihm egal ist (indem er das SIGCHLD-Signal ignoriert oder sigaction
mit dem SA_NOCLDWAIT
Flag aufruft ). In diesem Fall wird der Eintrag in der Prozesstabelle sofort gelöscht, wenn das Kind stirbt.
Ein Zombie existiert also nur, wenn ein Prozess gestorben ist und sein Elternteil noch nicht angerufen wait
hat. Dieser Zustand kann nur so lange andauern, wie das übergeordnete Element noch ausgeführt wird. Wenn der Elternteil vor dem Kind stirbt oder stirbt, ohne den Status des Kindes zu lesen, wird der Elternprozess des Zombies auf den Prozess mit der PID 1 gesetzt init
. Eine der Aufgaben von init
ist es, wait
eine Schleife aufzurufen und so jeden Zombie-Prozess zu ernten, der von seinem Elternteil zurückgelassen wird.
Du bist kein kill
Zombie-Prozess, da er bereits tot ist.
Zombie-Prozesse müssen wait
von ihren Eltern bearbeitet werden , damit ihr Exit-Status gesammelt werden kann.
Der einzige "eingebaute Bereinigungsmechanismus", den es in Linux gibt, funktioniert für den Fall, dass ein übergeordneter Prozess stirbt, bevor er den Exit-Status seiner Kinder erfasst. In diesem Fall wird jedes untergeordnete Element von dem init
Prozess geerbt , der wait
für das untergeordnete Element seinen Beendigungsstatus erfasst und seinen Eintrag in der Prozesstabelle entfernt.
Sobald der Elternteil eines Prozesses stirbt, wird der Prozess zu einer Waise - unabhängig davon, ob es sich um einen Zombie handelt oder nicht. Was passiert mit Waisenkindern? Sie bekommen einen neuen Elternteil, genannt init
. init
wird wait
auf jedes Waisenkind angewendet, das es gesammelt hat, und erntet damit das Waisenkind (das möglicherweise auch ein Zombie war).
Nein, es gibt keinen eingebauten Reinigungsmechanismus für Zombies. Zombies gehen in den Himmel der Zombies, sobald ihre Eltern getötet wurden. Bis dahin behält das Betriebssystem sie bei, um den Exit-Status an das übergeordnete Element zurückzugeben.
init
tötet keinen Prozess. Es liegt nurwait
an seinen Kindern, ihren Status zu sammeln.