linux中的fork()行为

Sal*_*lil 6 c gcc

我试图理解叉子,并尝试在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();来解决此问题.