一尘不染

fork()和输出

linux

我有一个简单的程序:

int main()
{
    std::cout << " Hello World";
    fork();
}

程序执行后,我的输出是:Hello World Hello World。为什么会发生这种情况而不是一次发生Hello world?我猜想子进程会在后台重新运行,并且输出缓冲区在进程之间或沿这些进程的东西之间共享,但是是这种情况还是正在发生其他情况?


阅读 251

收藏
2020-06-02

共1个答案

一尘不染

这与您最初的想法完全不同。输出缓冲区不是共享的-执行fork时, 两个进程都会获得同一缓冲区的副本
。因此,在分叉之后,两个进程最终都会刷新缓冲区并将内容分别打印到屏幕上。

仅是因为cout是缓冲的IO 。如果使用了cerr(未缓冲),则应该只看到一次该消息,即前叉。

2020-06-02