unix:我可以并行写入同一个文件而不丢失条目吗?

unix:我可以并行写入同一个文件而不丢失条目吗?,unix,logging,parallel-processing,Unix,Logging,Parallel Processing,我编写了一个并行执行命令的脚本。我让他们都在同一个日志文件中写入一个条目。顺序是否错误或条目是否交错并不重要,但我注意到有些条目丢失了。我可能应该在写入之前锁定文件,但是,如果多个进程同时尝试写入一个文件,是否会导致丢失条目 是的,如果不同的进程独立地打开并写入同一个文件,可能会导致重复写入和丢失数据。发生这种情况是因为每个进程都将获得自己的文件指针,该指针只能通过本地写入来前进 与其锁定,更好的选择可能是在所有工作进程的祖先中打开日志文件一次,让它跨fork()继承,并由它们用于日志记录。这意

我编写了一个并行执行命令的脚本。我让他们都在同一个日志文件中写入一个条目。顺序是否错误或条目是否交错并不重要,但我注意到有些条目丢失了。我可能应该在写入之前锁定文件,但是,如果多个进程同时尝试写入一个文件,是否会导致丢失条目

是的,如果不同的进程独立地打开并写入同一个文件,可能会导致重复写入和丢失数据。发生这种情况是因为每个进程都将获得自己的文件指针,该指针只能通过本地写入来前进


与其锁定,更好的选择可能是在所有工作进程的祖先中打开日志文件一次,让它跨
fork()
继承,并由它们用于日志记录。这意味着将有一个共享文件指针,当任何进程写入新条目时,该指针将前进。

在脚本中,您应该使用“>>文件”(大于两倍)将输出附加到该文件。解释器将以“追加”模式打开目的地。如果您的程序还希望附加,请遵循以下指令:

在“附加”模式(“a+”)下打开文本文件,并优先选择只打印整行(不要在最后一行“println”之后进行多次“打印”,而是使用单个“println”打印整行)

fopen文档说明了这一点:

DESCRIPTION
     The fopen() function opens the file whose  pathname  is  the
     string  pointed to by filename, and associates a stream with
     it.

     The argument mode points to a string beginning with  one  of
     the following sequences:

     r or rb             Open file for reading.


     w or wb             Truncate to  zero  length or create file
                         for writing.


     a or ab             Append; open or create file for  writing
                         at end-of-file.


     r+ or rb+ or r+b    Open file for update (reading and  writ-
                         ing).


     w+ or wb+ or w+b    Truncate to zero length or  create  file
                         for update.


     a+ or ab+ or a+b    Append; open or create file for  update,
                         writing at end-of-file.
字符b无效,但ISO C允许使用 标准一致性(见标准(5))。使用打开文件 读取模式(r作为模式参数中的第一个字符) 如果文件不存在或无法读取,则失败

以附加模式打开文件(a作为中的第一个字符) 模式参数)会导致所有后续写入文件 被强制到文件的当前结尾,而不考虑 对fseek(3C)的干预呼叫如果两个单独的进程 打开相同的文件进行追加,每个进程可以自由写入 不必担心会破坏正在写入的输出 另一个。两个过程的输出将 按写入顺序混合在文件中

正是因为这种混合,你才想优先考虑
仅使用“println”(或其等效项)。

建议使用O_APPEND,它没有此功能problem@Celada
O_APPEND
是不够的,如果文件在第一次写入之前由第二个进程同时打开。