你如何检测你已经打开的文件已经打开

你如何检测你已经打开的文件已经打开

问题描述:

正如标题状态后,被感动:你如何检测你已经打开的文件已经打开

  • 我的程序打开文件。
  • 有东西出现,并移动该文件。 Inode应该是相同的,但名称不同。
  • 关闭该文件,然后删除,但它不存在了

所以,我怎么能检测到它已被移动和删除正确的文件名?

任何想法?

+0

您是否担心跨文件系统移动(复制和删除,inode未保留)和非inode文件系统(例如FAT)? – MSalters 2012-01-17 10:06:36

您可以使用inotify来检测对旧名称的更改(查找IN_MOVE_SELF事件)。但是,如果您的真正目标仅仅是删除文件的名称,则可以在打开文件后立即执行此操作(使用unlink(2))。 Unix文件语义将允许您继续使用打开的文件,并且磁盘上的数据在您的句柄关闭之前不会真正删除。然后没有人能够重命名文件。

+0

解除链接的问题是竞争条件。如果在取消链接或完成之前移动文件,则不需要骰子。 – Jaime 2012-01-16 19:50:03

+0

然后在打开它之前先移动文件。没有人会知道这个新名字,然后你可以在最后打开并取消链接。如果这仍然不能解决您的问题,那么您将不得不更详细地描述您实际尝试完成的任务。 – 2012-01-16 19:52:52

尝试到access(2)关闭它之前的文件。如果您获得ENOENT,则文件已被移动。按照/ proc/self/fd/$ open_file_number /符号链接找到使用readlink(2)的新文件名。

+0

好像这里也有种族。如果访问表明它没有被移动,我尝试删除它,但是在这些调用之间移动,我运气不好 – Jaime 2012-01-16 19:51:55

+0

只是再次做它:-) – ggiroux 2012-01-16 19:55:30

+0

使用'access'不会处理的情况下该名称现在指向一个不同的文件。 – 2012-01-17 19:31:00

fstat打开文件,stat的名称,并比较结果。

但是,与任何可能的检查一样,它仍然是活泼的;在您做出任何检查之后但在您采取行动之前,名称可能会改变含义。时间来重新审视你的要求。