多进程同时锁定将日志写入文件的可能性

我已经跟踪了在多进程环境中使用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

谢谢!

ming870312 回答:多进程同时锁定将日志写入文件的可能性

程序中有一个“隐藏”锁-当代码打开日志文件时,它使用APPEND模式(“ a”打开)。这将导致在open系统调用上设置标志O_APPEND。

公开报价:

  

O_APPEND         该文件以追加模式打开。在每次write(2)之前,文件偏移量位于         文件的末尾,就像使用lseek(2)一样。文件偏移量的修改和         写操作是一个原子步骤。

该标志保证每个“写”操作(在每次执行printf以将行刷新到文件时都将执行)将是原子的,并且不会与其他进程的输出混合。 同步和锁定发生在操作系统内核中,不需要用户操作

本文链接:https://www.f2er.com/3137304.html

大家都在问