繁体   English   中英

使用重命名安全地覆盖Linux中的共享文件

[英]Using rename to safely overwrite a shared file in Linux

这是设置:我有一个共享文件(让我们称之为status.csv),它由许多进程读取(让我们称之为消费者)以只读方式。 我有一个生产者通过创建临时文件,向其写入数据并使用此处讨论的C函数定期更新status.csv:

http://www.gnu.org/software/libc/manual/html_node/Renaming-Files.html

将临时文件(有效覆盖)重命名为status.csv,以便使用者可以处理新数据。 它希望尝试并保证(尽可能在Linux世界中)消费者不会得到格式错误/损坏/半旧/半新的status.csv文件(我希望他们得到所有旧的数据或所有新的)。 我似乎无法通过阅读重命名的描述来保证这一点:它似乎保证重命名动作本身是原子的,但我想知道消费者是否已经打开status.csv文件,他将继续阅读相同内容文件在打开时的状态,即使文件在生成器读取操作过程中被生产者重命名/覆盖。

我试图将这种想法原型化,消费者会得到某种类型的错误或半旧/半新文件,但它似乎总是处于消费者打开的状态,即使多次重命名/覆盖也是如此。

顺便说一句,这些进程在同一台机器上运行(RHEL 6)。

谢谢!

在Linux和类似系统中,如果进程打开文件并删除文件,则文件本身将保持未删除状态,直到所有进程关闭它。 立即发生的所有事情是删除目录条目,以便不能再次打开它。

如果使用重命名替换打开的文件,则会发生同样的情况。 旧文件描述符仍然保持旧文件打开。 但是,新打开将看到新文件。

因此,要让您的消费者看到新文件,他们必须关闭并重新打开该文件。

注意:您的消费者可以使用stat (2)调用来发现文件是否已被替换。 如果st_devst_ino条目(或两者)已更改,则文件已被替换,必须关闭并重新打开。 这就是tail -F工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM