假设我们有这样的事情:
printf("A");
fork();
printf("B");
输出是
1)ABAB 2)ABB
你能解释一下吗?
答案 0 :(得分:4)
正确的答案是它取决于stdout的缓冲模式,其他答案似乎忽略了。
当您使用未刷新的缓冲区进行fork时,然后在两个进程中继续使用stdio(而不是子进程中通常的快速execve
或_exit
),当时缓冲区中的内容可以打印两次叉子,每次打印一次。
答案 1 :(得分:1)
未定义且ABB
,ABAB
和AABB
是可能的。第一个(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。