Я подправил пример Вот чтобы сделать это несколько раз, просмотрите файл для «модификаций». Мой код Вот. В моих тестах уведомление inotify срабатывает только при первом изменении файла (т.е. touch
«Под ред). Любые последующие изменения в файле не вызывают никаких уведомлений. stat
показывает, что время «Изменить» изменилось. Кроме того, изменив код для удаления часов и повторного добавления при каждом срабатывании уведомления (т.е. переместить inotify_add_watch
а также inotify_rm_watch
быть внутри while(1)
петля в моем образец) не помогло решить эту проблему.
Мне было интересно, может ли кто-нибудь здесь помочь с тем, что я могу делать неправильно. Кроме того, хотя я добавил часы для IN_ALL_EVENTS
Я действительно забочусь только о IN_MODIFY
События. Не уверен, что это имеет какое-то значение.
Кроме того, этот вариант использования не работает? Должен ли я изменить свой подход вместо просмотра каталога? Пожалуйста посоветуй.
ТИА.
Изменить 1: Как отмечено themel, обработка i
нужна некоторая фиксация. Однако даже фиксированная версия не запускает уведомления о последующих событиях файловой системы. Кроме того, добавление отслеживания в каталог, в отличие от файла, демонстрирует аналогичное недетерминированное поведение.
Редактировать 2: я хотел бы получить это пример asio + inotify основанный на этот ответ работать. К сожалению, этот пример не работает для меня вообще. Любая помощь приветствуется. ТИА.
После исправления themel ваш код работает нормально при просмотре каталога, в моих тестах. При просмотре файла, event->len
ноль, и ваш код игнорирует уведомления.
С тестом для event->len
удалены и все event->name
заменен на file_path
в операторах printf он прекрасно работает и при просмотре файла.
PS: только заметил, что вы упомянули touch
,
touch
отправляет следующие события:
IN_OPEN
IN_ATTRIB
IN_CLOSE_WRITE
нет IN_MODIFY
Кроме того, не проверяйте модификацию, редактируя ее vim
как я только что сделал — он удаляет файл, перетасовывая рабочую копию и файл подкачки, который удаляет часы. pico
работает.
Ваше обращение с i
сломан, вы никогда не сбросите его на 0 в цикле. Это приводит к тому, что любые последующие события inotify будут рассматриваться только в том случае, если они длиннее самого длинного события перед ними, что маловероятно, что вы хотите.
при мониторинге отдельного файла событие-> len будет 0, поскольку имя файла не возвращается. Я заметил, что многие примеры программ имеют эту проблему.