Re[5]: Пример кода
От: vnp  
Дата: 21.11.12 18:27
Оценка: 2 (1)
Здравствуйте, 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
$
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.