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

时间:2013-03-13 11:42:51

标签: unix logging parallel-processing

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

以“追加”模式(“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作为mode参数中的第一个字符) 如果文件不存在或无法读取,则失败。

使用追加模式打开文件(a作为第一个字符) mode参数)导致对文件的所有后续写入 无论如何,都被强制转到当前的文件结尾 干预呼吁fseek(3C)。 如果有两个独立的流程 打开相同的文件进行追加,每个进程都可以自由编写 到文件而不用担心破坏输出被写入 另一个。两个进程的输出将是 在文件中按照写入的顺序混合。

正是由于这种混合,你想要优先考虑 仅使用'println'(或其等价物)。