Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erzeugt die einfache fork()-Schleife acht statt zwei Punkte?

Warum erzeugt die einfache fork()-Schleife acht statt zwei Punkte?

Susan Sarandon
Susan SarandonOriginal
2024-11-04 02:04:02434Durchsuche

Why does the simple fork() loop produce eight dots instead of two?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn