你如何检测你已经打开的文件已经打开
正如标题状态后,被感动:你如何检测你已经打开的文件已经打开
- 我的程序打开文件。
- 有东西出现,并移动该文件。 Inode应该是相同的,但名称不同。
- 关闭该文件,然后删除,但它不存在了
所以,我怎么能检测到它已被移动和删除正确的文件名?
任何想法?
您可以使用inotify来检测对旧名称的更改(查找IN_MOVE_SELF事件)。但是,如果您的真正目标仅仅是删除文件的名称,则可以在打开文件后立即执行此操作(使用unlink(2))。 Unix文件语义将允许您继续使用打开的文件,并且磁盘上的数据在您的句柄关闭之前不会真正删除。然后没有人能够重命名文件。
解除链接的问题是竞争条件。如果在取消链接或完成之前移动文件,则不需要骰子。 – Jaime 2012-01-16 19:50:03
然后在打开它之前先移动文件。没有人会知道这个新名字,然后你可以在最后打开并取消链接。如果这仍然不能解决您的问题,那么您将不得不更详细地描述您实际尝试完成的任务。 – 2012-01-16 19:52:52
fstat
打开文件,stat
的名称,并比较结果。
但是,与任何可能的检查一样,它仍然是活泼的;在您做出任何检查之后但在您采取行动之前,名称可能会改变含义。时间来重新审视你的要求。
您是否担心跨文件系统移动(复制和删除,inode未保留)和非inode文件系统(例如FAT)? – MSalters 2012-01-17 10:06:36