Подключение файлового дескриптора к менеджеру ресурсов
#include <sys/iofunc.h>
#include <sys/dispatch.h>
int select_attach( void *dpp,
select_attr_t *attr,
int fd,
unsigned flags,
int (*func)( select_context_t *ctp,
int fd,
unsigned flags,
void *handle ),
void *handle );
- dpp
- Дескриптор диспетчера, созданный с помощью dispatch_create(),
- attr
- Указатель на структуру select_attr_t.
- fd
- Файловый дескриптор, который необходимо прикрепить к дескриптору диспетчера.
- flags
- Досупные флаги определены в
<sys/dispatch.h>
и используют механизмы ionotify() (дополнительные сведения см. в разделе ionotify()): - SELECT_FLAG_EXCEPT
- Out-of-band данные доступны. Определение подобных данных зависит от конкретного менеджера ресурсов.
- SELECT_FLAG_READ
- Входные данные доступны. Количество доступных данных по умолчанию равно
1
. Для символьных устройств это соответствует одному символу. Для очереди POSIX-сообщений это соответствует одному сообщению. Конкретные менеджеры ресурсов выбирают подходящий вид объектов. - SELECT_FLAG_WRITE
- В выходном буфере имеется место для дополнительных данных. Фактическое количество свободного места зависит от менеджера ресурсов. Менеджеры ресурсов могут уведомлять как о полном опустошении выходного буфера, так и о наличии некоторого места в нем.
Флаги, специфичные для диспетчера: - SELECT_FLAG_REARM
- Перезапуск fd после передачи события (event).
- SELECT_FLAG_SRVEXCEPT
- Регистрация функции, которая будет вызываться при завершении любого канала с активными соединениями. При использовании этого флага используется флаг
_TO_CHF_COLD_DISCONNECT
функции ChannelCreate(). В этом случае fd игнорируется.
- func
- Функция-обработчик, которая будет вызвана после разблокировки дескриптора.
- handle
- Указатель на данные, которые необходимо передать в func.
libc
Функция select_attach() присоединяет файловый дескриптор fd к дескриптору диспетчера dpp и устанавливает заданные флаги flags. Когда fd разблокируется, функция func вызывается с аргументом handle.
Обработчик
Аргумент func – это предоставляемая пользователем функция, которая будет вызвана при возникновении события, ассоциированного с fd. Она функция должна возвращать 0
, остальные значения зарезервированы. Функции передаются следующие аргументы:
- ctp
- Указатель на контекст.
- fd
- Файловый дескриптор fd с которым связано произошедшее событие.
- flags
- Тип произошедшего события. Возможные флаги flags:
- SELECT_FLAG_EXCEPT
- SELECT_FLAG_READ
- SELECT_FLAG_WRITE
- handle
- Указатель на данные функции-обработчика.
- 0
- Успешное завершение.
- -1
- Ошибка. Код ошибки записан в errno.
- EINVAL
- Неправильный аргумент.
- ENOMEM
- Недостаточно памяти.
Пример с select_attach() см. в разделе dispatch_create(). Другие примеры с использованием интерфейсов диспетчера см. на страницах описания message_attach(), resmgr_attach() и thread_pool_create().
ЗОСРВ «Нейтрино»
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
select_attr_t, select_detach(), select_query()
Предыдущий раздел: Описание API системной библиотеки