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

C++ c++;inotify-监视多个目录/子目录,c++,inotify,C++,Inotify,首先,如果有比使用inotify更简单的方法,请告诉我 基本上,我想做的是观察一个带有inotify的根目录,其中包含以下标志:IN|CREATE | IN|MODIFY | IN|DELETE。 当它在创建和ISDIR中时,我也想看那个文件夹。但我需要的主要问题是,即使在子目录中,是否创建、删除或修改了文件。现在我知道我可以使用inotify_add_watch()添加多个目录,但是当我阅读event->name时,我如何知道它属于哪个目录?inotify_事件结构似乎不包含该值。如果我有这样

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

基本上,我想做的是观察一个带有inotify的根目录,其中包含以下标志:IN|CREATE | IN|MODIFY | IN|DELETE。 当它在创建和ISDIR中时,我也想看那个文件夹。但我需要的主要问题是,即使在子目录中,是否创建、删除或修改了文件。现在我知道我可以使用inotify_add_watch()添加多个目录,但是当我阅读event->name时,我如何知道它属于哪个目录?inotify_事件结构似乎不包含该值。如果我有这样一个结构:

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

然后创建一个文件:

/root/a/tmp.txt

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

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

这是来自inotify的

仅当为监视目录中的文件返回事件时,名称字段才存在;它标识相对于监视目录的文件路径名。此路径名以null结尾,可能包含更多的null字节,以便将后续读取与适当的地址边界对齐

我是这样做的: 我在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*ev=(…)之后读取接收到的inotify事件时;您只需使用以下命令查询相应的目录路径:

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

wd字段将链接回/root/a/watch
QString dir_path = fd_to_path.value(ev->wd);