2015-12-22 2 views
4

Программа:Inotify событие в 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 
$ 

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

+3

[Не набрасывать возвращаемое значение 'malloc()' и 'void *' в c вообще] (http://stackoverflow.com/questions/605845/do-i-cast-the-result- из-таНоса). И вам действительно не нужно 'malloc()' что-нибудь вообще. Просто «struct inotify_event event»; read (fd, & event, sizeof (event)) '. будет делать –

+2

Проверьте возвращаемое значение 'read()'. –

ответ

4

В документации сказано:

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

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

+0

Есть ли способ достичь этого? – mrg

+1

Да, вы можете сохранить собственное сопоставление дескрипторов часов с именами файлов. Это немного обсуждалось здесь: http://stackoverflow.com/a/9313324/4323 –

+0

Это единственный способ получить имя файла. Но этот сценарий также будет терпеть неудачу в некоторых условиях, например, если к fd передано функция notify_add_watch добавлено несколько файлов. – mrg

Смежные вопросы