Структура, описывающая событие
Структура sigevent
, определенная в <sys/siginfo.h>
.
Данная структура описывает событие. Целочисленное поле sigev_notify указывает, как должно происходить уведомление, а также какие еще поля структуры используются:
sigev_notify | sigev_signo | sigev_coid | sigev_priority | sigev_code | sigev_value |
---|---|---|---|---|---|
SIGEV_INTR | |||||
SIGEV_NONE | |||||
SIGEV_PULSE | Соединение | Приоритет | Код | Значение | |
SIGEV_SIGNAL | Сигнал | ||||
SIGEV_SIGNAL_CODE | Сигнал | Код | Значение | ||
SIGEV_SIGNAL_THREAD | Сигнал | Код | Значение | ||
SIGEV_THREAD (специальное - см. ниже) | Значение | ||||
SIGEV_UNBLOCK |
Файл <sys/siginfo.h>
также определяет некоторые макросы, упрощающие инициализацию структуры sigevent
. Все макросы принимают указатель на структуру sigevent
в качестве своего первого аргумента, событие, и устанавливают значение поля sigev_notify в соответствующее значение.
|
SIGEV_INTR_INIT
( &event ) SIGEV_NONE_INIT
( &event ) SIGEV_PULSE_PRIO_INHERIT
. 8
-битным значением со знаком, следует избегать значений sigev_code меньше нуля, чтобы избежать конфликта с ядром или кодами импульсов, сгенерированными менеджером ЗОСРВ «Нейтрино». Все эти коды начинаются с _PULSE_CODE_
и определяются в <sys/neutrino.h>
; для получения дополнительной информации см. документацию к структуре struct _pulse. Безопасный диапазон значений импульсов — от _PULSE_CODE_MINAVAIL
до _PULSE_CODE_MAXAVAIL
. SIGEV_PULSE_INIT
( &event, coid, priority, code, value ) 1
до NSIG — 1
. SIGEV_SIGNAL_INIT
( &event, signal ). Если требуется установить sigev_value для события SIGEV_SIGNAL
(например, если установлен SA_SIGINFO
), можно использовать макрос: SIGEV_SIGNAL_VALUE_INIT
( &event, signal, value ) SIGEV_SIGNAL
, за исключением того, что SIGEV_SIGNAL_CODE
также включает значение и код. Используются следующие поля: 1
до NSIG — 1
. SI_MINAVAIL
до SI_MAXAVAIL
. 32
-битное значение, которое будет интерпретироваться обработчиком сигнала. SIGEV_SIGNAL_CODE_INIT
( &event, signal, value, code ) 1
до NSIG — 1
. SI_MINAVAIL
до SI_MAXAVAIL
. 32
-битное значение, которое будет интерпретироваться обработчиком сигнала. SIGEV_SIGNAL_THREAD_INIT
( &event, signal, value, code ) Не рекомендуется использовать этот тип событий. Импульсы более эффективны. |
NULL
или указывать на структуру, инициализированную pthread_attr_init() во время доставки. SIGEV_THREAD_INIT
( &event, fn, value, attr ). SIGEV_UNBLOCK_INIT
( &event ) Критические потоки
При использовании адаптивного партиционирования, можно использовать sigevent
, чтобы заставить поток исполняться как критический или наоборот.
После соответствующей настройки структуры sigevent
следует использовать эти макросы, чтобы установить или сбросить дополнительный бит, который делает поток критическим:
Принимающий поток при этом не должен прилагать усилий чтобы сделать себя (не)критическим. Планировщик адаптивного партиционирования делает это автоматически.
Эти макросы используют дополнительные биты в поле sigev_notify структуры sigevent . Не стоит сравнивать это поле напрямую со значением; вместо этого следует использовать макрос SIGEV_GET_TYPE(), как описано выше. |
ЗОСРВ «Нейтрино»
ds_create(), InterruptAttach(), InterruptAttachEvent(), iofunc_notify(), iofunc_notify_trigger(), ionotify(), lio_listio(), mq_notify(), MsgDeliverEvent(), MsgReceivev*(), procmgr_event_notify(), struct _pulse, union sigval, SyncMutexEvent(), TimerCreate(), timer_create(), TimerInfo(), TimerTimeout(), timer_timeout()
Предыдущий раздел: Описание API системной библиотеки