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

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

fork位于流入cout后,但此代码打印11. 为什么?为什么代码只打印1,如果std::endl被添加到cout为什么fork()会导致重复输出?

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

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

缓冲区在两个进程中刷新两次。男人,那一定很烦人。 –

+1

不幸的是,C++对象在分叉方面效果不好。基本上,该对象是有效的复制构造而不需要拷贝构造它,并且这避开了C++构建的许多保护。 – SergeyA

+0

我只能想象一下'fork()'会在标准容器上发生什么样的破坏。只是不要这样做。 –

回答

12

这是流缓冲造成的。在流中插入std::endl会导致它被刷新,所以当你分叉时,流缓冲区是空的。如果不插入std::endl,则在程序退出之前,流不会被刷新。 fork()会导致输出流被复制,包括未刷新的内容。在fork()之后,有两个进程的未清除输出缓冲区包含'1'。他们每个出口,冲洗他们的缓冲区,你看到“11”。

相关问题