ein Kapitel zurück                                           ein Kapitel weiter

Kommen wir zum nächsten Thema. Wie viele Prozesse glauben werden mit diesem Programm erzeugt?

/*Download:forkig3.c*/
#include <sys/types> #include <stdio.h> #include <unistd.h> int main() { char pid[255]; fork(); fork(); fork(); sprintf(pid, "PID : %d\n",getpid()); write(STDOUT_FILENO, pid, strlen(pid)); exit(0); }

Mit diesem Programm werden also 7 Prozesse erzeugt. Es sind also 8 Prozesse auf einmal am laufen mit dem Elternprozess. Wie kann man sich das nun vorstellen. Fangen wir mit dem 1. fork() - Aufruf an......




Der erste fork() - Aufruf erzeugt also einen Kindprozess. Wichtig das sie wissen das das Kind auch den Instructions Pointer des Elternprozess erbt. Das kann man sich als Zeiger vorstellen der auf die Adresse zeigt wo sich das Programm gerade befindet. Das heißt nach dem ersten fork() - Aufruf, das der Instruktions - Pointer sich im Moment kurz vor dem 2. fork() - Aufruf befindet. Kommen wir zum 2. fork() - Aufruf.......




Sie sehen das sowohl der Elternprozess als auch der Kindprozess neue Prozesse erzeugen bei denen sich der Instruktions Pointer (IP) nun auf dem 3. fork() - Aufruf befindet. Sehen wir uns also noch den 3. fork() - Aufruf an......




Hiermit erzeugen alle 4 laufende Prozesse bei denen sich der IP auf dem 3. fork() - Aufruf befindet weitere 4 Prozesse. Würde jetzt ein 4. fork() - Aufruf folgen so hätten wir dann 15 Prozesse erzeugt. Mit Eltern laufen dann 16. Also 24 (2*2*2*2). Daraus ergibt sich das mit n-fork() - Aufrufen 2n -1 Prozesse erzeugt würden.

Ein weiteres Problem bei fork() kann sein, wenn sie mit dem Elternprozess eine Datei öffnen z.B. zum Schreiben. Wenn sie nun mit fork() einen neuen Kindprozess erzeugen werden ja auch die Filediskriptoren mitvererbt. Wenn jetzt der Kindprozess in die Datei schreiben soll und auch der Elternprozess müssen sie sich um die Synchronisation dieser beiden kümmern (falls dies erwünscht ist). Dies machen sie am einfachsten so in dem der Elternprozess mittels....

wait(&status);  

...auf das Kind wartet. Oder wenn der Kindprozess gar nicht in diese Datei schreiben soll, schließen sie die geöffnete Datei zur Sicherheit. Dies sollte noch in kürze aufzeigen worauf sie bei fork() noch achten sollten. Wir werden fork() in den nächsten Kapitel und später bei der Netzwerkprogrammierung und beim schreiben einer eigenen Shell wiederverwenden.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf