Scroll to navigation

FANOTIFY_INIT(2) Руководство программиста Linux FANOTIFY_INIT(2)

ИМЯ

fanotify_init - создаёт и инициализирует группу fanotify

СИНТАКСИС

#include <fcntl.h>
#include <sys/fanotify.h>

int fanotify_init(unsigned int flags, unsigned int event_f_flags);

ОПИСАНИЕ

Обзор программного интерфейса fanotify смотрите в fanotify(7).

Вызов fanotify_init() инициализирует новую группу fanotify и возвращает файловый дескриптор очереди событий, связанной с группой.

The file descriptor is used in calls to fanotify_mark(2) to specify the files, directories, and mounts for which fanotify events shall be created. These events are received by reading from the file descriptor. Some events are only informative, indicating that a file has been accessed. Other events can be used to determine whether another application is permitted to access a file or directory. Permission to access filesystem objects is granted by writing to the file descriptor.

Несколько программ могут использовать интерфейс fanotify к одним и тем же файлам одновременно.

В текущей реализации количество групп fanotify ограничено 128 на пользователя. Это значение нельзя изменить.

Для вызова fanotify_init() требуется мандат CAP_SYS_ADMIN. Это требование может быть облегчено в будущих версиях программного интерфейса. Поэтому ниже показаны определённые дополнительные проверки возможностей, которые были реализованы.

Аргумент flags содержит многобитовое поле, определяющее класс уведомления, запрашиваемый приложением, а также однобитовые поля, задающие поведение файлового дескриптора.

Если на события доступа зарегистрировалось несколько слушателей, то класс уведомления используется для установления порядка слушателей при получении событий.

В flags может быть указан только один из следующих классов уведомления:

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

Слушатели с различными классами уведомлений будут принимать события в таком порядке: FAN_CLASS_PRE_CONTENT, FAN_CLASS_CONTENT, FAN_CLASS_NOTIF. Порядок уведомления слушателей в этом классе уведомления не определён.

Дополнительно в flags могут быть установлены следующие биты:

Устанавливать флаг close-on-exec (FD_CLOEXEC) для нового файлового дескриптора. Смотрите описание флага O_CLOEXEC в open(2).
Включить неблокирующий флаг (O_NONBLOCK) для файлового дескриптора. Чтение из такого файлового дескриптора не вызовет блокирования. Если данные отсутствуют, то read(2) завершается ошибкой EAGAIN.
Снять ограничение в 16384 события в очереди событий. Для использования этого флага требуется мандат CAP_SYS_ADMIN.
Снять ограничение в 8192 метки. Для использования этого флага требуется мандат CAP_SYS_ADMIN.

В аргументе event_f_flags задаются флаги состояния файла, которые будут установлены на открытые файловые описатели, создаваемые для событий fanotify. Подробней об этих флагах смотрите описание значений flags в open(2). Аргумент event_f_flags включает многобитовое поле для режима доступа. Это поел может иметь следующие значения:

Это значение разрешает доступ только на чтение.
Это значение разрешает доступ только на запись.
Это значение разрешает доступ на чтение и запись.

В event_f_flags могут быть установлены дополнительные биты. Наиболее полезные значения:

Включить поддержку файлов более 2 ГБ. Если не удастся установить этот флаг, то при попытке открыть большой файл, отслеживаемый группой fanotify на 32-битной системе, возвращается ошибка EOVERFLOW.
Включить флаг close-on-exec для нового открытого файлового дескриптора. Смотрите описание флага O_CLOEXEC в open(2) для того, чтобы узнать как это может пригодиться.

Также доступны следующие флаги: O_APPEND, O_DSYNC, O_NOATIME, O_NONBLOCK и O_SYNC. Указание любых других флагов в event_f_flagsприводит к ошибке EINVAL (но смотрите ДЕФЕКТЫ).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении fanotify_init() возвращает новый файловый дескриптор. При ошибке возвращается -1, и errno устанавливается в соответствующее значение.

ОШИБКИ

В flags или event_f_flags указано некорректное значение. Значение FAN_ALL_INIT_FLAGS определяет все допустимые биты в flags.
Количество групп fanotify для этого пользователя превышает 128.
Было достигнуто ограничение по количеству открытых файловых дескрипторов на процесс.
Не удалось выделить память для группы уведомления.
В этом ядре не реализован fanotify_init(). Программный интерфейс fanotify доступен только, если ядро было собрано с параметром CONFIG_FANOTIFY.
Операция запрещена, так как вызывающий не имеет мандата CAP_SYS_ADMIN.

ВЕРСИИ

Вызов fanotify_init() появился в версии 2.6.36 ядра Linux и был включён в версии 2.6.37.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данный вызов есть только в Linux.

ДЕФЕКТЫ

В ядрах Linux до версии 3.18 существовали следующие дефекты:

*
При передаче в event_f_flags флаг O_CLOEXEC игнорируется.

В ядрах Linux до версии 3.14 существовали следующие дефекты:

*
Значение аргумента event_f_flags не проверяется на корректность флагов. Могут быть установлены флаги, предназначенные только для внутреннего использования, такие как FMODE_EXEC, и в результате будут установлены для файловых дескрипторов при чтении из файлового дескриптора fanotify.

СМ. ТАКЖЕ

fanotify_mark(2), fanotify(7)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

15 сентября 2017 г. Linux