Fork-and-Join-Pattern mit fork und wait
Content |
In der Vorlesung sind die Systemaufrufe fork und wait vorgestellt worden, mit denen das Fork-and-Join-Pattern umgesetzt werden kann. Folgendes Beispiel zeigt, wie ein einzelner Kindprozess erzeugt wird, der mit einem zufälligen Exit-Code endet und wie der Eltern-Prozess anschließend darauf wartet, dass der Kindprozess beendet ist:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t child, pid; int stat; child = fork(); if (child == -1) { perror("unable to fork"); exit(1); } if (child == 0) { /* child process */ srand(getpid()); exit(rand()); } /* parent process */ pid = wait(&stat); if (pid == child) { if (WIFEXITED(stat)) { printf("exit code of child = %d\n", WEXITSTATUS(stat)); } else { printf("child terminated abnormally\n"); } } else { perror("wait"); } }
Aufgabe
Passen Sie das Beispiel so an, dass
-
nicht nur ein Kindprozess erzeugt wird, sondern 10,
-
der i-te Kindprozess als Exitcode i zurückgibt und
-
im Elternprozess die Summe der Exit-Codes berechnet wird.
Hinweise:
-
Auf Fehler sollten Sie dabei wie gehabt reagieren.
-
Wenn ein Kindprozess erfolgreich terminiert, ist der Exit-Code nicht mehr auszugeben, sondern nur noch aufzusummieren.
-
Der Systemaufruf wait liefert -1 zurück, wenn es keine weiteren Kinder mehr gibt. Entsprechend kann wait solange aufgerufen und bearbeitet werden, solange das Resultat nicht negativ ist.
Bitte lassen Sie Ihr Programm auf einem der PCs im E.44 laufen und auf keinen Fall auf unseren Servern (Theon, Thales).