gpt4 book ai didi

c - 在 Linux 中使用重命名来安全地覆盖共享文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:31 24 4
gpt4 key购买 nike

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

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

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

我试图对这种想法进行原型(prototype)设计,认为消费者会收到某种类型的错误或半旧/半新文件,但它似乎始终处于消费者打开它时的状态,即使重命名/覆盖多次次。

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

谢谢!

最佳答案

在 Linux 和类似的系统中,如果一个进程打开了一个文件并删除了该文件,那么该文件本身将保持未删除状态,直到所有进程都将其关闭。立即发生的只是目录条目被删除,因此无法再次打开。

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

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

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

关于c - 在 Linux 中使用重命名来安全地覆盖共享文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com