В результате выполнения функция inotify_init() возвращает файловый дескриптор. Такой дескриптор является манипулятором, использующимся для ссылки на объект inotify при выполнении последующих операций.

Начиная с версии ядра 2.6.27, Linux поддерживает новый, нестандартный, системный вызов inotify_init1(). Он выполняет те же задачи, что и inotify_init(), но предоставляет при этом дополнительный аргумент flags, который может применяться для модификации поведения системного вызова. Поддерживается два флага. Флаг IN_CLOEXEC заставляет ядро установить флаг закрытия при исполнении exec (FD_CLOEXEC) для нового файлового дескриптора. Данный флаг полезен по тем же причинам, что и флаг open() O_CLOEXEC, описанный в подразделе 4.3.1. Флаг IN_NONBLOCK заставляет ядро установить флаг O_NONBLOCK на описание текущей процедуры открытия файла, чтобы последующие операции чтения были неблокирующими. Это позволяет не осуществлять дополнительные вызовы функции fcntl() для достижения того же результата.

Системный вызов inotify_and_watch() либо добавляет новый элемент в список наблюдения для объекта inotify, ссылка на который осуществляется с помощью файлового дескриптора fd, либо изменяет уже имеющийся элемент (рис. 19.1).

#include

int inotify_add_watch(int fd, const char *pathname, uint32_t mask);

Возвращает дескриптор наблюдения или -1 при ошибке

Рис. 19.1.Объект inotify и связанные структуры данных ядра

Аргумент pathname указывает на файл, для которого требуется создать или изменить элемент списка наблюдения. Вызывающий код должен иметь разрешение на доступ к этому файлу. (Проверка разрешения доступа выполняется единожды при осуществлении вызова inotify_and_watch(). Вызывающий код будет продолжать получать оповещения от файла на протяжении всего времени существования элемента списка наблюдения, даже если условия доступа впоследствии будут изменены, так как вызывающий код не повторял процедуру чтения разрешений доступа к файлу.)

Аргумент mask — это битовая маска, определяющая перечень событий, чей мониторинг осуществляется для файла, установленного аргументом pathname. Далее по тексту мы опишем подробнее значения битов, которые могут быть указаны в аргументе mask.

Если аргумент pathname не был ранее добавлен в файловый дескриптор fd, то вызов inotify_and_watch() создает новый элемент списка наблюдения и возвращает новый неотрицательный дескриптор наблюдения, который используется для ссылки на этот элемент при последующих операциях. Этот дескриптор уникален для данного объекта inotify.

Если же аргумент pathname уже был ранее добавлен в файловый дескриптор fd, то вызов inotify_and_watch() изменяет маску существующего элемента списка наблюдения на pathname и возвращает дескриптор наблюдения для этого элемента. (Данный дескриптор будет таким же, что и дескриптор, возвращенный функцией inotify_and_watch() при изначальном добавлении файла pathname в данный список). Мы более подробно расскажем о том, каким образом можно отредактировать маску, когда будем описывать флаг IN_MASK_ADD в следующем разделе.

Системный вызов inotify_rm_watch() удаляет элемент списка наблюдения, указанный дескриптором наблюдения wd объекта inotify, ссылка на который осуществляется с помощью дескриптора fd.

#include

int inotify_rm_watch(int fd, uint32_t wd);

Возвращает дескриптор наблюдения или -1 при ошибке

Аргумент wd — дескриптор наблюдения, возвращенный предшествующим вызовом inotify_and_watch(). (Тип данных uint32_t — это 32-разрядное целое число без знака.)

Удаление элемента списка наблюдения приведет к генерации для данного дескриптора наблюдения события IN_IGNORED. Мы более подробно расскажем об этом событии ниже.

19.3. События inotify

Когда мы создаем или изменяем элемент списка наблюдения с помощью функции inotify_and_watch(), аргумент битовая маска mask задает события, чей мониторинг должен осуществляться для указанного файла pathname. Биты событий, которые могут быть указаны в аргументе mask, перечислены в столбце In табл. 19.1.

Таблица 19.1. События inotify

Битовое значение — In — Out — Описание

IN_ACCESS — * — * — Файл был прочитан (read())

IN_ATTRIB — * — * — Метаданные файла изменены

IN_CLOSE_WRITE — * — * — Файл был открыт для записи, а потом закрыт

IN_CLOSE_NOWRITE — * — * — Файл был открыт для записи, а потом закрыт

IN_CREATE — * — * — Файл/каталог создан внутри наблюдаемого каталога

IN_DELETE — * — * — Файл/каталог удален из наблюдаемого каталога

IN_DELETE_SELF — * — * — Наблюдаемый файл/каталог был удален

IN_MODIFY — * — * — Файл был изменен

IN_MOVE_SELF — * — * — Наблюдаемый файл/каталог был перемещен

IN_MOVED_FROM — * — * — Наблюдаемый файл/каталог был перемещен из наблюдаемого каталога

IN_MOVED_TO — * — * — Наблюдаемый файл/каталог был перемещен в наблюдаемый каталог

IN_OPEN — * — * — Файл был открыт

IN_ALL_EVENTS — * — Сокращение для всех вышеперечисленных событий ввода

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

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