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
是不够的,如果文件在第一次写入之前由第二个进程同时打开。