ein Kapitel zurück                                           ein Kapitel weiter

Ein Problem bei fork() kann z.B. die Pufferung darstellen wenn man nicht weiß wie man damit umzugehen hat. Testen sie z.B. folgendes Programm.......

/*Download:forkig1.c*/
#include <sys/types> #include <stdio.h> int main() { pid_t pid; printf("Hallo fork()\n"); switch(pid=fork()) { case -1: printf("Fehler bei fork().....\n"); exit(0); case 0 : printf("Ich bin das Kind\n"); break; default: printf("Ich bin der Elternprozess\n"); break; } exit(0); }

Das Programm dürfte etwa folgende Ausgabe machen......

Hallo fork()
Ich bin der Elternprozess
Ich bin das Kind  

Auf dem ersten Blick scheint das OK zu sein. Aber müsste vor dem Kindprozess nicht auch die Ausgabe....

Hallo fork()  

...stehen?

Normalerweise schon aber da printf mit Puffern arbeitet gilt folgendes....

  • Bei Ausgabe auf ein Terminal findet Zeilenpufferung statt
  • Bei Ausgaben die nicht auf ein Terminal eingestellt sind wie in unserem Beispiel beim Kindprozess, regiert die Vollpufferung.
  • Und Vollpufferung heißt das erst geschrieben wird wenn der Puffer voll wird (in unserem Fall eine Ausgabe auf dem Bildschirm). Sie können ja mal als Beweis dazu die Ausgabe Umleiten....



forkig1 > temp  

In diesem Fall bietet sich an was ich bei dem Kapitel write schon kurz angesprochen habe ganz auf Pufferung zu verzichten. Dies würde in etwas so aussehen......

write(stdout, text, strlen(text));  

Umgeschrieben auf unser Programmbeispiel oben hätten wir dann.....

/*Download:forkig2.c*/
#include <sys/types> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { pid_t pid; char text[] = "Hallo fork()\n"; write(STDOUT_FILENO, text, strlen(text)); switch(pid=fork()) { case -1: printf("Fehler bei fork().....\n"); exit(0); case 0 : printf("Ich bin das Kind\n"); break; default: printf("Ich bin der Elternprozess\n"); break; } exit(0); }

Ich möchte noch Anmerken das die Reihenfolge in der unsere Ausgabe gemacht wird, also zuerst KIND und dann Eltern oder umgekehrt, abhängig vom System ist. Im Kern gibt es einen Algorithmus, einen Scheduler, der dafür verantwortlich ist. Wollen sie dies Beeinflussen müssen sie die beiden Prozesse (Eltern und Kind) synchronisieren. Wir werden noch sehen wie sie das Bewerkstelligen können.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf