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

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

fork được đặt sau khi phát trực tiếp vào cout, nhưng mã này in 11. Tại sao? Và tại sao mã chỉ in 1 nếu std::endl được thêm vào cout?Tại sao fork() dẫn đến kết quả trùng lặp?

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

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

Bộ đệm được xả hai lần, trong hai quy trình. Người đàn ông, điều đó phải gây phiền nhiễu. –

+1

Thật không may, các đối tượng C++ không chơi tốt với chế độ forking. Về cơ bản, đối tượng được sao chép một cách hiệu quả mà không cần sao chép-xây dựng nó, và điều này phá vỡ rất nhiều bảo vệ được xây dựng bởi C + +. – SergeyA

+0

Tôi chỉ có thể tưởng tượng sự tàn phá của một 'fork()' sẽ làm hỏng các thùng chứa tiêu chuẩn. Chỉ cần không làm điều này. –

Trả lời

12

Điều này gây ra do tải luồng. Chèn std::endl vào luồng làm cho nó bị xóa, vì vậy khi bạn ngã ba, bộ đệm luồng trống. Khi bạn không chèn std::endl, luồng sẽ không bị xóa cho đến khi thoát chương trình. fork() làm cho luồng đầu ra bị trùng lặp, bao gồm cả nội dung chưa được xóa. Sau khi fork() có 2 quy trình với bộ đệm đầu ra chưa được đệm chứa '1'. Họ từng thoát, xả bộ đệm của họ và bạn thấy "11".

Các vấn đề liên quan