我有以下两个功能:
static int MessAttrManager_inotifyUnregister(MessPropertyManager* base, int wd){
MessAttrManager* self = base->_derived;
int ret;
printf("INOTIFY REMOV %d\n",wd);
if ((ret = inotify_rm_watch(self->inotify.descriptor, wd)) < 0)
return ret;
printf("INOTIFY REMOV END %d\n",wd);
return 0;
}
static int MessAttrManager_inotifyRegister(MessPropertyManager* base, char* dir, long flags){
MessAttrManager* self = base->_derived;
int wd, ret;
printf("INOTIFY ADD START %s\n",dir);
if ((wd = inotify_add_watch(self->inotify.descriptor, dir, flags)) < 0)
return wd;
printf("INOTIFY ADD %d %s\n",wd,dir);
return 0;
}
它们是唯一使用inotify_rm/add_watch
的代码段,在日志中,我可以清楚地看到MessAttrManager_inotifyRegister
成功创建了监视。还可以正确检测事件。我还看到MessAttrManager_inotifyUnregister
删除了完全相同的监视描述符。但是,第二个函数几乎总是返回EINVAL
。我具有嵌套的监视目录层次结构(递归),并且当我递归删除所有监视时,inotify_rm_watch
仅在最后一个目录(根)上成功执行。
嵌套手表是否属于标准行为?
答案 0 :(得分:0)
inotify
会自动从删除的目录中删除监视,如果试图从删除的目录中显式删除监视,则会抛出EINVAL
。结合inotify事件不包含已删除子项的wd
和IN_IGNORED
标志包含在父目录的IN_DELETE
事件而不是实际目录的IN_DELETE_SELF
中的事实,这是疯狂的不便。