我正在尝试使用inotify监控目录,并且我正在注册所有事件。现在,我在项目中要求跟踪对目录执行的任何MOVE_SELF操作,以便我能够检测到受监视目录移动到的新位置。为了实现这一点,我存储了受监视目录的open file-descrptor(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事件,因为我仍然有一个打开的文件描述符。有谁可以建议我如何解决这个问题?
谢谢, -Sandeep
答案 0 :(得分:0)
万一有人偶然发现这个问题:这绝对是一种预期的行为。 Inotify不会监控"文件",it monitors "file objects"(又称inode)。在指向它的所有打开文件描述符都关闭之前,内核不会删除inode。
这也是为什么IN_DELETE
/ IN_DELETE_SELF
在您删除文件的多个硬链接之一时不会被触发的原因(因为硬链接共享相同的inode)。
您可以通过订阅IN_ATTRIB
事件来部分解决硬链接问题:当inode的引用计数发生更改时(例如,当删除其中一个硬链接时)会触发它,因此您可以使用它来检查如果文件仍然存在于旧路径中。
至于"开放描述符"问题 - 我不知道有任何变通方法。就个人而言,我只是不在乎。那么如果你的程序暂时与磁盘内容不同步呢?即使inotify完全无瑕疵,你仍然需要偶尔重新同步,因为队列超支和事件竞赛。