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