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. Использование данного флага позволяет избежать состояния гонки, которое могло бы возникнуть, если бы мы захотели удостовериться, что ведем наблюдение именно за каталогом.

19.4. Чтение событий inotify

После регистрации элементов в списке наблюдения приложение с помощью функции 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. Входящий буфер, содержащий три структуры inotify_event

Поле wd сообщает нам дескриптор наблюдения, для которого произошло данное событие. Это поле содержит одно из значений, возвращенных предшествующим вызовом inotify_and_watch(). Поле wd полезно, когда приложение ведет мониторинг нескольких файлов или каталогов через один и тот же файловый дескриптор inotify, предоставляющий ссылку, позволяющую приложению определить, с каким конкретно файлом или каталогом произошло данное событие. (Однако для этого в приложении должна содержаться структура, связывающая дескрипторы наблюдения с путевыми именами).

Поле mask возвращает битовую маску, описывающую событие. Диапазон битов, которые могут появиться в поле mask, указаны в столбце Out табл. 19.1. Обратите внимание на приведенную ниже дополнительную информацию о некоторых битах.

Перейти на страницу:

Похожие книги