inotify_rm_watch всегда возвращает EINVAL - PullRequest
0 голосов
/ 26 июня 2018

У меня есть две функции:

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 голосов
/ 26 июня 2018

inotify самостоятельно удаляет часы из удаленных каталогов и выдает EINVAL, если кто-то пытается явно удалить часы из удаленного каталога. В связи с тем, что событие inotify не содержит wd удаленного дочернего элемента и что флаг IN_IGNORED содержится в IN_DELETE событии родительского каталога, а не IN_DELETE_SELF фактического каталога, это невероятно неудобно.

...