2016-04-08 17 views
8

Il fork si trova dopo lo streaming in cout, ma questo codice viene stampato 11. Perché? E perché il codice stampa solo 1 se std::endl viene aggiunto a cout?Perché fork() genera un output duplicato?

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

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

I buffer vengono svuotati due volte, in due processi. Uomo, deve essere fastidioso. –

+1

Sfortunatamente, gli oggetti C++ non giocano bene con il biforcarsi. Fondamentalmente, l'oggetto viene effettivamente copiato senza copiarlo, e questo elude molta protezione costruita da C++. – SergeyA

+0

Posso solo immaginare lo scompiglio che un fork() 'potrebbe provocare su contenitori standard. Basta non farlo. –

risposta

12

È causato dal buffer del flusso. L'inserimento di std::endl nel flusso provoca il suo svuotamento, pertanto quando si esegue il fork, il buffer del flusso è vuoto. Quando non si inserisce std::endl, lo stream non viene svuotato fino all'uscita dal programma. fork() causa la duplicazione del flusso di output, incluso il contenuto non scaricato. Dopo lo fork() ci sono 2 processi con buffer di uscita senza riempimento contenenti il ​​'1'. Ognuno di loro esce, lavando i buffer e si vede "11".