„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum erzeugt die einfache fork()-Schleife acht statt zwei Punkte?

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

Veröffentlicht am 12.11.2024
Durchsuche:113

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:

#include 
#include 
#include 

int main(void)
{
    int i;
    for(i = 0; i 

Ü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, schauen wir uns die Funktionsweise von fork() an. 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, empfiehlt sich ein Aufruf flush(stdout); nach jeder printf()-Anweisung. Dies erzwingt, dass die Ausgabe sofort gesendet wird, um sicherzustellen, dass die erwartete Anzahl von Punkten angezeigt wird.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3