3

我需要根据可能同时运行的两个不同模块产生的消息来更新日志文件。

那么是否可以在两个程序中同时打开和写入一个文件呢?

系统规格:SLES 11 x86_64。

4

2 回答 2

3

是的。一个文件可以由多个进程/程序同时打开。多个进程/程序可以同时读取和写入一个文件,但同时写入同一个文件的最终结果可能undefined. 所以最好使用

在 Linux 上你可以使用:flocks

于 2013-10-15T11:17:06.743 回答
3

您可以执行以下操作之一:

  • 使用flock()(或类似机制)同步打开文件描述符上的写入(如已回答)。
  • 在支持(甚至强制执行)独占的系统上重复使用open()和(或类似的) 。close()open()
  • 依靠缓冲输出不间断地发送日志行。这通常与stderr日志记录一起使用,因为可能的竞争条件在这里通常不是问题。
  • 使用日志服务,并且只open()使用那里的文件。其他进程通过 IPC 与日志服务进行通信。您可以使用自定义日志记录服务或类似syslog或的工具journald。他们俩AFAIK也都支持从非root进程进行日志记录。

我个人更喜欢最后一个选项,因为它的设计是最简洁的,并且不太依赖于操作系统特定的行为。如果您的应用程序由主进程启动的多个进程组成,那么主进程也可以作为日志服务执行,并在生成子进程之前创建管道。如果进程是单独启动的,您可以拥有一个单独的服务来侦听 TCP/IP 套接字或(如果您的系统支持)本地域套接字。

于 2013-10-15T11:27:14.007 回答