struct sigevent

Структура, описывающая событие

Прототип:

Структура 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 в соответствующее значение.


Note:
  • Эти макросы являются расширениями ЗОСРВ «Нейтрино».

  • Библиотека может использовать скрытые биты в поле sigev_notify структуры sigevent. Если проверить значение этого поля после создания sigevent, не следует сравнивать его напрямую со значением; лучше использовать макрос SIGEV_GET_TYPE(). Например, вместо:

    if ( my_event.sigev_notify == SIGEV_PULSE )

    следует использовать:

    if ( SIGEV_GET_TYPE( &my_event ) == SIGEV_PULSE )


SIGEV_INTR
Отправить уведомление о прерывании в конкретный поток. Никакие поля в структуре не используются. Макрос инициализации: SIGEV_INTR_INIT( &event )
SIGEV_NONE
Не отправлять уведомлений. Никакие поля в структуре не используются. Макрос инициализации: SIGEV_NONE_INIT( &event )
SIGEV_PULSE
Отправить импульс. Используются следующие поля:
int sigev_coid
Идентификатор соединения. Должен быть присоединен к каналу, в который будет отправлен импульс.
short sigev_priority
Приоритет импульса. Если требуется, чтобы поток, получающий импульс, выполнялся с первоначальным приоритетом процесса, следует установить для sigev_priority значение SIGEV_PULSE_PRIO_INHERIT.
short sigev_code
Код, который должен интерпретироваться обработчиком импульсов. Хоть sigev_code и может быть любым 8-битным значением со знаком, следует избегать значений sigev_code меньше нуля, чтобы избежать конфликта с ядром или кодами импульсов, сгенерированными менеджером ЗОСРВ «Нейтрино». Все эти коды начинаются с _PULSE_CODE_ и определяются в <sys/neutrino.h>; для получения дополнительной информации см. документацию к структуре struct _pulse. Безопасный диапазон значений импульсов — от _PULSE_CODE_MINAVAIL до _PULSE_CODE_MAXAVAIL.
void *sigev_value.sival_int
32-битное значение, которое будет интерпретироваться обработчиком импульсов.

Макрос инициализации: SIGEV_PULSE_INIT( &event, coid, priority, code, value )
SIGEV_SIGNAL
Отправить сигнал процессу. Используются следующие поля:
int sigev_signo
Передаваемый сигнал. Он должен быть в диапазоне от 1 до NSIG — 1.

Макрос инициализации: SIGEV_SIGNAL_INIT( &event, signal ). Если требуется установить sigev_value для события SIGEV_SIGNAL (например, если установлен SA_SIGINFO), можно использовать макрос: SIGEV_SIGNAL_VALUE_INIT( &event, signal, value )
SIGEV_SIGNAL_CODE
Аналогично SIGEV_SIGNAL, за исключением того, что SIGEV_SIGNAL_CODE также включает значение и код. Используются следующие поля:
int sigev_signo
Передаваемый сигнал. Он должен быть в диапазоне от 1 до NSIG — 1.
short sigev_code
Код, который должен интерпретироваться обработчиком сигнала. Это должно быть значение в диапазоне от SI_MINAVAIL до SI_MAXAVAIL.
void *sigev_value.sival_int
32-битное значение, которое будет интерпретироваться обработчиком сигнала.

Макрос инициализации: SIGEV_SIGNAL_CODE_INIT( &event, signal, value, code )
SIGEV_SIGNAL_THREAD
Отправить сигнал в конкретный поток, в зависимости от ситуации: В случае таймеров, SyncMutexEvent(), и прерываний, если поток умирает до того, как событие будет доставлено, ядро отправляет сигнал случайному потоку в этом же процессе. Используются следующие поля:
int sigev_signo
Передаваемый сигнал. Он должен быть в диапазоне от 1 до NSIG — 1.
short sigev_code
Код, который должен интерпретироваться обработчиком сигнала. Это должно быть значение в диапазоне от SI_MINAVAIL до SI_MAXAVAIL.
void *sigev_value.sival_int
32-битное значение, которое будет интерпретироваться обработчиком сигнала.

Макрос инициализации: SIGEV_SIGNAL_THREAD_INIT( &event, signal, value, code )
SIGEV_THREAD
Создать новый поток.

Note: Не рекомендуется использовать этот тип событий. Импульсы более эффективны.

Используются следующие поля:
void (*sigev_notify_function)( union sigval )
Указатель на функцию, которую необходимо уведомить. Аргумент имеет тип union sigval.
pthread_attr *sigev_notify_attributes
Указатель на атрибуты потока. Должен быть NULL или указывать на структуру, инициализированную pthread_attr_init() во время доставки.
void *sigev_value.sival_ptr
Значение, которое должно быть передано функции уведомления.

Макрос инициализации: SIGEV_THREAD_INIT( &event, fn, value, attr ).
SIGEV_UNBLOCK
Принудительно разблокировать поток. Никакие другие поля в структуре не используются. Макрос инициализации: SIGEV_UNBLOCK_INIT( &event )

Критические потоки

При использовании адаптивного партиционирования, можно использовать sigevent, чтобы заставить поток исполняться как критический или наоборот.

После соответствующей настройки структуры sigevent следует использовать эти макросы, чтобы установить или сбросить дополнительный бит, который делает поток критическим:

SIGEV_MAKE_CRITICAL( &event )
Заставить целевой поток работать как критический.
SIGEV_CLEAR_CRITICAL( &event )
Заставить целевой поток работать как некритический.

Принимающий поток при этом не должен прилагать усилий чтобы сделать себя (не)критическим. Планировщик адаптивного партиционирования делает это автоматически.


Caution: Эти макросы используют дополнительные биты в поле 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 системной библиотеки