fork()-Bifurkationsdilemma
Im Bereich der Multiprozessprogrammierung ist die Funktion fork() oberstes Gebot. Allerdings kann sein Verhalten den Uneingeweihten manchmal verwirren. Betrachten Sie den folgenden Code:
<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 nicht wie erwartet 6 Punkte aus, sondern erstaunliche 8 Punkte. Wie ist das möglich?
Eintauchen in den Abgrund von fork()
Die Antwort liegt in der komplizierten Funktionsweise von fork(). Diese Funktion erstellt im Wesentlichen ein nahezu perfektes Duplikat des aktuellen Prozesses, einschließlich seines Speichers und der Deskriptoren offener Dateien. Der Hauptunterschied besteht im Rückgabewert, der zwischen übergeordneten und untergeordneten Prozessen unterschiedlich ist.
In unserem Beispiel erstellt der anfängliche Prozess einen zweiten Prozess durch den ersten fork(). Beide Prozesse drucken dann einen Punkt, bevor sie erneut eine Schleife und eine Verzweigung durchlaufen. Nach dem zweiten fork() gibt es vier Prozesse, von denen jeder vor dem Beenden einen Punkt ausgibt. Somit können wir sechs Punkte berücksichtigen.
Allerdings wird die Darstellung durch die verborgene Natur von printf() dicker. Standardmäßig puffert printf() seine Ausgabe und verzögert so die tatsächliche Anzeige. Dadurch bleibt der erste Punkt, der vor dem ersten fork()-Aufruf gedruckt wird, unsichtbar. Dieser versteckte Punkt ergibt zusammen mit den vier gepufferten Punkten des übergeordneten Prozesses und der drei untergeordneten Prozesse nach dem zweiten fork() die Endsumme von 8 Punkten.
Um das gepufferte Labyrinth zu vermeiden
Um dieses Verhalten zu umgehen und sicherzustellen, dass printf() sofort ausgegeben wird, kann die Funktion fflush(stdout) nach jedem printf()-Aufruf verwendet werden. Dadurch wird das Schreiben der gepufferten Ausgabe erzwungen, wodurch verhindert wird, dass Punkte im Schatten verschwinden.
Das obige ist der detaillierte Inhalt vonWarum druckt dieses C-Programm bei Verwendung von fork() 8 statt 6 Punkte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!