一般快速fork()说明

时间:2013-12-02 16:16:50

标签: c fork

假设我们有这样的事情:

printf("A");
fork();
printf("B");

输出是

1)ABAB  2)ABB

你能解释一下吗?

4 个答案:

答案 0 :(得分:4)

正确的答案是它取决于stdout的缓冲模式,其他答案似乎忽略了。

当您使用未刷新的缓冲区进行fork时,然后在两个进程中继续使用stdio(而不是子进程中通常的快速execve_exit),当时缓冲区中的内容可以打印两次叉子,每次打印一次。

答案 1 :(得分:1)

未定义且ABBABABAABB是可能的。第一个(ABB)只能在无缓冲输出上发生;使用缓冲输出,两个进程的输出缓冲区中都会有A。通过在fflush(3)之前调用fork(2),您可以强制执行此行为。

最后一个字符的顺序取决于执行的顺序;很可能你会得到ABAB,因为在这个简短的例子中,程序不会被调度程序中断。

答案 2 :(得分:0)

输出应显示为“ABB” fork将整个程序复制到一个新的内存空间并从fork继续。由于两个进程都运行相同的代码,我将保存从fork返回的进程ID,因此程序的其余部分知道该怎么做。

答案 3 :(得分:0)

输出只是abb。 fork创建一个新的子进程,因此在执行fork()之后,两个进程将运行并且一般子进程首先获得执行的机会。在fork之前只看到一个进程,所以在fork之前只输出一次A.然后fork执行,因此现在运行的两个不同的进程将打印B,因此输出是ABB。