Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erzeugt meine „fork()“-Schleife mehr Ausgabe als erwartet?

Warum erzeugt meine „fork()“-Schleife mehr Ausgabe als erwartet?

DDD
DDDOriginal
2024-11-04 07:46:31199Durchsuche

Why Does My `fork()` Loop Produce More Output than Expected?

Warum verzweigt fork() mehr 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?

Das Verhalten von fork()

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.

Ausführung verfolgen

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.

Pufferung und verzögerte Ausgabe

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.

Verhindern der unerwarteten Ausgabe

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!

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