2010-11-01 2 views
5

Не могли бы вы объяснить мне механизм inotify? Я искал в Интернете об этом, но я понял, что если я хочу видеть изменения в файле, я должен делать опрос с помощью функции «читать». Есть ли функция обратного вызова, которая будет уведомлять меня, когда файл имеет изменения без опроса?linux, inotify - как подписаться?

Thanks,

ответ

0

Нет, inotify требует опроса.

Регистрация обратного вызова с использованием сигнала (как предложено), является ИМО хуже, чем регулярный опрос.

+0

Своевременное отметил, но вы можете разработать * почему * было бы хуже? :) –

+1

@ Frédéric Hamidi Одна проблема с сигналами - они не очень хорошо сочетаются с исключениями. Вторая проблема заключается в том, что обработчики сигналов должны выполнять минимальную работу и возвращать. –

+2

Только если вы используете исключения из обработчика сигнала. И тот факт, что обработчики сигналов должны выполнять минимальную работу, не означает, что опрос предпочтительнее. Например, ваш основной код может создать канал, настроить обработчик сигнала, а затем выбрать на трубке. Затем обработчик сигнала записывает один символ в трубку. запись безопасна для асинхронного сигнала. Элемент управления возвращается к вашему основному коду и выбирает возврат. У вас есть минимальный обработчик сигнала, и нет необходимости в опросе. – atomice

2

Я предполагаю, что вы используете некоторую графическую библиотеку, которая обрабатывает события для вас.

В лучших библиотеках графического интерфейса есть возможность просмотра файловых дескрипторов. В GTK это gtk_input_add_full; в Qt, QSocketNotifier может работать для вас.

+1

Исправлены ссылки для вас, с чуть большим количеством rep, у вас не возникнет проблем с их добавлением. – 2010-11-01 09:16:37

1

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

1

Вы можете использовать часть ev_io библиотеки libev. Это позволит вам установить обратный вызов для того, когда файл inotify fd доступен для чтения.

Документация libev можно найти здесь: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod

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