我需要创建包含正在运行的进程( A )提供的数据的文件。它将由一个或多个其他进程( B 和 C )读取。第一个想法是简单地创建一个文件并将数据写入其中。但现在我担心,当进程 A 写入文件和进程 B 和 C 或许多其他人会读取它时,它可能只有部分内容。
我想知道我的进程 A 是否有办法创建一个文件,其行为类似于内核创建的/sys
中的文件。
我也考虑过创建命名管道。但我不希望写入文件的任何更新排队。
另一个想法是创建某种信号量文件,但由于存在未知数量的其他进程,我担心如果一个读取进程死亡或文件更新速度变慢,它们将创建死锁。< / p>
答案 0 :(得分:1)
一个常见的技巧是使用rename
系统调用来原子地放置文件。这意味着您必须将文件写入临时文件名,然后重命名。
答案 1 :(得分:1)
您最好的选择可能是使用临时文件,然后在写入完成后将其移动以替换旧文件。所以,在类似shell的伪代码中:
$ write_new_file_state tmp_file
$ mv tmp_file file
这确保了文件file
仅以原子方式更新 - 它包含旧内容,或者已被覆盖,并包含新内容。该文件的读者将看到旧内容或新内容,但不是不完整的内容,或两者的组合。
请注意,如果您这样做,您需要让消费者关闭其文件描述符(Go中为f.Close()
)并明确重新打开。这样做的原因是,如果他们不这样做,他们仍将持有对现在删除的旧版本文件的引用(文件描述符引用文件对象,而不是名称,因此覆盖文件不会。 t改变现有文件描述符所指的内容。)