2

我正在尝试使用 inotify 监视目录,并且正在注册所有事件。现在,我的项目需要跟踪对目录执行的任何 MOVE_SELF 操作,以便我应该能够检测到受监视目录移动到哪个新位置。为了实现这一点,我存储了受监视目录的打开文件描述符(int fd)的引用,当我得到 MOVE_SELF 时,我尝试使用以下方法获取新路径:

//code to store a reference of file-descrptor of the monitored sirectory
fd = open(watchPath.c_str(), O_RDONLY)    


//code to learn the new location of the moved directory
char fdpath[4096];
char path[4096];

sprintf(fdpath, "/proc/self/fd/%d", fd);
ssize_t sz = readlink(fdpath, path, sizeof(path) - 1); //Path will contain the new location after the move happens

但是这样做的副作用是,如果我删除目录,我不会收到 DELETE_SELF 事件,因为我仍然持有一个打开的文件描述符。谁能建议我如何解决这个问题?

谢谢,-桑迪普

4

1 回答 1

3

万一有人偶然发现这个问题:这绝对是一种预期的行为。Inotify 不监视“文件”,它监视“文件对象”(又名 inode)。在所有指向它的打开文件描述符都关闭之前,内核不会删除一个 inode。

这也是为什么IN_DELETE/IN_DELETE_SELF如果您删除文件的几个硬链接之一(因为硬链接共享相同的 inode),不会触发 / 的原因。

您可以通过订阅事件来部分解决硬链接问题IN_ATTRIB:它在 inode 的引用计数发生变化时触发(例如,当硬链接之一被删除时),因此您可以使用它来检查文件是否仍然存在于旧的小路。

至于“开放描述符”问题——我不知道有任何解决方法。就个人而言,我只是不在乎。那么,如果您的程序暂时与磁盘内容不同步怎么办?即使 inotify 完全完美,由于队列溢出和事件竞争,您仍然需要偶尔重新同步。

于 2016-12-27T09:22:37.860 回答