inotify_rm_watch始终返回EINVAL

时间:2018-06-26 15:26:39

标签: c linux filesystems inotify

我有以下两个功能:

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仅在最后一个目录(根)上成功执行。

嵌套手表是否属于标准行为?

1 个答案:

答案 0 :(得分:0)

inotify会自动从删除的目录中删除监视,如果试图从删除的目录中显式删除监视,则会抛出EINVAL。结合inotify事件不包含已删除子项的wdIN_IGNORED标志包含在父目录的IN_DELETE事件而不是实际目录的IN_DELETE_SELF中的事实,这是疯狂的不便。