fork()系统调用的概念

时间:2016-08-09 04:37:37

标签: unix operating-system printf fork

如果成功执行对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

请解释我缺乏概念的地方?

1 个答案:

答案 0 :(得分:2)

这是关于缓冲。当您打印“hello”时,它不会立即输出。相反,它会进入缓冲区。它在fork期间仍然存在,因此,当每个任务终止并刷新其缓冲区时,有两个副本要发送到输出。

要解决此问题,您可以在fork之前指定无缓冲的I / O或调用fflush以刷新缓冲区。