我试图理解叉子,并尝试在C中跟随:
#include<stdio.h>
#include <unistd.h>
void forker()
{
printf("%d: A\n",(int)getpid());
fork();
wait();
printf("%d: B\n",(int)getpid());
printf("%d: C\n",(int)getpid());
fork();
wait();
printf("%d: D\n",(int)getpid());
}
int main(void)
{
forker();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行结果a.out时,这是我观察到的:
> ./a.out
3560: A
3561: B
3561: C
3562: D
3561: D
3560: B
3560: C
3563: D
3560: D
Run Code Online (Sandbox Code Playgroud)
但是,当我执行以下操作时:
> ./a.out > t.txt
Run Code Online (Sandbox Code Playgroud)
奇怪的事发生在:
> cat t.txt
3564: A
3565: B
3565: C
3566: D
3564: A
3565: B
3565: C
3565: D
3564: A
3564: B
3564: C
3567: D
3564: A
3564: B
3564: C
3564: D
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这种行为吗?为什么重定向到文件时输出会有所不同?
我使用的是Ubuntu 10.10,gcc版本4.4.5.
mah*_*mah 10
发生这种情况的原因是数据缓冲.在fork()时,在指向文件的情况下,你的输出还没有被刷新...所以父和子现在都有未完成的输出缓冲区.
fflush(stdout);在每个之前拨打电话fork();来解决此问题.