wusa hat geschrieben:Ich hinterfrage das ganze leider nur, da ich es nicht verstehe. Sicherlich hat es auch was mit sauberer Programmierung zu tun.
In Unixoiden Systemen werden Prozesse mittels
fork geklont, was zunächst zu 2 fast identischen Prozessen führt. Der neue Prozess wird als Kindprozess des Ursprungprozesses geführt. Dieses Bootstrappen von Kindprozessen beginnt nach dem Booten des Systems mit dem Urvater aller Prozesse (init; der init-Prozess selbst wird vom Kernel initialisiert, da man von einem 0. Prozess schlecht forken kann) und führt zum bekannten Prozessbaum eines laufenden Systemes.
In Deinem Falle übernimmt
subprocess das Forken (Duplizieren des Pythonprozesses als Kind) und Laden des neuen Binärcodes (exec* Syscalls).
Der Kernel weiss nun, ob ein Prozess beendet wurde oder nicht. Wenn er beendet wurde, werden Ressourcen freigeschaufelt (Speicher, Filedescriptoren etc.). POSIX sieht nun vor, dass der Kindprozess dem Elternprozess einen Rückgabewert von 0-255 gibt (die Idee eines Rückgabewertes eines Prozesses ist allerdings viel älter), was z.B. eine simple Erfolgskontrolle möglich macht.
Da der Kernel kein Wissen darüber hat, wann den Elternprozess der Rückgabewert des Kindes interessiert, speichert er den Wert selber bis er vom Elternprozess angefragt wird. Wird er nie angefragt (was der Kernel nicht wissen kann), ist der Speicher blockiert --> Zombie. Erst wenn auch der Elternprozess terminiert, ist klar, dass der Wert verworfen werden kann und der Zombie wird abgeräumt.