【问题标题】:How do you detect that a file you have opened has been moved after opening如何检测您打开的文件在打开后被移动了
【发布时间】:2012-02-11 16:52:53
【问题描述】:

如标题所述:

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

那么我怎样才能检测到它已被移动并删除正确的文件名呢?

有什么想法吗?

【问题讨论】:

  • 您是否担心跨文件系统移动(复制和删除,不保留 inode)和非 inode 文件系统(例如 FAT)?

标签: c++ linux file inode


【解决方案1】:

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

【讨论】:

  • 取消链接的问题是竞争条件。如果文件在取消链接发生或可以完成之前被移动,则没有骰子。
  • 然后在打开文件之前先移动文件。没有人会知道新名称,然后您可以在最后打开并取消链接。如果这仍然不能解决您的问题,那么您将不得不更详细地描述您实际想要完成的任务。
【解决方案2】:

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

【讨论】:

  • 这里好像也有比赛。如果访问表明它没有被移动并且我尝试删除它,但在这些调用之间移动了一些东西,我不走运
  • 使用 access 将无法处理名称现在指向不同文件的情况。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2012-10-02
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多