gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:34:58 25 4
gpt4 key购买 nike

我发现了在多进程环境中使用 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 是将文本写入文件的缓冲区,并使用操作系统内核中的句柄而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

谢谢!

最佳答案

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

引用来自 man open 的内容:

O_APPEND The file is opened in append mode. Before each write(2), the file offset is positioned at the end of the file, as if with lseek(2). The modification of the file offset and the write operation are performed as a single atomic step.

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

关于c - 锁定多个进程同时将其日志写入文件的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58768288/

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