Heim >Backend-Entwicklung >C++ >Warum erzeugt die einfache fork()-Schleife acht statt zwei Punkte?
Seltsamer Fall einer unerwarteten Verzweigung in fork()
Betrachten Sie den folgenden Codeausschnitt, der das fork()-Grundelement verwendet, um untergeordnete Prozesse zu erstellen:
<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>
Überraschenderweise liefert die Ausführung dieses Programms acht Ausgabepunkte, sechs mehr, als Sie zunächst erwarten würden. Warum passiert das?
Enthüllung der verborgenen Prozesse
Um dieses Rätsel zu lösen, werfen wir einen Blick auf die Funktionsweise von fork(). fork() erstellt eine Replik des aktuellen Prozesses, was zu einem übergeordneten und einem untergeordneten Prozess führt.
Zunächst gibt es einen einzelnen Prozess, der sich in zwei verzweigt. Beide Prozesse führen die for-Schleife inkrementell aus und geben jedes Mal einen Punkt aus. Bei der zweiten Iteration verzweigt sich jeder Prozess erneut, sodass insgesamt vier Prozesse entstehen. Diese vier Prozesse drucken einen Punkt, bevor sie beendet werden.
Gepufferte Ausgabe und verzögerte Darstellung
printf() puffert jedoch seine Ausgabe, was bedeutet, dass mehrere Ausdrucke gesammelt werden, bevor sie gesendet werden auf einmal. Wenn alle vier Prozesse ihre zweiten Punkte drucken, werden sie gepuffert. Hier entsteht der hinterhältige Effekt.
Bei fork() werden die gepufferten Punkte von den untergeordneten Prozessen geerbt. Wenn also jeder untergeordnete Prozess beendet wird, erscheint sein gepufferter Punkt im Ausgabestream. Das Hinzufügen dieser vier verzögerten Punkte zu den vier inkrementell gedruckten Punkten ergibt die unerwartete Gesamtzahl von acht.
Gepufferte Punkte vermeiden
Um dieses gepufferte Verhalten zu umgehen, ist es ratsam, anzurufen flush(stdout); nach jeder printf()-Anweisung. Dies erzwingt, dass die Ausgabe sofort gesendet wird, um sicherzustellen, dass die erwartete Anzahl von Punkten angezeigt wird.
Das obige ist der detaillierte Inhalt vonWarum erzeugt die einfache fork()-Schleife acht statt zwei Punkte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!