c++ inotify - 监视多个目录/子目录

Posted

技术标签:

【中文标题】c++ inotify - 监视多个目录/子目录【英文标题】:c++ inotify - watch multiple directories / subdirectories 【发布时间】:2014-06-08 13:46:18 【问题描述】:

首先,如果有比使用 inotify 更简单的方法,请告诉我!

基本上我想做的是使用带有这些标志的 inotify 观察根目录:IN_CREATE |修改 | IN_DELETE。 当它是 IN_CREATE 和 IN_ISDIR 我也想看那个文件夹。但我需要的主要是文件是否在子目录中被创建、删除或修改。现在我知道我可以使用 inotify_add_watch() 添加多个目录,但是当我阅读 event->name 时,我怎么知道它属于哪个目录? inotify_event 结构似乎不包含该值。所以如果我有这样的结构:

/root

然后我创建一个目录“a”:

/root/a

然后创建一个文件:

/root/a/tmp.txt

当我阅读 event->name 时,它​​只会说 tmp.txt,但我怎么知道它在“a”子目录中?我怎么知道监视描述符是什么?

【问题讨论】:

【参考方案1】:

在 inotify_event 结构中,名称字段包含事件发生的对象的名称,相对于 wd。您需要获取父目录的绝对路径并连接文件/目录的名称以获得完整路径。 同样在 Inotify_event 结构的掩码字段中,您可以使用 IN_ISDIR 掩码位来了解该 wd 发生的事件是文件还是目录。

这是来自 inotify here

名称字段仅在为监视目录中的文件返回事件时出现;它标识相对于监视目录的文件路径名。此路径名以空值结尾,并且可能包含更多空字节以将后续读取对齐到合适的地址边界。

【讨论】:

wd 字段将链接回 /root/a/ 手表【参考方案2】:

我是这样做的: 我在 inotify_add_watch() 期间创建了一个 hashmap (QHash fd_to_path) 以将接收到的 wd 与其相应的目录字符串耦合:

int wd = inotify_add_watch(...next_dir_path..);
if (wd != -1)
    fd_to_path.insert(wd, next_dir_path);

那么在struct inotify_event之后读取接收到的inotify事件时 *ev = (...);您只需查询相应的目录路径:

QString dir_path = fd_to_path.value(ev->wd);

【讨论】:

以上是关于c++ inotify - 监视多个目录/子目录的主要内容,如果未能解决你的问题,请参考以下文章

inotify,inotify_add_watch() 监控多个目录,c++

使用 INotify 监视具有多个符号链接的文件

如何在c中使用inotify查看具有多个文件更改的目录

一个脚本中的多个 inotify 事件

Inotify:仅监视文件夹中的某些文件

在 go-inotify 中查看递归目录