gpt4 book ai didi

c - 按发生顺序用不同进程写入同一个文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:34 25 4
gpt4 key购买 nike

我正在使用基于 UNIX 的操作系统(Lubuntu 14.10。我有几个进程需要将消息打印到同一个文件和标准输出。

当我将消息打印到屏幕上时,它按我想要的方式工作,按出现的顺序进行。例如:

Process1_message1
Process2_message1
Process3_message1
Process1_message2
Process2_message2
Process3_message2
...

但是,当我检查输出文件时,它如下所示:

Process1_message1
Process1_message2
Process2_message1
Process2_message2
Process3_message1
Process3_message2
...

我使用 fprintf(FILE *ptr, char *str) 将消息写入文件。

注意:我在主进程中打开了如下格式的文件:

fptr=fopen("output.txt", "a");

其中 fptr 是全局 FILE *

任何帮助将不胜感激。谢谢!

最佳答案

fprintf() 不会工作。它很容易被翻译成多次调用 write() 来实际写出数据,就像你发布的那样。您调用 fprintf() 一次,在幕后它多次调用 write() 以实际将数据写入文件。

您需要使用open( filename, O_WRONLY | O_CREAT | O_APPEND, 0600 ),并像这样写入数据以确保您只调用 write() 一次,保证是原子的:

ssize_t myprintf( int fd, const char *fmt, ... )
{
char buffer[ 1024 ];
ssize_t bytesWritten;
va_list argp;
va_start( argp, fmt );
int bytes = vsnprintf( buffer, sizeof( buffer ), fmt, argp );
if ( bytes < sizeof( buffer ) )
{
bytesWritten = write( fd, buffer, bytes );
}
// buffer was too small, get a bigger one
else
{
char *bufptr = malloc( bytes + 1 );
bytes = vsnprintf( bufptr, bytes + 1, fmp, argp );
bytesWritten = write( fd, bufptr, bytes );
free( bufptr );
}

return( bytesWritten );
}

关于c - 按发生顺序用不同进程写入同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29881605/

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