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
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 - 监视多个目录/子目录的主要内容,如果未能解决你的问题,请参考以下文章