2016-06-29 12 views
2

Eine Frage wurde über aked wie viele A sind nach dem Ausführen des folgenden Code in C zu bedruckenden:A fork() Befehl

int i; 
for (i=1;i<4;i++){ 
    fork(); 
    printf("A"); 
} 

I 14 auf meinem eigenen gezählt. Doch nachdem er die asnwer läuft erwies sich als 24. Später lief ich eine veränderte Version:

int i; 
for (i=1;i<4;i++){ 
     fork(); 
     printf("A\n"); 
} 

Welche 14 A ist gedruckt. Ich würde jemanden lieben, der mir das erklärt.

+0

Da Sie den Rückgabewert von 'fork()' nicht verifizieren, gehe ich davon aus, dass Sie Ihre maximale Anzahl an Prozessen erreicht haben. – marcolz

Antwort

6

Der Grund für die unterschiedliche Anzahl von A's ist die Zeilenpufferung.

Die erste Version druckt keine neue Zeile, daher wird printf nicht wirklich ausgegeben, bis das Programm beendet wird.

Da der Aufruf von fork() den gesamten laufenden Prozess dupliziert, dupliziert er auch die gepufferte Zeile von A's.

Wenn dann jeder Prozess beendet wird, werden seine Puffer zur Ausgabe geleert.

Die zweite Version des Programms leert die Ausgabe mit jedem printf-Aufruf wegen der neuen Zeile und der Tatsache, dass die meisten C-Implementierungen die Puffer auf neuer Zeile leeren, wenn Sie an ein Terminal drucken. (Es ist nicht bündig, wenn Sie den Druck in eine Datei oder Netzwerkbuchse.)

+0

Um Ihr Programm besser vorhersagbar zu machen, rufen Sie 'fflush (stdout);' direkt nach jedem Aufruf von 'printf' auf. Auf diese Weise bleibt nichts mehr im Standard-Ausgabepuffer Ihres Prozesses, wenn Sie zu fork gehen. Dann solltest du wie jedes Mal 14 bekommen. –

0

Dies geschieht aufgrund der Tatsache, dass printf ist Line-gepufferte, dh seine Puffer nur gespült wird ein nach der Begegnung Neue Zeile.

Im zweiten Fall haben Sie ein '\ n' gesetzt, und somit tritt das erwartete Verhalten auf, wenn der Puffer gelöscht wird.

Im ersten Fall

Nach dem ersten fork():

Buffer : A 

Nach zweiter fork():

Buffer : AA 

Nach dritter fork():

Buffer : AAA (3 A's exist in the buffer) 

So endlich, wie Sie 8 pr haben ocesses total, 8 * 3 = 24. Deshalb 24 A's