У меня есть две функции:
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
успешно выполняется только в последней директории (корневой), когда я рекурсивно удаляю все часы.
Это стандартное поведение для вложенных часов?