我有一个简单的程序:
int main() { std::cout << " Hello World"; fork(); }
程序执行后,我的输出是:Hello World Hello World。为什么会发生这种情况而不是一次发生Hello world?我猜想子进程会在后台重新运行,并且输出缓冲区在进程之间或沿这些进程的东西之间共享,但是是这种情况还是正在发生其他情况?
Hello World Hello World
Hello world
这与您最初的想法完全不同。输出缓冲区不是共享的-执行fork时, 两个进程都会获得同一缓冲区的副本 。因此,在分叉之后,两个进程最终都会刷新缓冲区并将内容分别打印到屏幕上。
这 仅是因为cout是缓冲的IO 。如果使用了cerr(未缓冲),则应该只看到一次该消息,即前叉。