gpt4 book ai didi

c - Linux 中的 fork() 行为

转载 作者:太空狗 更新时间:2023-10-29 17:16:59 25 4
gpt4 key购买 nike

我试图理解 fork ,并尝试在 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;
}

当我编译并运行结果 a.out 时,这是我观察到的:

> ./a.out
3560: A
3561: B
3561: C
3562: D
3561: D
3560: B
3560: C
3563: D
3560: D

但是当我执行以下操作时:

> ./a.out > t.txt

奇怪的事情发生了:

> 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

有人可以解释一下这种行为吗?为什么重定向到文件时输出不同?

我使用的是 Ubuntu 10.10,gcc 版本 4.4.5。

最佳答案

发生这种情况的原因是数据缓冲。在 fork() 时,在定向到文件的情况下,您的输出还没有被刷新...所以现在父级和子级都有未完成的输出缓冲区。

在每个 fork(); 之前调用 fflush(stdout); 来解决这个问题。

关于c - Linux 中的 fork() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8255388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com