Heim  >  Artikel  >  Backend-Entwicklung  >  Warum gibt „fork()' in diesem Code 8 statt 6 Punkte aus?

Warum gibt „fork()' in diesem Code 8 statt 6 Punkte aus?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-03 17:32:30281Durchsuche

Why Does `fork()` Output 8 Dots Instead of 6 in This Code?

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:

  1. Ausgangszustand: Es gibt einen einzelnen Prozess wird ausgeführt.
  2. Erste Iteration: Der Prozess verzweigt sich und erstellt einen untergeordneten Prozess mit einem separaten Speicherbereich. Sowohl das übergeordnete als auch das untergeordnete Element drucken einen Punkt.
  3. Zweite Iteration: Sowohl das übergeordnete als auch das untergeordnete Element verzweigen sich erneut, wodurch insgesamt vier Prozesse entstehen. Jeder druckt einen Punkt.
  4. Prozessbeendigung: Alle vier Prozesse werden beendet, aber die gepufferten Punkte aus früheren Druckvorgängen bleiben im Ausgabepuffer.

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!

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