为什么使用fork()会导致输出重复?

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

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

在将流输入到cout之后,fork函数被调用,但该代码却打印11。为什么?如果向cout添加std::endl,为什么该代码只打印1?
#include <iostream>
#include <unistd.h>
#include <stdlib.h>

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

8
缓冲区在两个进程中会被刷新两次。哎呀,那一定很烦人。 - Joker_vD
1
不幸的是,C++对象与分叉不兼容。基本上,该对象在没有复制构造的情况下被有效地复制构造,这绕过了C++所构建的许多保护。 - SergeyA
我只能想象 fork() 在标准容器上可能会造成的混乱。千万不要这样做。 - Lightness Races in Orbit
在您撰写问题时,系统提示了重复内容,请注意! - Lightness Races in Orbit
这就是 fork() 的工作方式,它可以是非常有用的行为。它对于设置进程间通信管道至关重要。我不认为它会对标准容器造成破坏。在 fork() 之后,您将拥有两个分离的进程,它们具有相同的内存镜像,但在不同的内存空间中。 - Rob K
1个回答

12
这是由于流缓冲引起的。将std::endl插入到流中会导致其被刷新,因此在执行fork时,流缓冲为空。如果没有插入std::endl,则在程序退出之前,流不会被刷新。fork()会导致输出流被复制,包括未刷新的内容。在fork()之后,有两个进程具有包含'1'的未刷新输出缓冲区。它们各自退出,刷新其缓冲区,然后您会看到"11"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接