Структура, описывающая событие
Структура 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 системной библиотеки