【问题标题】:inotify does not raise DELETE_SELF if an open file-fd exists如果存在打开的文件 fd,inotify 不会引发 DELETE_SELF
【发布时间】:2013-09-24 06:26:39
【问题描述】:

我正在尝试使用 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 事件,因为我仍然持有一个打开的文件描述符。谁能建议我如何解决这个问题?

谢谢, -桑迪普

【问题讨论】:

  • 你在哪里调用inotify_add_watch
  • inotify_add_watch 在 init() 函数之后被调用,我确保注册所有事件,尤其是 IN_DELETE 和 IN_DELETE_SELF。我真的花了很多时间,但无法找到为什么 IN_DELETE_SELF 没有被抓住。希望我能得到答复。

标签: c++ ubuntu inotify


【解决方案1】:

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

这也是为什么 IN_DELETE/IN_DELETE_SELF 在删除文件的多个硬链接之一时不会被触发的原因(因为硬链接共享相同的 inode)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多