如何检查文件是否仍在写入?

时间:2011-04-22 18:25:16

标签: c++ linux gcc

如何检查文件是否仍在写入?我需要等待一个文件被另一个进程创建,编写和再次关闭,所以我可以继续在我的进程中再次打开它。

4 个答案:

答案 0 :(得分:5)

一般来说,这是一个难以解决的问题。在某些情况下,您可以询问文件是否打开;但是,如果其他进程是脚本,则可能会多次打开并关闭该文件。我强烈建议您使用咨询锁或其他一些显式方法,以便其他进程在完成文件时进行通信。

那就是说,如果这不是一种选择,那么还有另一种方式。如果查看/proc/<pid>/fd目录,其中<pid>是某个正在运行的进程的数字进程ID,您将看到进程已打开的文件的一堆符号链接。符号链接上的权限反映了文件打开的模式 - 写入权限意味着它是为写入模式打开的。

因此,如果您想知道文件是否已打开,只需扫描每个进程的/proc条目及其中的每个文件描述符,查找文件的可写符号链接。如果你知道其他进程的PID,你也可以直接查看它的proc条目。

当然,这有一些重大缺点。首先,您只能查看自己进程的打开文件,除非您是root用户。它也相对较慢,只适用于Linux。而且,如果另一个进程多次打开并关闭文件,那么你就会陷入困境 - 你可能最终会在关闭期间看到它,并且没有简单的方法可以知道它是否会再次打开它。

答案 1 :(得分:3)

您可以让写入过程在完成您的阅读过程感兴趣的数据文件写入之后编写一个sentinel文件(比如“sentinel.ok”)。在阅读过程中,您可以检查之前是否存在哨兵读取数据文件,确保数据文件完全写入。

答案 2 :(得分:1)

@ blu3bird使用sentinel文件的想法并不错,但它需要修改正在编写文件的程序。

这是另一种可能还需要修改编写器的可能性,但它可能更强大:

写入临时文件,例如“foo.dat.part”。写完成后,“foo.dat.part”重命名为“foo.dat”。这样读者就不会看到“foo.dat”,或者会看到它的完整版本。

答案 3 :(得分:0)

您可以尝试使用inotify

http://en.wikipedia.org/wiki/Inotify

如果您知道该文件将被打开一次,写入然后关闭,那么您的应用可能会等待IN_CLOSE_WRITE事件。

但是,如果执行文件写入的其他应用程序的行为更像是打开,写入,关闭,打开,写入,关闭....那么您将需要一些其他机制来确定其他应用程序何时具有真正完成了文件。