1

如标题所述:

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

那么如何检测到它已被移动并删除正确的文件名呢?

有任何想法吗?

4

3 回答 3

2

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

于 2012-01-16T19:34:01.173 回答
0

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

于 2012-01-16T19:36:52.400 回答
0

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

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

于 2012-01-17T19:31:40.980 回答