c-为什么fopen/fprintf没有竞态条件

c-为什么fopen/fprintf没有竞态条件,c,linux,fork,exec,fopen,C,Linux,Fork,Exec,Fopen,我试图模拟一个竞争条件(这是一个正确的术语吗?),以便在之后用信号量修复它 我有一个master.c流程: #包括 #包括 #包括 #包括 int main() { 对于(int i=0;i

我试图模拟一个竞争条件(这是一个正确的术语吗?),以便在之后用信号量修复它

我有一个
master.c
流程:

#包括
#包括
#包括
#包括
int main()
{
对于(int i=0;i<100;++i)
{
如果(fork()==0)
{
char-str[12];
sprintf(str,“%d”,i%10);
execl(“./从”,“从”,str,(char*)0);
}
}
返回0;
}
以及打印到文件中的
slave.c
进程:

#包括
#包括
int main(int argc,char*argv[])
{
文件*p_文件;
p_file=fopen(“out.txt”,“a”);
对于(int i=0;i<100;++i)
{
usleep(100000);//我尝试过使用它,但它没有任何改变
fprintf(p_文件,“%s”,argv[1]);
}
fprintf(p_文件,“\n”);
返回0;
}
输出文件
out.txt
如下所示:


顺序是“随机”的,但没有数据不因某种原因而损坏。为什么会这样?

因为默认情况下,stdio在写入文件时使用缓冲输出,并且每个进程中打印的所有内容都可以放入一个缓冲区。直到进程退出,缓冲区才会被刷新,然后它被作为一个
write()
调用写入,这个调用足够小,可以自动写入文件


调用
fflush(p_文件)fprintf()
之后,您将得到更多混淆的结果。或者调用
setvbuf()
禁用缓冲。

因为
stdio
在写入文件时默认使用缓冲输出,并且每个进程中打印的所有内容都可以放入单个缓冲区。直到进程退出,缓冲区才会被刷新,然后它被作为一个
write()
调用写入,这个调用足够小,可以自动写入文件


调用
fflush(p_文件)fprintf()
之后,您将得到更多混淆的结果。或者调用
setvbuf()
禁用缓冲。

问题很简单:您没有刷新输出,因此它只在
main
的末尾刷新。问题很简单:您没有刷新输出,因此它只在
main
的末尾刷新。