fork() und Zombies
-
Hi,
Ich habe jetzt den ganzen Abend mit fork() rumgespielt und hab jetzt aber noch ein paar Unklarheiten, bei denen ihr mir hoffentlich weiterhelfen könnt.
1.) Ein Zombie-Prozess ist ein Prozess dessen Vaterprozess noch nicht sein Beendigungssignal abgerufen hat.
Beispiel:
C-Code:
p = fork(); if (p == 0) { /* im Child-Prozess */ childtuirgendetwas; exit(0); } Vatertuirgendetwas; exit(0);
Nehmen wir an, die Vatertuirgendetwas Procedur dauert viel länger als die Chiltuirgendetwas-Procedur! Dann ist es doch so:
Solange die Vatertuirgendetwas-Procedur noch läuft, erscheint der Child-Process als Zombie im ps-Programm.Okay, die Antwort daruf müsste sein: Weil der Vaterprozess den Beendigungstatus von seinem Child noch nicht abgerufen hat: Wie sähe dieses abrufen denn aus?
Und dann noch etwas zu wait():
int a; p = fork(); if (p == 0) { childtuirgendetwas; exit(0); } wait(&a); tuauchirgendetwas();
Hier ist es nun so, dass childtuirgendetwas zuerst ausgeführt wird und erst wenn exit(0) im Childprocess aufgerufen wurde, die vatertuirgendetwas-Procedure ausgeführt wird. Der Grund dafür ist dann wohl dieses wait(&a). Ich habe versucht mich bzgl. wait über die Manpages zu erkundigen, allerdings steht da nur eine lange Tabelle, die sich mit allen möglichen Shell-Befehlen befasst...
Also kann ich hier nur raten: wait(&a) wartet solange bis der Childprocess beendet ist (wenn ja, welcher? Es kann ja mehrere geben!) und schreibt sein Beendigungssignal an die Adresse von a?Okay, das wärs schon! Ich danke vielmals für Antworten!
Gute Nacht!
-
Hansi87 schrieb:
Wie sähe dieses abrufen denn aus?
zB wie der wait-Aufruf in deinem zweiten Beispiel
Ich habe versucht mich bzgl. wait über die Manpages zu erkundigen, allerdings steht da nur eine lange Tabelle, die sich mit allen möglichen Shell-Befehlen befasst...
wait(1) ist ein builtin-shellutil. Was du suchst ist man: wait(2)