gpt4 book ai didi

C 奇怪的异常,写入文件时(写入标准输出时正常工作)

转载 作者:太空狗 更新时间:2023-10-29 14:58:04 26 4
gpt4 key购买 nike

我是 C 的新手,所以请多多包涵。我为此苦苦挣扎了很长时间,我很难缩小错误原因的范围。

我注意到当 fork 进程和写入文件时(只有原始进程写入文件)发生了奇怪的事情,输出几乎乘以 fork 的数量,很难解释,因此我做了一个小测试代码您可以在哪里运行,它会重现问题。

#include <stdio.h>
#include <stdlib.h>


void foo()
{
FILE* file = fopen("test", "w");
int i=3;
int pid;
while (i>0)
{
pid=fork();
if(pid==0)
{
printf("Child\n");
exit(0);
}
else if(pid > 0)
{
fputs("test\n", file);
i=i-1;
}
}

}

int main()
{
foo();
exit(EXIT_SUCCESS);
}

按原样编译并运行一次,并使用 file=stdout 编译并运行一次。写入 stdout 时,输出为:

testtesttest

但是当写入文件时输出是:

testtesttesttesttesttest

此外,如果您添加索引并将 i 更改为更大的数字,您可以看到某种模式,但这对我没有帮助。

坦率地说,我不知道为什么会发生这种情况,也不知道如何解决。但我完全是 C 语言的新手,所以对于所有这一切可能只有一个正常的逻辑解释 =)。

感谢您的宝贵时间和答复。

最佳答案

stdout 通常是无缓冲的或行缓冲的;其他文件通常是 block 缓冲的。您需要在 fork() 之前 fflush() 它们,否则每个 child 都会刷新自己的缓冲区副本,从而导致这种乘法。

关于C 奇怪的异常,写入文件时(写入标准输出时正常工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6239226/

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