IN_MOVE — * — Сокращение для IN_MOVED_FROM | IN_MOVED_TO
IN_CLOSE — * — Сокращение для IN_CLOSE_WRITE | IN_CLOSE_NOWRITE
IN_DONT_FOLLOW — * — Не разыменовывать символьную ссылку (начиная с Linux 2.6.15)
IN_MASK_ADD — * — Добавить события в маску текущего элемента списка наблюдения для файла pathname
IN_ONESHOT — * — Наблюдать для файла pathname только одно событие
IN_ONLYDIR — * — Ошибка, если pathname не каталог (начиная с Linux 2.6.15)
IN_IGNORED — * — Элемент списка наблюдения был удален приложением или ядром
IN_ISDIR — * — Имя файла, возвращенное в name, — каталог
IN_Q_OVERFLOW — * — Переполнение очереди событий
IN_UNMOUNT — * — Файловая система, содержащая объект, была размонтирована
Значения большинства битов в табл. 19.1 ясны из их названий. Следующий список содержит пояснения некоторых деталей.
• Событие IN_ATTRIB происходит при изменении метаданных файла, таких как разрешения, права владения, счетчик ссылок, расширенные атрибуты, идентификатор пользователя, идентификатор группы.
• Событие IN_DELETE_SELF происходит при удалении объекта наблюдения (файла или каталога). Событие IN_DELETE происходит при удалении одного из файлов, содержащегося в объекте наблюдения, если объект наблюдения — каталог.
• Событие IN_MOVE_SELF происходит при переименовании объекта наблюдения. События IN_MOVE_FROM и IN_MOVE_TO происходят при перемещении некоего объекта, находящегося внутри каталога, за которым ведется наблюдение. При этом первое событие происходит с каталогом, содержащим старое имя, а второе — с каталогом, содержащим новое.
• Биты IN_DONT_FOLLOW, IN_MASK_ADD, IN_ONESHOT и IN_ONLYDIR не устанавливают события, за свершением которых требуется вести наблюдение. Данные биты контролируют работу вызова inotify_and_watch().
• Бит IN_DONT_FOLLOW устанавливает, что аргумент pathname не подлежит разыменованию, если это символьная ссылка. Такое правило позволяет программе вести мониторинг самой символьной ссылки, а не файла, на который она указывает.
• При выполнении вызова inotify_and_watch() с параметром pathname, уже включенным в список наблюдения через файловый описатель inotify, по умолчанию произойдет перезапись имеющегося значения параметра mask данного элемента на новое, передаваемое с текущим вызовом. При указании бита IN_MASK_ADD текущая маска дополняется значением, переданным в атрибуте mask данного вызова.
• Бит IN_ONESHOT позволяет приложению осуществлять мониторинг только одного события pathname. После его свершения происходит автоматическое удаление соответствующего элемента списка наблюдения.
• Бит IN_ONLYDIR позволяет приложению осуществлять мониторинг, только если pathname — это каталог. Если нет, то вызов inotify_and_watch() завершается с ошибкой ENOTDIR. Использование данного флага позволяет избежать состояния гонки, которое могло бы возникнуть, если бы мы захотели удостовериться, что ведем наблюдение именно за каталогом.
После регистрации элементов в списке наблюдения приложение с помощью функции read() может определить, какие события произошли с файловым дескриптором inotify. Если к данному моменту никаких событий не случилось, то функция read() блокируется до свершения какого-либо события (если для файлового описателя не был установлен флаг O_NONBLOCK, в случае чего функция read() завершается с ошибкой EAGAIN при отсутствии доступных событий).
После свершения событий каждый вызов функции read() возвращает буфер (см. рис. 19.2), содержащий одну или несколько структур следующего типа:
struct inotify_event {
int wd; /* Дескриптор наблюдения, с которым произошло событие */
uint32_t mask; /* Биты, описывающие произошедшие события */
uint32_t cookie; /* Cookie для связанных событий (для rename()) */
uint32_t len; /* Размер поля 'name' */
char name[]; /* Опциональное имя файла с нуль-символом в конце */
};
Рис. 19.2.
Поле wd сообщает нам дескриптор наблюдения, для которого произошло данное событие. Это поле содержит одно из значений, возвращенных предшествующим вызовом inotify_and_watch(). Поле wd полезно, когда приложение ведет мониторинг нескольких файлов или каталогов через один и тот же файловый дескриптор inotify, предоставляющий ссылку, позволяющую приложению определить, с каким конкретно файлом или каталогом произошло данное событие. (Однако для этого в приложении должна содержаться структура, связывающая дескрипторы наблюдения с путевыми именами).
Поле mask возвращает битовую маску, описывающую событие. Диапазон битов, которые могут появиться в поле mask, указаны в столбце Out табл. 19.1. Обратите внимание на приведенную ниже дополнительную информацию о некоторых битах.