如果成功执行对fork()的调用,Unix将会执行 制作两个相同的地址空间副本,一个用于父级,另一个用于子级。 两个进程将在fork()调用之后的下一个语句处开始执行。[Ref:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html]。
所以,如果我执行以下代码:
#include <stdio.h>
int main(void)
{
printf("Hello\n");
fork();
printf("World\n");
return 0;
}
我认为它会打印
Hello
World
World
但是当我运行该程序时,它会打印
Hello
World
Hello
World
请解释我缺乏概念的地方?
答案 0 :(得分:2)
这是关于缓冲。当您打印“hello”时,它不会立即输出。相反,它会进入缓冲区。它在fork期间仍然存在,因此,当每个任务终止并刷新其缓冲区时,有两个副本要发送到输出。
要解决此问题,您可以在fork之前指定无缓冲的I / O或调用fflush
以刷新缓冲区。