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

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

Urządzenie fork znajduje się po przesłaniu strumieniowym do cout, ale ten kod drukuje 11. Dlaczego? I dlaczego kod wypisuje tylko 1, jeśli std::endl został dodany do cout?Dlaczego fork() powoduje duplikowanie danych wyjściowych?

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

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

Bufory są przepłukiwane dwukrotnie w dwóch procesach. Człowieku, to musi być denerwujące. –

+1

Niestety obiekty C++ nie grają dobrze z rozwidleniami. Zasadniczo, obiekt jest skutecznie kopiowany-konstruowany bez tworzenia kopii, a to obchodzi dużo ochrony zbudowanej przez C++. – SergeyA

+0

Mogę sobie tylko wyobrazić, że spustoszenie 'fork()' spowoduje spadanie na standardowych pojemnikach. Po prostu tego nie rób. –

Odpowiedz

12

Jest to spowodowane buforowaniem strumieniowym. Wstawienie std::endl do strumienia powoduje jego przepłukanie, więc po rozwidleniu bufor strumienia jest pusty. Jeśli nie wstawisz std::endl, strumień nie zostanie przepłukany, dopóki program nie zakończy pracy. fork() powoduje powielenie strumienia wyjściowego, w tym niezamkniętej zawartości. Po fork() istnieją 2 procesy z niezamkniętymi buforami wyjściowymi zawierającymi "1". Każdy z nich wychodzi, przepłukując swoje bufory i widzisz "11".