Unerwartetes Verzweigungsverhalten von Fork()
Betrachten Sie den folgenden Code, der den Systemaufruf fork() verwendet:
<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 gibt dieses Programm bei der Ausführung 8 Punkte statt der erwarteten 6 aus. Dies Die Diskrepanz erscheint zunächst rätselhaft.
Analyse der Codeausführung
Um dieses Verhalten zu verstehen, müssen wir den Ausführungsprozess Schritt für Schritt aufschlüsseln:
Gepufferte Ausgabe
Der Kern des Problems liegt in der gepufferten Ausgabe von printf(). Wenn ein Prozess gedruckt wird, wird die Ausgabe nicht sofort auf dem Bildschirm angezeigt. Stattdessen wird es in einem Puffer gespeichert. Dieses Verhalten ist von Bedeutung, da der fork()-Systemaufruf den Puffer kopiert, was zu doppelten gepufferten Punkten führt.
Insgesamt 8 Punkte
Wenn die vier Prozesse beendet werden, Ihre gepufferten Punkte werden gelöscht und zu dem ursprünglich gedruckten Einzelpunkt hinzugefügt. Dies führt dazu, dass insgesamt 8 Punkte ausgegeben werden.
Vermeidung des Problems
Um dieses Verhalten zu verhindern, kann man den Ausgabepuffer explizit mit fflush(stdout) danach leeren bei jedem printf()-Aufruf. Dadurch wird sichergestellt, dass die Ausgabe sofort an den Bildschirm gesendet wird, wodurch die Diskrepanz zwischen der Anzahl der Prozesse und der Anzahl der gedruckten Punkte beseitigt wird.
Das obige ist der detaillierte Inhalt vonWarum gibt „fork()' in diesem Code 8 statt 6 Punkte aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!