2016-04-08 7 views
8
#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1; 
    fork(); 
    exit(0); 
} 

Die fork wird, nachdem sie in cout Streaming befindet, aber dieser Code druckt 11. Warum? Und warum druckt der Code nur 1, wenn std::endl zu cout hinzugefügt wird?Warum führt fork() zu einer doppelten Ausgabe?

#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1 << std::endl; 
    fork(); 
    exit(0); 
} 
+8

Puffer werden zweimal gespült, in zwei Prozessen. Mann, das muss nervig sein. –

+1

Leider funktionieren C++ - Objekte nicht gut mit Forking. Im Grunde wird das Objekt effektiv kopiert, ohne es zu kopieren, und dies umgeht eine Menge Schutz, der von C++ aufgebaut wird. – SergeyA

+0

Ich kann mir nur vorstellen, wie verheerend ein 'fork()' auf Standardcontainern wirken würde. Tu das einfach nicht. –

Antwort

12

Es wird durch Stream-Pufferung verursacht. Wenn Sie std::endl in den Stream einfügen, wird dieser gelöscht. Wenn Sie also forkieren, ist der Stream-Puffer leer. Wenn Sie std::endl nicht einfügen, wird der Stream nicht bis zum Beenden des Programms gespült. fork() bewirkt, dass der Ausgabestrom dupliziert wird, einschließlich nicht gefüllter Inhalte. Nach dem fork() gibt es 2 Prozesse mit nicht geglätteten Ausgabepuffern, die die '1' enthalten. Sie verlassen beide und spülen ihre Puffer und Sie sehen "11".

Verwandte Themen