Fork() -Ausgaben und Process tree

Neue Frage »

Auf diesen Beitrag antworten »
Joker92 Fork() -Ausgaben und Process tree

Meine Frage:
Ich habe leider Schwierigkeiten die Ausgaben und den Fork-process-tree zu ermitteln (zumindest bin ich mir sehr unsicher).

Code:
int main(void){
if(fork()> 0){
printf
("c");
waitpid
(-1,NULL,0);}
else{
printf
("b");
exit(0);
}
printf
("a");
exit
(0);
}

Meine Ideen:
Ich habe das jetzt so verstanden:

Falls es ein Kindprozess gibt, wird "c" ausgegeben und der Elternprozess wartet solange die Kindprozesse aktiv sind.

Sonst wird "b" ausgegeben und der Prozess beendet.

Zum schluss wird noch einmal "a" ausgegeben und das Programm beendet.

Folglich:

c---->b---->a
|
b---->a
 
Auf diesen Beitrag antworten »
as_string RE: Fork() -Ausgaben und Process tree

Hallo

Du solltest versuchen, den Code etwas formatiert hier rein zu stellen. Dafür gibt es den Knopf mit dem Nummernzeichen über der Texteingabe. Das sieht dann etwa so aus:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
int main(void) {
    if(fork() > 0) {
        printf("c");
        waitpid(-1,NULL,0);
    }
    else {
        printf("b");
        exit(0);
    }
    printf("a");
    exit(0);
}


Was meinst Du mit "Falls es einen Kindprozess gibt"? fork() startet ja einen Kindprozess und wenn kein Fehler dabei auftritt, dann existiert der ja auch.
Sobald Du fork() in einem Programm aufrufst, wird ein Kindprozess aufgebaut der dem Vaterprozess (fast) entspricht. Weil Du aber ja normalerweise im Kindprozess etwas anderes nach dem fork() machen willst, als im Vaterprozess, musst Du dir Möglichkeit haben heraus zu finden, ob Dein Programm gerade im Kind- oder Vaterprozess weiter läuft, was Du ja sonst nach dem fork() sowohl als auch hast.
Das kannst Du mit dem Rückgabewert von fork() herausfinden (hier von Wikipedia):
Zitat:
An dem Rückgabewert von fork() wird erkannt, in welchem Prozess man sich befindet. Liefert fork() eine 0 zurück, kennzeichnet dies den Kindprozess, im Elternprozess wird die PID des Kindes zurückgeliefert.

Und genau das macht das if(fork() > 0) in der ersten main()-Zeile. Wenn diese Bedingung true ist, also fork() einen Wert zurück geliefert hat, dann ist es offensichtlich der Vaterprozess, wenn es false ist, ist es der Kindprozess (oder aber der Vaterprozess und der fork() ist gescheitert, aber dieser Fehlerfall soll in Deinem Beispiel wohl nicht weiter betrachtet werden.)

Folge ist also: der "if"-Teil wird nur ausgeführt, wenn es der Vaterprozess ist, gleichzeitig wird der "else"-Teil aber vom Kindprozess ausgeführt. Der Vaterprozess gibt also c aus und wartet dann, bis der eben abgespaltete Kindprozess sich beendet (das macht das waitpid()). Erst danach geht er weiter, kommt aus dem if raus und gibt dann noch ein a aus, bevor er sich selbst auch beendet.
Der Kindprozess läuft in das else rein, gibt dort ein b aus und beendet sich.
Du hast also die Ausgabe von c und b fast gleichzeitig, welches zuerst ausgegeben wird ist eher Zufall, weil es von zwei verschiedenen Prozessen ausgegeben wird. Du kannst mal die eine und mal die andere Reihenfolge haben.
Erst danach wird aber das a vom Vaterprozess ausgegeben, weil der ja auf das Ende des Kindprozesses gewartet hat.

Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »