2017-03-10 12 views
2

Ich habe ein C++ Programm, das fünf untergeordnete Prozesse erstellt.Unterschiedliches Verhalten von endl und n mit fork()

#include<iostream> 
#include<unistd.h> 
#include<sys/types.h> 
using namespace std; 

int main() 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid==0) 
    { 
     cout<<"Child Process 1"<<endl; 
    } 

    pid=fork(); 
    if(pid==0) 
    { 
     cout<<"Child Process 2"<<endl; 
    } 

    if(pid==0) 
    { 
     pid=fork(); 
     if(pid==0) 
     { 
      cout<<"child process 3"<<endl; 
     } 
    } 

    return 0; 
} 

Die Ausgabe des obigen Programms ist:

Child Process 1 
Child Process 2 
Child Process 2 
child process 3 
child process 3 

Aber das Problem ist, wenn ich \ n anstelle von endl verwenden die Ausgabe

#include<iostream> 
#include<unistd.h> 
#include<sys/types.h> 
using namespace std; 

int main() 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid==0) 
    { 
     cout<<"Child Process 1\n"; 
    } 

    pid=fork(); 
    if(pid==0) 
    { 
     cout<<"Child Process 2\n"; 
    } 

    if(pid==0) 
    { 
     pid=fork(); 
     if(pid==0) 
     { 
      cout<<"child process 3\n"; 
     } 
    } 

    return 0; 
} 

Die Ausgabe des obigen Programms ist anders using \ n ist:

Child Process 1 
Child Process 2 
Child Process 1 
Child Process 2 
Child Process 2 
child process 3 
Child Process 1 
Child Process 2 
child process 3 

Warum ist die Ausgabe für endl und \ n im selben Programm unterschiedlich?

Antwort

2

std::cout druckt Text normalerweise nicht sofort, sondern speichert ihn in einem Puffer. Wenn der Prozess verzweigt wird, wird dieser interne Puffer zusammen mit allem anderen im Prozess kopiert. Eltern und Kind enden mit identischen Puffern.

In Ihrem Beispiel passiert anscheinend, dass der Puffer erst nach dem Forken gespült und auf den Bildschirm gedruckt wird, wahrscheinlich kurz bevor der Prozess endet.

Mit std::endl, dann wird der Puffer unverzüglich als Nebenwirkung gespült, so werden die Inhalte von dem Eltern-Prozess gedruckt, bevor der untergeordnete Prozess eine Kopie erhalten.

+0

Ja, das ist die bessere Antwort der beiden. – Bathsheba

3

Die meisten Betriebssysteme Puffer die Standardausgabe als eine Optimierung.

endl sowie ein Neues-Zeile-Zeichen schreiben, auch Wallungen die Puffer, die im Wesentlichen bedeutet, dass jede Standardausgabe sofort auf die Konsole in die Warteschlange gestellt.

\n spült den Puffer nicht.

Ihr Unterschied in der Ausgabe ist daher auf die Interaktion mit Ihrem Gleichzeitigkeitsmodell zurückzuführen.

+1

Ihre letzte Zeile, obwohl richtig, ist eher undurchsichtig. Es ist besser, darüber zu reden, wie der nicht geglättete Puffer in den neuen Prozess kopiert wird, dann ist alles klar. Christian schrieb eine ausgezeichnete Antwort, aber löschte es sofort :( –

+0

Ja, es ist eine gute Antwort. Gewählt zu undelete. – Bathsheba

+0

@LightnessRacesinOrbit: Danke euch beiden. Ich löschte es nur, weil die Antwort fühlte sich plötzlich etwas unvollständig und mir nicht verifiziert der Moment Ich drückte auf den Senden-Knopf, und ich musste nicht polieren und es überprüfen. Wenn Sie denken, dass es gut ist, lasse ich es natürlich gelöscht. –

Verwandte Themen