Heim > Artikel > Backend-Entwicklung > Warum erzeugt meine „fork()“-Schleife mehr Ausgabe als erwartet?
Bedenken Sie den folgenden Codeausschnitt:
<code class="c">#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; }</code>
Bei der Ausführung gibt dieses Programm überraschenderweise eine Ausgabe aus 8 Punkte statt der erwarteten 6. Wie ist das möglich?
Um die unerwartete Ausgabe zu verstehen, müssen wir uns mit den Feinheiten des fork()-Grundelements befassen. Wenn fork() aufgerufen wird, erstellt es eine nahezu perfekte Kopie des aktuellen Prozesses. Der bemerkenswerteste Unterschied (für die meisten Zwecke) sind die unterschiedlichen Rückgabewerte für die übergeordneten und untergeordneten Prozesse. Der bereitgestellte Code ignoriert jedoch diese Rückgabewerte, wodurch diese Unterscheidung praktisch irrelevant wird.
Zunächst existiert ein einzelner Prozess. Anschließend wird ein zweiter Prozess erstellt, der dazu führt, dass zwei Prozesse einen Punkt drucken und die Schleife fortsetzen. Bei der zweiten Iteration erstellt jeder Prozess erneut eine Kopie, was zu vier Prozessen führt, die einen Punkt drucken und dann beendet werden. Dies erklärt die ersten sechs Punkte.
printf() verwendet jedoch Ausgabepufferung. Daher ist der durch die beiden Prozesse gedruckte Anfangspunkt nicht sofort sichtbar. Diese Punkte bleiben gepuffert und werden während fork() dupliziert. Erst wenn ein Prozess beendet wird, werden die gepufferten Punkte gelöscht und erscheinen. Somit ergeben vier Prozesse, die einen gepufferten Punkt zusammen mit einem neuen Punkt ausgeben, die unerwartete Ausgabe von 8 Punkten.
Um dieses Verhalten zu unterdrücken, fflush(stdout); kann nach jeder printf()-Anweisung aufgerufen werden und sorgt so dafür, dass die Punkte sofort angezeigt werden.
Das obige ist der detaillierte Inhalt vonWarum erzeugt meine „fork()“-Schleife mehr Ausgabe als erwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!