检查另一个程序是否有打开的文件

在做了大量的研究,也没有能够find我的问题的解决scheme,我决定张贴在这里在stackoverflow。

那么我的问题是有点不寻常的,所以我想这就是为什么我无法find答案:

我有一个程序正在将文件logging到文件中。 然后我有另一个负责转移该文件。 最后我有第三个获取文件并处理它。

我的问题是:文件传输程序需要发送文件,而它仍然被logging。 问题是当文件传输程序到达文件的末尾时并不意味着文件实际上是完整的,因为它还在被logging。

有一些东西可以检查logging器是否仍然打开文件,或者它已经closures了,以便能够判断文件的结尾是否是文件的真实结尾,或者是否只是没有进一步的数据还没有读

希望你能帮我解决这个问题。 也许你对如何解决这个问题有另一个想法。

先谢谢你。

GeKod

简单地说 – 你不能没有使用文件系统通知机制,Windows,Linux和OSX都有这个味道。 我忘了Windows是如何做到这一点的,但是linux有'inotify',而且osx有'knotify'。

处理这个简单的方法是,记录到一个tmp文件,当记录完成后,将文件移动到“准备传输文件”目录,如果你这样做,使文件是相同的文件系统,当你做这个举动的时候,它将是原子性的,并且即时确保你的传输实用程序“看到”一个新的文件,它将被完全形成并准备好。

或者,只要你的tmp文件没有扩展名,那么当它完成后,将文件重命名为传输代理正在轮询的扩展名。

你有没有考虑在记录器程序和抓取记录的数据/文件之间使用流接口? 如果你可以访问一个流接口(比如OS /堆栈服务),它也提供了流信号/原语的可靠结束,你可以考虑替换文件接口。

C中没有可用的函数/库来执行此操作。 但是一个简单的选择是在活动结束后重命名文件。 例如,录像机可以打开名为file.record的文件,一旦录制完成,就可以将file.record重命名为file.transfer ,传输程序应该查找file.transfer进行传输,一旦传输完成,它可以将文件重命名为file.read ,读者可以读取该文件,最后将其重命名为file.done

你可以检查文件是否打开或不如下

 FILE_NAME="filename" FILE_OPEN=`lsof | grep $FILE_NAME` // if [ -z $FILE_NAME ] ;then // "File NOT open" // else // "File Open" 

请参阅http://linux.about.com/library/cmd/blcmdl8_lsof.htm

我认为咨询锁会有帮助。 因为如果使用其他程序正在工作的文件,则会被阻塞或出错。 但如果您访问该文件,则操作是Okey,但结果是不可预知的。为了保持一致性,所有要访问该文件的进程都应该遵守咨询锁定规则。 我认为这将工作。

当文件关闭时,锁也被释放。其他进程可以尝试保存该文件。