读取时确保其内容完整的文件

时间:2016-04-02 16:34:30

标签: linux

我需要创建包含正在运行的进程( A )提供的数据的文件。它将由一个或多个其他进程( B C )读取。第一个想法是简单地创建一个文件并将数据写入其中。但现在我担心,当进程 A 写入文件和进程 B C 或许多其他人会读取它时,它可能只有部分内容。

我想知道我的进程 A 是否有办法创建一个文件,其行为类似于内核创建的/sys中的文件。

我也考虑过创建命名管道。但我不希望写入文件的任何更新排队。

另一个想法是创建某种信号量文件,但由于存在未知数量的其他进程,我担心如果一个读取进程死亡或文件更新速度变慢,它们将创建死锁。< / p>

2 个答案:

答案 0 :(得分:1)

一个常见的技巧是使用rename系统调用来原子地放置文件。这意味着您必须将文件写入临时文件名,然后重命名。

答案 1 :(得分:1)

您最好的选择可能是使用临时文件,然后在写入完成后将其移动以替换旧文件。所以,在类似shell的伪代码中:

$ write_new_file_state tmp_file
$ mv tmp_file file

这确保了文件file仅以原子方式更新 - 它包含旧内容,或者已被覆盖,并包含新内容。该文件的读者将看到旧内容或新内容,但不是不完整的内容,或两者的组合。

请注意,如果您这样做,您需要让消费者关闭其文件描述符(Go中为f.Close())并明确重新打开。这样做的原因是,如果他们不这样做,他们仍将持有对现在删除的旧版本文件的引用(文件描述符引用文件对象,而不是名称,因此覆盖文件不会。 t改变现有文件描述符所指的内容。)