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

时间:2012-01-05 09:48:22

标签: c linux file-access

经过大量的研究,也无法找到我的问题的解决方案,我决定在这里发布stackoverflow。

我的问题很不寻常,所以我猜这就是为什么我找不到任何答案:

我有一个程序正在将文件记录到文件中。然后我有另一个负责传输该文件的人。最后,我有第三个获取文件并处理它。

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

有一些东西可以检查录音机是否仍然打开该文件,或者它是否已经关闭它以便能够判断文件的末尾是否真的是文件的结尾,或者根本没有还有待阅读的数据。

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

提前谢谢。

GeKod

5 个答案:

答案 0 :(得分:1)

简单地说 - 你不能不使用文件系统通知机制,windows,linux和osx都有这种风味。我忘记了Windows是如何做到这一点的,但是linux已经'inotify'而且osx已经'knotify'。

处理这个的简单方法是,记录到tmp文件,当录制完成后,将文件移动到“准备传输文件”目录,如果这样做,那么文件是当你进行移动时,在同一个文件系统上,它将是原子的,并且是即时的,确保你的传输实用程序“看到”一个新文件时,它将完全形成并准备就绪。

或者,只是让您的tmp文件没有扩展名,然后在完成后将文件重命名为传输代理正在轮询的扩展名。

答案 1 :(得分:0)

您是否考虑过在录像机程序和抓取录制数据/文件的程序之间使用流接口?如果您可以访问流接口(比如OS /堆栈服务),它也提供了可靠的流信号/基元结束,您可以考虑更换文件接口。

答案 2 :(得分:0)

C中没有可用的功能/库来执行此操作。但一个简单的替代方法是在活动结束后重命名文件。例如,刻录机可以使用名称file.record打开文件,一旦完成录制,它可以将file.record重命名为file.transfer,转移程序应该查找file.transfer到转移,转移完成后,它可以将文件重命名为file.read,读者可以读取该文件,最后将其重命名为file.done

答案 3 :(得分:0)

您可以检查文件是否打开,如下所示

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

答案 4 :(得分:0)

我认为咨询锁会有所帮助。因为如果一个人正在使用另一个程序正在处理的文件,那么该文件将被阻止或者出错。但如果您有效地访问它,则操作为Okey,但结果是不可预测的。为了保持一致性,所有想要访问该文件的进程都应遵守建议锁定规则。我认为这会奏效。

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