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.
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