Prozess-Familie in C (Fork)?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Lies doch mal die Dokumentation von fork(), oder was ist Deine eigentliche Frage?

Wenn ich einen PRozess forke(), dann gibt es eine 'idente' Kopie, die Kopie wird dabei Kind. Wenn ich mehrfach forke, bekomme ich mehrere Kinder.

Kinder können selbst wieder forken, sodaß sie Kinder und der Elternprozess quasi Enkel erhält.


Whataboutno08 
Fragesteller
 27.10.2022, 20:13

Das weiß ich. Was ich nicht weiß wie du ein Programm schreibst dass eine Prozessfamilie erzeugt (wo vorher definiert ist wie viele Kinder welcher Elternprozess hat -> wie zb oben im Bild dargestellt) Im Terminal sollen sich durch printf neu-erzeugte Prozesse dann entsprechend mit ihrer Prozess-ID und der Prozess-ID der Eltern melden. Im Terminal hast du dann bspws 10 Lines Code geprinted (10 Prozesse wurden erzeugt). Aus den PID‘s und PPID‘s der Ausgaben ergibt sich dann der Prozessfamilien-Baum. Nur finde ich es enorm schwer vorgegebene Prozessfamilien in Code zu erzeugen. Also zb Elternprozess1 hat 4 Kindprozesse, wovon jeder Kindprozess wieder genau 2 Kindprozesse hat. Vielleicht wurde jetzt etwas deutlicher wo ich auf dem Schlauch stehe :)

0
KarlRanseierIII  27.10.2022, 20:48
@Whataboutno08

Naja, wenn DU c KInder haben willst, dann führst Du genau c mal einen fork durch. Wenn der fork() eine 1 zurückliefert bist Du im Kindsprozess und forkst dann d mal, usw. usf. .

for (int i=0;i<4;++i) {
    pid_t r=fork();
    if (r==1) { /* child */
       /+ DO more forks for grandhcildren */
      /* do work */
      exit(); 
    }
}
/* parent reaches this point nd goes on with life */

P.S.: Fehlerprüfung und -behandlung sollte natürlich auch durchgeführt werden ....

1
iQa1x  27.10.2022, 21:00
@Whataboutno08

fork erzeugt genau einen Kindprozess (das Programm läuft danach in 2 Prozessen) und gibt dessen Identifier (im Elternprozess) oder 0 im Kindprrozess zurück. Du musst also den Rückegabewert prüfen, um zu schauen, ob du jetzt der Eltern- oder Kindprozess bist. Im Elternprozess kannst du ggf. dann auch nochmal fork aufrufen, um einen weiteren Prozess auf gleichen Ebene zu erzeugen, oder du rufst im Kindprozess fork auf, um von diesen wieder einen Kindprozess zu erzeugen.

Da der Speicher beim fork kopiert wird, kannst du vor dem fork passend Variablen setzen, die du dann im Kindprozess auswertest, um zu wissen, welche Ebene das jetzt ist und was der Prozess danach tun soll.

2
iQa1x  27.10.2022, 21:03
@KarlRanseierIII

Meiner Meinung nach if (r==0), weil fork liefert 0 im Child oder die PID des Childs im Parent

2
KarlRanseierIII  27.10.2022, 21:06
@iQa1x

JA, richtig, ich war irgendwie zu init abgebogen :-D.

Vielleicht noch als Nachtrag, so synthetische Erzeugung von Prozessbäumen hat ja nichts mit der Realität zu tun.

In der Regel erzeugst Du Kinder, mancher werden auch ei exec ausführen, aber ganze Prozessfamilien direkt erzeugen wäre ungewöhnlich.

Die wachsen, wie normale Familien auch :-D.

1
Whataboutno08 
Fragesteller
 27.10.2022, 22:11
@KarlRanseierIII

Vielen Dank für eure Hilfe.

Ich habe jetzt immerhin schonmal ein Ein Elternteil das genau 4 Kinder hat erschaffen. Nur bekomme ich es nicht hin dass die 4 Kinder genau jeweils 2 Kinder haben.

https://prnt.sc/oLrqJ6_Qml-N -> mein code (nicht immer ganz eingerückt, sorry dafür ;) )

https://prnt.sc/OU4B2S0GfiLz -> meine Ausgaben

wüsstet ihr vielleicht wie die Kinder 1078-1081 nochmal genau 2 Kinder bekommen und ich mir das auf der Konsole printen lassen kann?

0
KarlRanseierIII  27.10.2022, 23:06
@Whataboutno08

Ich sehe da mehrere Fehler. Der Elternprozess sollte erst NACH der Schleife ein wait() ausführen., ein Kind darf den If-Zweig nicht verlassen.

Mache Dir immer klar, ein fork() ist ein Klonen des Prozesses, wobei beide Kopien hinter dem fork() direkt weiterlaufen. Deswegen müssen wir Kind und Eltern anhand der Rückgabe unterscheiden und für sie verschieden Codepfade erzeugen.

if (!id){
     print ....
     sleep
     /*grandchildren */
     exit(); /* Wichtig!, hier endet das Kind. */
}

Das gespawnte Kind soll nicht in den gleichen Codepfad wie der Elternprozess laufen.

1

https://www.geeksforgeeks.org/fork-system-call/

Du kannst dir in einer Variabel merken, wie oft du geforkt hast, und dann nach dem zweiten mal aufhören.

Woher ich das weiß:Studium / Ausbildung – Informatik