Erstellen von 10 Child-Prozessen
-
Hallo,
ich will ein Programm schreiben, bei dem ein Elternprozess 10 Child-Prozesse erzeugt und dann im nachhinein den Exit-Status der einzelnen Childs abfragt.
mein code:
int main(void) { pid_t elternprozess; static int status, i, pid_number; elternprozess = fork(); for(i = 0; i < 10; i++) { if(elternprozess == 0) // child { printf("Child number %d started. PID = %d PARENT PID %d \n", i+1, getpid(), getppid()); printf("Child exiting. PID = %d \n", getpid()); exit(0); } else if(elternprozess > 0) { elternprozess = fork(); } } sleep(1); for(i = 0; i < 10; i++) { pid_number = wait(&status); printf("CHILD mit PID %d hat sich mit folgendem Exit-Status: %d beendet \n", pid_number, status); } return 0; }
Das erstellen der Child-Funktionen klappt soweit und auch das anschließende beenden, jedoch habe ich bei der for-Schleife die mir den Exit Status ausgibt das Problem, das ich 10 richtige Ausgaben (richtige PiD und exit-Status = 0) und 10 Falsche (PID = -1) erhalte.
Kann mir jemand einen Tipp geben was ich falsch gemacht habe?
mit freundlichen Grüßen,
Jonny
-
Den mal nach, was passiert, wenn in der ersten Schleife i==9 ist: Dann wird geforked, aber das dadurch erzeugte Kind wird nicht exiten, denn die Schleife endet nun. Stattdessen landet das Kind in der wait-Schleife.
PS: Was soll denn das static? Denkst du, das hätte irgendeine Auswirkung auf das fork?
-
So einfach kann es sein..
Das static ist noch von einer Problemstellung aus einem anderen Programm übrig geblieben.
Herzlichen dank für deine Hilfe.
-
Die Variable ausgerechnet "elternprozess" zu nennen ist ziemlich verwirrend.
Spricht irgendwas dagegen, etwas in der Art zu machen?
for (i = 0; i < num_pids; ++i) { pids[i] = fork(); if (pids[i] == 0) exit(0); }
-
ich verstehe nicht warum du am Anfang ein
fork
machst, dann die Schleife startest.Anyway, den Exit-Status von
wait
zu bekommen, macht man mit demWEXITSTATUS
Makropid_number = wait(&status); if(WIFEXITED(status)) printf("CHILD mit PID %d hat sich mit folgendem Exit-Status: %d beendet \n", pid_number, WEXITSTATUS(status)); else printf("CHILD mit PID %d hat nicht normal über exit oder _exit beendet, Exit-Status unbekannt\n", pid_number); }
siehe man: wait(2)