String kürzen
@wusa: Während des `sleep()` existiert der Zombieprozess. Der verschwindet wenn Dein Programm endet. Das es einen Zombieprozess gibt, habe ich ja in einem Beitrag weiter oben demonstriert. Man sollte halt genau wie man Dateien schliesst so bald wie möglich nach dem man sie nicht mehr benötigt, auch dafür sorgen das Prozesse so kurz wie möglich im Zombiezustand bleiben. Andernfalls kann man in beiden Fällen wenn es blöd läuft an Begrenzungen vom Betriebssystem stossen die das Programm hart beenden.
Ergänzend zu Sirius: Du hast da ja auch kein Programm das sofort wieder endet, sondern erstellst in einer Schleife immer neue Prozesse. Vielleicht sogar in einem Programm welches lange läuft. Da käme das Betriebssystem ja erst ganz am Ende zum Zug um hinter dem Programm aufzuräumen. Und das Ende des Programms könnte wie gesagt dann auch vom Betriebssystem beendet werden statt regulär zu enden, ganz einfach weil alle Ressourcen aufgebraucht waren die dem Prozess zugestanden wurden.
Ergänzend zu Sirius: Du hast da ja auch kein Programm das sofort wieder endet, sondern erstellst in einer Schleife immer neue Prozesse. Vielleicht sogar in einem Programm welches lange läuft. Da käme das Betriebssystem ja erst ganz am Ende zum Zug um hinter dem Programm aufzuräumen. Und das Ende des Programms könnte wie gesagt dann auch vom Betriebssystem beendet werden statt regulär zu enden, ganz einfach weil alle Ressourcen aufgebraucht waren die dem Prozess zugestanden wurden.
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.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 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.