ИМЯ
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 и
возвращает
файловый
дескриптор
очереди
событий,
связанной
с группой.
В
файловом
дескрипторе,
используемом
в fanotify_mark(2),
задаются
файлы,
каталоги и
точки
монтирования,
для
которых
должны
создаваться
события fanotify.
Эти
события
можно
получить с
помощью
чтения
файлового
дескриптора.
Одни
события
носят
уведомительный
характер,
показывая
что к файлу
был
получен
доступ.
Другие
события
можно
использовать
для
разрешения
приложению
доступа к
файлу или
каталогу.
Доступ к
объектам
файловой
системы
разрешается
посредством
записи в
файловый
дескриптор.
Несколько
программ
могут
использовать
интерфейс
fanotify к одним и
тем же
файлам
одновременно.
В текущей
реализации
количество
групп fanotify
ограничено
128 на
пользователя.
Это
значение
нельзя
изменить.
Для
вызова fanotify_init()
требуется
мандат CAP_SYS_ADMIN.
Это
требование
может быть
облегчено
в будущих
версиях
программного
интерфейса.
Поэтому
ниже
показаны
определённые
дополнительные
проверки
возможностей,
которые
были
реализованы.
Аргумент
flags
содержит
многобитовое
поле,
определяющее
класс
уведомления,
запрашиваемый
приложением,
а также
однобитовые
поля,
задающие
поведение
файлового
дескриптора.
Если на
события
доступа
зарегистрировалось
несколько
слушателей,
то класс
уведомления
используется
для
установления
порядка
слушателей
при
получении
событий.
В flags может
быть
указан
только
один из
следующих
классов
уведомления:
- FAN_CLASS_PRE_CONTENT
- Это
значение
позволяет
принимать
уведомляющие
события об
обращении
к файлу, и
события
доступа,
запрашивающие
доступ к
файлу. Он
предназначен
для
слушателей
событий,
которым
требуется
доступ к
файлам до
того, как в
них будут
содержаться
окончательные
данные.
Этот класс
уведомления
может быть
использован,
например, в
программах
управления
иерархического
хранения.
- FAN_CLASS_CONTENT
- Это
значение
позволяет
принимать
уведомляющие
события об
обращении
к файлу, и
события
доступа,
запрашивающие
доступ к
файлу. Он
предназначен
для
слушателей
событий,
которым
требуется
доступ к
файлам
после того,
как они
содержат
окончательные
данные.
Этот класс
уведомления
может быть
использован,
например, в
программах
обнаружения
вредоносного
кода.
- FAN_CLASS_NOTIF
- Значение
по
умолчанию.
Его не
нужно
указывать.
Это
значение
позволяет
принимать
только
события о
доступе к
файлу.
Право на
доступ к
файлу
задать
невозможно.
Слушатели
с
различными
классами
уведомлений
будут
принимать
события в
таком
порядке:
FAN_CLASS_PRE_CONTENT, FAN_CLASS_CONTENT,
FAN_CLASS_NOTIF.
Порядок
уведомления
слушателей
в этом
классе
уведомления
не
определён.
Дополнительно
в flags могут
быть
установлены
следующие
биты:
- FAN_CLOEXEC
- Устанавливать
флаг close-on-exec (FD_CLOEXEC)
для нового
файлового
дескриптора.
Смотрите
описание
флага O_CLOEXEC в
open(2).
- FAN_NONBLOCK
- Включить
неблокирующий
флаг (O_NONBLOCK)
для
файлового
дескриптора.
Чтение из
такого
файлового
дескриптора
не вызовет
блокирования.
Если
данные
отсутствуют,
то read(2)
завершается
ошибкой
EAGAIN.
- FAN_UNLIMITED_QUEUE
- Снять
ограничение
в 16384 события
в очереди
событий.
Для
использования
этого
флага
требуется
мандат
CAP_SYS_ADMIN.
- FAN_UNLIMITED_MARKS
- Снять
ограничение
в 8192 метки.
Для
использования
этого
флага
требуется
мандат
CAP_SYS_ADMIN.
- FAN_REPORT_TID
(начиная с Linux
4.20)
- Хранить ID
нити (TID)
вместо ID
процесса (PID)
в поле pid
структуры
struct fanotify_event_metadata,
передаваемой
в read(2)
(смотрите
fanotify(7)).
В
аргументе
event_f_flags
задаются
флаги
состояния
файла,
которые
будут
установлены
на
открытые
файловые
описатели,
создаваемые
для
событий fanotify.
Подробней
об этих
флагах
смотрите
описание
значений
flags в open(2).
Аргумент
event_f_flags
включает
многобитовое
поле для
режима
доступа.
Это поел
может
иметь
следующие
значения:
- O_RDONLY
- Это
значение
разрешает
доступ
только на
чтение.
- O_WRONLY
- Это
значение
разрешает
доступ
только на
запись.
- O_RDWR
- Это
значение
разрешает
доступ на
чтение и
запись.
В event_f_flags
могут быть
установлены
дополнительные
биты.
Наиболее
полезные
значения:
- O_LARGEFILE
- Включить
поддержку
файлов
более 2 ГБ.
Если не
удастся
установить
этот флаг,
то при
попытке
открыть
большой
файл,
отслеживаемый
группой fanotify
на 32-битной
системе,
возвращается
ошибка EOVERFLOW.
- O_CLOEXEC
(начиная с Linux
3.18)
- Включить
флаг 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
устанавливается
в
соответствующее
значение.
ОШИБКИ
- EINVAL
- В flags или event_f_flags
указано
некорректное
значение.
Значение
FAN_ALL_INIT_FLAGS
определяет
все
допустимые
биты в flags.
- EMFILE
- Количество
групп fanotify для
этого
пользователя
превышает
128.
- EMFILE
- Было
достигнуто
ограничение
по
количеству
открытых
файловых
дескрипторов
на
процесс.
- ENOMEM
- Не удалось
выделить
память для
группы
уведомления.
- ENOSYS
- В этом ядре
не
реализован
fanotify_init().
Программный
интерфейс
fanotify доступен
только,
если ядро
было
собрано с
параметром
CONFIG_FANOTIFY.
- EPERM
- Операция
запрещена,
так как
вызывающий
не имеет
мандата
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.