Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Fork() -Ausgaben und Process tree » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Fork() -Ausgaben und Process tree
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Joker92
Grünschnabel


Dabei seit: 12.06.2016
Beiträge: 1

Fork() -Ausgaben und Process tree Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
12.06.2016 17:47 Joker92 ist offline E-Mail an Joker92 senden Beiträge von Joker92 suchen Nehmen Sie Joker92 in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg

RE: Fork() -Ausgaben und Process tree Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
14.06.2016 11:21 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Fork() -Ausgaben und Process tree