2013-09-03 3 views
3

Моя цель: отслеживать текстовый файл для модификации без блокировки монитора моей программой, но вместо этого формировать часть цикла (так что проверяйте последовательно).Использование неблокирующего iNotify

Голова гласит: либо найдите способ запуска iNotify в неблокирующем режиме, либо поток iNotfiy.

Я попробовал нелипкий путь, и инвалиды O_NONBLOCK для моего экземпляра Inotify с помощью следующей команды:

fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK); 

Однако, когда я делаю это, и я тогда попытку:

length = read(fd, buffer, BUF_LEN); 

It продолжает говорить мне, что для чтения ресурс временно недоступен.

Может ли кто-нибудь дать мне несколько советов о том, как достичь того, что я хочу сделать? Не нужно быть этим методом, но мне нужна функциональность, поскольку я редактирую текстовый файл с веб-сервером и хочу прочитать изменения в моей программе на C++ для обновления переменных.

Заранее благодарен!

ответ

3

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

В качестве альтернативы, вы можете попытаться использовать уведомление сигнала с приводом ввода/вывода для inotify дескриптора файла:

Начиная с Linux 2.6.25, уведомление сигнала с приводом I/O доступен для inotify дескрипторов файлов ; см. обсуждение F_SETFL (для установки флага O_ASYNC), F_SETOWN и F_SETSIG в fcntl(2). Структура siginfo_t (описанная в sigaction(2)), которая передается обработчику сигнала, имеет следующие поля: si_fd установлен в номер дескриптора файла inotify; si_signo установлен на номер сигнала; si_code - POLL_IN; и POLLIN установлен в si_band.

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