2013-05-07 4 views
0

Моя программа использует inotify для мониторинга изменений в файлах. Мой код выглядит следующим образом:read on inotify descriptor заблокирован навсегда

fd = inotify_init(); 
    wd = inotify_add_watch(fd, "./test.txt", IN_ALL_EVENTS); 
    len = read(fd, buff, BUFF_SIZE); 
    while (i < len) { 
     struct inotify_event *pevent = (struct inotify_event *) &buff[i]; 
       //process events 
     i += sizeof(struct inotify_event) + pevent->len; 
    } 

Однако, после того, как я получил несколько событий для первого изменения в отслеживаемых файлов (событие IN_OPEN, IN_MODIFY, IN_ACESS и т.д.), а затем изменения в отслеживаемых файлов делает генерировать любой другие события ==> моя программа зависает при чтении (чтение блокируется)

Не могли бы вы, ребята, помочь мне объяснить эту ошибку.

ответ

0

, пожалуйста, покажите, какие операции действительно происходят с «./test.txt» и больше о вашем коде (buff, BUFF_SIZE). А вот какой-то момент для вас, чтобы проверить:

  • Есть некоторые специальные мероприятия, такие как IN_IGNORED, которые могут удалить часы из файла
  • Я предлагаю использовать выбор/опрос/Epoll контролировать ФУ, а не Блокирующие чтения в теме.
+0

спасибо за ваш ответ. Это очень помогает мне. Я просто хочу задать вам еще один вопрос. Почему, когда я открываю файл с помощью Vim или Gedit, я всегда получал событие IN_DELETE_ITSELF? – khanhhh89

+0

@ khanhhh89 Я считаю, что вы отредактировали «test.txt» и сохранили его. Мой vim равен 7.3, и я обнаружил, что на самом деле он использует 'open (" test.txt ", O_WRONLY | O_CREAT | O_TRUNC, 0664)' и записывает в него содержимое. Поэтому я считаю, что ** IN_DELETE_ITSELF ** вызвано O_TRUNC. – xgwang

+0

@wgwang Так вот почему после того, как я прочитал первые события, использование inotify_add_watch ("test.txt") снова приведет к ошибке «Нет такого файла или каталога» ??? – khanhhh89