Thread fork - wie vermeide ich zombies, wenn child länger als der parent läuft? (4 answers)
Opened by Martin at 2010-11-09 16:30

torsten
 2010-11-11 10:42
#142634 #142634
User since
2010-08-16
45 Artikel
BenutzerIn
[Homepage] [default_avatar]
Guest Martin
Ich kann den Parent Prozess nicht beliebig lang laufen lassen, weil der sonst vom Apache nach einer gewissen Zeit gekillt wird, d.h. ein normaler Sig-Child-Reaper fällt flach. Da der Parent-Prozess jedoch vor dem Child-Prozess beendet wird, bekomme ich Zombie-Prozesse.


Dieser Absatz macht für mich keinen Sinn. Stirbt der Vater eines Prozesses, wird PPID des Kindes auf 1 gesetzt. D.h. der Init-Prozess erbt das verwaiste Kind. Bisher gibt es keinen Zombie. Stirbt nun das Kind, kriegt der Init-Prozess ein SIGCHLD und liest daraufhin die Status-Info des Verstorbenen. Solange Dein Init-Prozess also funktioniert, kann es zwar Zombies geben, aber nur für den kurzen Moment zwischen dem Ableben des Kindes und dem Einsammeln der Status-Info durch den Init-Prozess. Das ist unabhängig von irgendwelchen Einstellungen in %SIG.

Etwas anderes ist es, wenn der Vater lange läuft und waitpid für seine verschiedenen Kinder vergisst. Dabei entstehen länger lebende Zombies. In diesem Fall hilft unter Linux $SIG{CHLD}='IGNORE'. Unter vielen anderen Unices funktioniert das aber auch nicht. Das bedeutet nämlich eigentlich nur, Du bist nicht interessiert an dem Signal, nicht dass Du die Status-Info selbst nicht brauchst.

View full thread fork - wie vermeide ich zombies, wenn child länger als der parent läuft?