我已经跟踪了在多进程环境中使用fputs和fflush的一些错误。 因此,我编写了如下的简单代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "windows.h"
#define FILENAME "test.txt"
int main(int argc,char *argv[])
{
FILE *file;
file = fopen(FILENAME,"a");
char buf[10240 + 100];
int pid = getcurrentProcessId();
char buf_pid[20];
itoa(pid,buf_pid,10);
int ii = 0;
while(ii < 10000)
{
time_t now = time(0);
struct tm tstruct;
char tt[80];
tstruct = *localtime(&now);
strftime(tt,sizeof(tt),"%Y/%m/%d %X",&tstruct);
strcpy(buf,tt);
strcpy(buf + strlen(tt)," ");
strcpy(buf + strlen(tt) + 1,buf_pid);
strcpy(buf + strlen(tt) + strlen(buf_pid)," ");
int len = strlen(tt) + strlen(buf_pid) + 1;
int a = rand()%10240;
char temp;
for(int i=0;i<a;i++)
{
temp = 'a' + rand()%25;
memset(buf + len,temp,1);
len++;
}
buf[len++] = '\n';
buf[len++] = 0;
//Sleep(1);
printf("%d %s %d %d\n",ii,tt,pid,a);
fputs(buf,file);
fflush(file);**
ii++;
}
然后我运行了一些如下所示的批处理文件:
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
start filewrite.exe
然后,结果当然如下所示。
2019/11/08 22:57:14 261 rjatydimofugclqurclqecdrhvqsuwbvntmryktdl..
2019/11/08 22:57:14 261 ixoqldswtmhmjxqedqkprngproxvfpeuagbsxexje..
2019/11/08 22:57:14 261 skrhmutgpnkpwopudobptikjrfogdeairwyglcrqe..
2019/11/08 22:57:14 261 sqytmhtrnqkrtnfigwgcvvacgklmcjxinhehaqish..
2019/11/08 22:57:14 261 pvdvsfksuonldbwstvgflwjpecfymtfdrsnxlqqod..
2019/11/08 22:57:14 261 oqatxghvkhhjyvgnlymcjapedmpdakuuphbxnuqtd..
2019/11/08 22:57:14 261 ufrjkikbwvlvjejhpnndyebmgfjbmwvldsrlephow..
..
没有显式的互斥锁,因此fputs和fflush并不是自动的。 我知道fputs是使用os内核中的句柄将文本写入文件的缓冲区 fflush是将缓冲区刷新到磁盘中。而且,尽管没有同步对象,但是将保留对每个缓冲区或刷新代码的访问顺序。
是否可以使用以上代码进行锁定? 或者,如果有多个进程正在写入2个文件, 有可能锁吗?
我找到了相关的好文章,但我不相信这确实发生了。 Is a sync/flush needed before writes to a locked file from multiple threads/processes in fopen a+ mode? fputs and fflush,writing and buffer process
谢谢!