Innotify событие в C

Программа:

#include <stdio.h>
#include <sys/inotify.h>

int main()
{
    int fd = inotify_init();
    int wd1 = inotify_add_watch(fd, "/home/guest/a", IN_MODIFY);
    struct inotify_event *event = (struct inotify_event*) malloc(sizeof(struct inotify_event));
    read(fd, event, 1000);
    if (event->mask & IN_MODIFY) {
        printf("File '%s' is modified\n", event->name);
    }
}

Вывод:

$ ./a.out 
File '' is modified
$

Я ожидал, что вышеуказанная программа уведомит об изменении имени файла, если файл a будет изменен. Но он уведомляет без имени файла. Итак, как получить имя файла, если файл изменен с помощью inotify.


person mohangraj    schedule 22.12.2015    source источник
comment
Не приводить возвращаемое значение malloc() и void * в c вообще. И вам действительно не нужно malloc() вообще ничего. Просто struct inotify_event event; read(fd, &event, sizeof(event)). Сделаю   -  person Iharob Al Asimi    schedule 22.12.2015
comment
Проверьте возвращаемое значение read().   -  person John Zwinck    schedule 22.12.2015


Ответы (1)


В документации говорится:

Поле имени присутствует только тогда, когда событие возвращается для файла в отслеживаемом каталоге; он идентифицирует путь к файлу относительно отслеживаемого каталога. Это имя пути завершается нулем и может включать дополнительные нулевые байты ('\0') для согласования последующих операций чтения с подходящей границей адреса.

Таким образом, ваша проблема в том, что вы ожидаете, что inotify вернет вам имя, но это не так.

person John Zwinck    schedule 22.12.2015
comment
Есть ли способ добиться этого? - person mohangraj; 22.12.2015
comment
Да, вы можете сохранить собственное сопоставление дескрипторов просмотра с именами файлов. Это немного обсуждалось здесь: stackoverflow.com/a/9313324/4323 - person John Zwinck; 22.12.2015
comment
Это единственный способ получить имя файла. Но этот сценарий также потерпит неудачу в некоторых условиях, например, если в fd будет добавлено более одного файла, переданного в функцию notify_add_watch. - person mohangraj; 22.12.2015
comment
@mrg: Нет. Каждый раз, когда вы добавляете часы, вы получаете новый дескриптор часов. Следовательно, существует сопоставление дескрипторов наблюдения с часами, и одно наблюдение в одном файле имеет имя файла. - person John Zwinck; 22.12.2015
comment
@iharob: В случае с ОП нет просматриваемого каталога: код отслеживает /home/guest/a, а ОП говорит, что a — это файл. Каталог не просматривается. Поэтому имена не сообщаются. Потому что они должны быть выведены из дескриптора часов. - person John Zwinck; 22.12.2015
comment
Это проясняет ситуацию. Нет смысла возвращать имя просматриваемого файла, потому что вы знаете это имя, иначе как вы вообще начали его смотреть? Прошу прощения, позвольте мне удалить комментарии. - person Iharob Al Asimi; 23.12.2015