c - 为什么 fopen / fprintf 没有竞争条件
c - Why no race condition with fopen / fprintf
我正在尝试模拟竞争条件(这是一个正确的术语吗?)以便之后用信号量修复它。
我有一个master.c
过程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
for(int i = 0; i < 100; ++i)
{
if (fork() == 0)
{
char str[12];
sprintf(str, "%d", i%10);
execl("./slave", "slave", str, (char *)0);
}
}
return 0;
}
还有一个 slave.c
打印到文件的过程:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
FILE *p_file;
p_file = fopen("out.txt", "a");
for (int i = 0; i < 100; ++i)
{
usleep(100000); // I tried using this but it changes nothing
fprintf(p_file, "%s", argv[1]);
}
fprintf(p_file, "\n");
return 0;
}
输出文件 out.txt
如下所示:
https://pastebin.com/nU6YsRsp
顺序为"random",但由于某种原因没有数据未损坏。这是为什么?
因为 stdio
在写入文件时默认使用缓冲输出,并且您在每个进程中打印的所有内容都适合单个缓冲区。缓冲区在进程退出之前不会被刷新,然后它被写为单个 write()
调用,它足够小以原子方式写入文件。
在每个 fprintf()
之后调用 fflush(p_file);
,您会得到更多的混合结果。或者调用 setvbuf()
来禁用缓冲。
我正在尝试模拟竞争条件(这是一个正确的术语吗?)以便之后用信号量修复它。
我有一个master.c
过程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
for(int i = 0; i < 100; ++i)
{
if (fork() == 0)
{
char str[12];
sprintf(str, "%d", i%10);
execl("./slave", "slave", str, (char *)0);
}
}
return 0;
}
还有一个 slave.c
打印到文件的过程:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
FILE *p_file;
p_file = fopen("out.txt", "a");
for (int i = 0; i < 100; ++i)
{
usleep(100000); // I tried using this but it changes nothing
fprintf(p_file, "%s", argv[1]);
}
fprintf(p_file, "\n");
return 0;
}
输出文件 out.txt
如下所示:
https://pastebin.com/nU6YsRsp
顺序为"random",但由于某种原因没有数据未损坏。这是为什么?
因为 stdio
在写入文件时默认使用缓冲输出,并且您在每个进程中打印的所有内容都适合单个缓冲区。缓冲区在进程退出之前不会被刷新,然后它被写为单个 write()
调用,它足够小以原子方式写入文件。
在每个 fprintf()
之后调用 fflush(p_file);
,您会得到更多的混合结果。或者调用 setvbuf()
来禁用缓冲。