Подготовить менеджер ресурсов к отправке уведомления
#include <unistd.h>#include <sys/iomsg.h>int ionotify( int fd,int action,int flags,const struct sigevent *event );
NULL
для отключения уведомления.libc
Функция notify() взводит менеджер ресурсов, связанный с fd, для отправки уведомления о событии event. Событие отправляется, когда возникает условие, указанное комбинацией action и flags.
Флаги
Аргумент flags указывает типы условий, которые требуется проверять для уведомления. Каждый менеджер ресурсов поддерживает отдельный контекст для каждого условия уведомления. Затрагиваются только указанные биты уведомлений. В следующем примере второй вызов inotify() не влияет на первый, поскольку он указывает другое уведомление:
ionotify( fd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT, &event );ionotify( fd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_OUTPUT, &event );
Условия, указанные в flags:
1
. Для символьного устройства, такого как последовательный порт, это будет символ. Для очереди сообщений POSIX это будет сообщение. Каждый менеджер ресурсов выбирает соответствующий объект. _NOTIFY_COND_INPUT
. _NOTIFY_COND_OUTPUT
. _NOTIFY_COND_OBAND
. Способ изменения значения по умолчанию для _NOTIFY_COND_OUTPUT
и _NOTIFY_COND_INPUT
зависит от устройства. Например, специальные символьные устройства могут вызывать readcond().
Для менеджеров ресурсов, поддерживающих как редактируемый, так и сырой режим, должен быть установлен сырой режим, чтобы обеспечить правильную работу ionotify().
Вышеуказанные флаги расположены в старших битах flags. Они определяются маской _NOTIFY_COND_MASK
.
В случае асинхронного уведомления с использованием переданного event, такого как пульс или сигнал реального времени, 32
-битное значение в event->sigev_value.sival_int возвращается неизменённым, если не выбран код SI_NOTIFY
, в этом случае старшие биты (определённые _NOTIFY_COND_MASK
) устанавливаются для активных уведомлений. В этом случае следует ограничить sival_int маской, определённой _NOTIFY_DATA_MASK
.
Например, функция Unix select() определяет SI_NOTIFY
и использует допустимые биты данных sival_int в качестве серийного номера.
Если используется код SI_NOTIFY , то следует очистить биты в поле sigev_value в соответствии с _NOTIFY_COND_MASK — менеджер ресурсов использует только операцию ИЛИ и никогда не очищает биты. |
Действия
Аргумент action указывает тип взводимого действия, которое необходимо выполнить. Когда условие включено, менеджер ресурсов отслеживает его и при выполнении доставляет event с помощью MsgDeliverEvent(). Когда событие доставлено, оно всегда отключается, за исключением случаев, указанных ниже.
Обратите внимание, что для взвода события (указанного в action) _NOTIFY_ACTION_TRANARM
на устройство может быть выдано только одно уведомление такого типа. Когда событие срабатывает, оно удаляется.
Каждое действие предназначено для поддержки определенного типа уведомлений следующим образом:
_NOTIFY_ACTION_POLL
. Однако, если ни одно из условий, указанных во flags, не выполнено, то каждое условие, указанное в flags, активируется. Если какое-либо условие выполнено, ни одно из условий не взводится. Функция Unix select() использует notify() с этим действием. Возвращает активные условия в соответствии с запрошенными flags. Можно использовать действия _NOTIFY_ACTION_POLLARM
или _NOTIFY_ACTION_POLL
для генерации событий, ориентированных на уровень срабатывания, а не на переход.
Когда действие в менеджере ресурсов активировано, оно остается включенным до тех пор пока:
Существует ограничение в одно уведомление на очередь сообщений или менеджер ресурсов. Если уведомление уже было включено для указанного ресурса, notify() устанавливает ошибку EBUSY . |
Активные условия в соответствии с запрошенными flags. Для действия с переходом возвращает 0
. Если возникла ошибка возвращает -1
, код ошибки записывается в errno.
ЗОСРВ «Нейтрино»
mq_notify(), select(), struct sigevent
Предыдущий раздел: Описание API системной библиотеки