Здравствуйте, real_sba, Вы писали:
_>Здравствуйте, Mazay, Вы писали:
Вопрос совсем в другом. Меня крайне удивляет следующее. Допустим я наблюдаю некоторое возможно длительное время за каталогом и тут внезапно решил сделать read. Вместо того чтобы получить по одному inotify_event для каждого каким либо образом измененного файла с битовой маской всех событий (согласно как написано в мане)
_>_>mask contains bits that describe the event that occurred (see below).
_>
_>я получаю каждый event отдельно. И это однозначно не связано с тем что события происходят медленно. Все они получены именно в одном единственном read. Но почемуто даже для одного и того же файла каждое событие отдельно.
_>Как видно маска вовсе не contains bits а contains bit.
Прошу обратить внимание: event стоит в единственном числе. Маска описывает ровно одно событие (точнее, серию идентичных). Упомянутые биты (которые во множественном числе), включают IN_IGNORED и компанию.
_>Для себя хочу понять, действительно ли это нормальное поведение inotify.
Да.
_>И отсюда вопрос, для определения устаревания файлов, таких как удаление, изменение (нужно для кешера) придется поверх inotify сооружать еще контейнер который бы группировал однотипные события в одну записть, чтобы не вызывать лишний раз обработчик события. На примере предоставленом выше пользователь только один раз сохранил файл, значит внутренности поменялись только один раз, и по логике надо только один раз вызвать обработчик который удалит файл из кеша, но inotify уперто подсказывает что IN_MODIFY аж 2 раза. Ладно это неприциппиально, привяжемся только к IN_CLOSE_WRITE который действительно показывается только 1 раз. Но если б надо было цеплять обработчик на любой другой event, то получилась бы каша из ненужный вызовов.
Это особенности редактора. Он зачем-то переоткрывает файл несколько раз. Протестируй на чем-нибудь более простом, например (watch вполне аналогичен твоему коду):
$ ./watch junk &
[1] 21595
$ echo aaa > junk/foo
foo : 0002 modify
foo : 0020 open
foo : 0002 modify
foo : 0008 close write
$ echo aaa > junk/bar
bar : 0100 create
bar : 0020 open
bar : 0002 modify
bar : 0008 close write
$ echo aaa >> junk/bar
bar : 0020 open
bar : 0002 modify
bar : 0008 close write
$