Unix fork()系统调用的概念

Unix fork()系统调用的概念,unix,operating-system,printf,fork,Unix,Operating System,Printf,Fork,如果对fork()的调用成功执行,Unix将 制作两个相同的地址空间副本,一个用于父地址空间,另一个用于子地址空间。 这两个进程都将在fork()调用后的下一个语句中开始执行。[Ref:] 因此,如果我执行以下代码: #include <stdio.h> int main(void) { printf("Hello\n"); fork(); printf("World\n"); return 0; } 但当我运行程序时,它会打印出来 Hello Wo

如果对fork()的调用成功执行,Unix将 制作两个相同的地址空间副本,一个用于父地址空间,另一个用于子地址空间。 这两个进程都将在fork()调用后的下一个语句中开始执行。[Ref:]

因此,如果我执行以下代码:

#include <stdio.h>
int main(void)
{
    printf("Hello\n");
    fork();
    printf("World\n");
    return 0;
}
但当我运行程序时,它会打印出来

Hello
World
Hello
World

请解释我在哪里缺乏概念?

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


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

奇怪的是,我得到了预期的输出。Hello World我想如果您使用printf(),您就不能得到“Hello World”O/p。如果我错了,请纠正我。您将得到“Hello World”作为输出,我只是简单地复制和编译了代码,得到了同样的结果,这是我所期望的。也检查一下这些..请。每个社区都应该有一个诚实的回答机会,而不会浪费任何人的时间。@Gilles删除了我提到的使用终端输入刷新终端输出。我仍然认为这是值得一提的。
fflush
当然,它也很管用。它只是更花哨。我不明白是什么让它更“花哨”.
fflush
的优点是更简单且始终有效。只有在阅读终端输入时才使用终端输入,这通常不是事实。@Gilles,我的想法是OP是一个初学者,因此不熟悉广泛的系统调用。我想用简单的术语回答,这样他就不必担心了钻研新文档。终端I/O是大多数人的起点。
Hello
World
Hello
World