多个进程可以使用fopen附加到文件而没有任何并发​​问题吗?

Del*_*ted 15 c unix linux fopen

我有一个进程以附加模式打开文件.在这种情况下,它是一个日志文件.示例代码:

int main(int argc, char **argv) {
    FILE *f;
    f = fopen("log.txt", "a");
    fprintf(f, "log entry line");
    fclose(f);
}
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 如果我有多个进程附加到同一个文件,每个日志行是否会明显出现,还是可以在进程上下文切换时隔行扫描?
  2. 如果许多进程需要访问该文件,这会写入阻塞,从而导致并发问题吗?

我正在考虑以最简单的方式执行此操作,或者使用zeromq将管道上的日志条目泵送到日志收集器.

我确实考虑过syslog,但我真的不希望任何平台依赖于该软件.

这个btw的默认平台是Linux.

cni*_*tar 11

我不知道fopen,fprintf但你可以open使用该文件O_APPEND.然后每个都write将在文件的末尾顺利进行(没有与另一个写入混合).

实际上看标准:

与打开的流关联的文件描述符应该被分配和打开,就好像通过使用以下标志调用open()一样:

a or ab          O_WRONLY|O_CREAT|O_APPEND
Run Code Online (Sandbox Code Playgroud)

所以我想fprintf只要打开文件就可以安全地从多个进程中获取a.

  • 您仍然必须将缓冲切换为no或line.使用完全缓冲时,它可能会在条目中间用完缓冲区并使用它调用write. (2认同)

glg*_*lgl 7

标准(没有的fopen/fwrite的开放/写)指出,

如果设置了文件状态标志的O_APPEND标志,则应在每次写入之前将文件偏移设置为文件的末尾,并且在改变文件偏移和写入操作之间不应发生中间文件修改操作.

对于fprintf()要使用,您必须在文件中禁用缓冲.


thi*_*ton 6

您肯定会有平台依赖性,因为Windows无法处理附加到同一文件的多个进程.

关于同步问题,我认为线路缓冲输出/应该/大部分时间保存,即根据我的基于shell的短测试,超过99.99%的短日志线应该是完整的,但不是每次都是如此.明确的语义肯定是可取的,因为无论如何你都无法独立编写这个hack系统,我建议使用syslog方法.