2017-10-22 2 views
0
#include <stdio.h> 
#include <unistd.h> 
int main(void) { 
    int i = 0; 
    for (i = 0; i < 4; i++) { 
    fork(); 
    printf("foo\n"); 
    } 
    return 0; 
} 

Dies druckt "foo" 30 Mal. Warum?Wie funktioniert fork() hier in diesem C-Programm?

Und warum druckt es "foo" 64 mal, wenn Sie die Ausgabe pipe?

$ ./a.out | wc -l 
64 
+0

Haben Sie schon versucht? – Scheff

+0

Denken Sie daran, dass nach 'fork()' zwei Prozesse mit denselben Werten in Variablen existieren. Daher sollte in jeder Iteration der Schleife die Anzahl der Prozesse verdoppelt werden. Das ist 2 + 4 + 8 + 16 = 30. Ich würde 30 'foo's Ausgabe erwarten. Habe ich recht? (Natürlich nehme ich an, dass keiner der 'fork()' s fehlschlägt ...) – Scheff

+0

Interessant. Ich erhalte andere Ergebnisse, wenn ich nur auf das Terminal drucke und es in eine Datei oder ein Programm wie less oder wc -l lege. Ich bekomme 64 in wc -l. –

Antwort

1

Wenn Sie fork() aufrufen, wird alles dupliziert. Sie werden also in jeder Iteration verdoppeln. Deshalb druckt es 2 + 4 + 8 + 16 = 30 Mal. Dies kann leicht festgestellt werden, wenn Sie den Wert i zusammen mit dem PID für den Prozess drucken.

Wie mch sagte, Piping ändert den Ausgabepuffer von Zeile gepuffert zu voll gepuffert, so verdoppelt Gabel auch den Pufferinhalt. Deshalb erhalten Sie 64 Ausdrucke.

Verwandte Themen