Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以同时在两个不同的程序中写入(或首先打开)磁盘文件?_C_File Io - Fatal编程技术网

C 是否可以同时在两个不同的程序中写入(或首先打开)磁盘文件?

C 是否可以同时在两个不同的程序中写入(或首先打开)磁盘文件?,c,file-io,C,File Io,我需要根据可能同时运行的两个不同模块生成的消息更新日志文件 那么,有可能在两个程序中同时打开和写入一个文件吗 系统规格:SLES 11 x86_64。是。一个文件可以由多个进程/程序同时打开。多个进程/程序可以同时读取和写入一个文件,但同时写入同一文件的最终结果可能是未定义。所以最好使用锁 在Linux上,您可以使用:您可以执行以下操作之一: 使用flock()(或类似机制)同步打开的文件描述符上的写入(如已回答的) 在支持(甚至强制实施)独占的系统上反复使用open()和close()(或类

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

那么,有可能在两个程序中同时打开和写入一个文件吗


系统规格:SLES 11 x86_64。

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


在Linux上,您可以使用:

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

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

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

这取决于具体情况。某些操作系统允许程序锁定部分文件。但是,没有标准的C功能可以帮助您实现这一点。与往常一样,在并发访问共享资源时,同步访问可以防止您获得未定义的结果。@JoachimPileborg:我忘了提到,我正在研究SLES 11。你能详细说明第三个吗method@0xF1如果你有进一步的问题,我会修改文本。谢谢,我会尽量使用它们。