Определить действие, выполняемое при получении сигнала
#include <sys/neutrino.h>int SignalAction( pid_t pid,void (*sigstub)(),int signo,const struct sigaction *act,struct sigaction *oact );int SignalAction_r( pid_t pid,void * (*sigstub)(),int signo,const struct sigaction *act,struct sigaction *oact );
0
для текущего процесса.NULL
или указатель на struct sigaction, определяющую новое действие для сигнала.NULL
или указатель на struct sigaction, где функция может хранить старое действие.libc
Системные вызовы SignalAction() и SignalAction_r() позволяют вызывающему процессу проверить и/или установить действие, которое должно быть связано с конкретным сигналом в процессе pid. Если pid равен нулю, используется вызывающий процесс. Аргумент signo определяет сигнал.
![]() | Следует вызывать функцию POSIX sigaction() или функцию ANSI signal() вместо прямого использования этих системных вызовов. |
Эти функции идентичны, за исключением способа индикации ошибок.
Сигналы POSIX
Сигналы определены в <signal.h>
, как и эти глобальные переменные:
Существует 32 сигнала POSIX 1003.1a, в их числе:
_NTO_TCTL_IO:
ThreadCtl( _NTO_TCTL_IO, 0 );
![]() | Невозможно перехватить или игнорировать SIGCONT , SIGKILL , или SIGSTOP . |
Существует 16 POSIX 1003.1b сигналов реального времени, в их числе:
Весь диапазон сигналов идет от _SIGMIN
(1
) до _SIGMAX
(64
).
Дополнительные сигналы ЗОСРВ «Нейтрино»
ЗОСРВ «Нейтрино» использует первые восемь сигналов для специальных целей. Они всегда маскированы, и попытки их размаскировать игнорируются. Среди них два именованных сигнала (SIGSELECT
и SIGPHOTON
) и шесть безымянных.
Действия с сигналами
Если act не равен NULL
, то указанный сигнал изменяется. Если oact не равен NULL
, предыдущее действие сохраняется в структуре, на которую оно указывает. Можно использовать различные комбинации act и oact для запроса или установки (или того и другого) действия для сигнала.
Находясь в обработчике, signo маскируется, предотвращая вложенные сигналы одного и того же типа. Кроме того, любые сигналы, установленные в поле sa_mask структуры act, также объединяются в маске с помощью операции ИЛИ. Когда обработчик завершается штатно, предыдущая маска восстанавливается, и действуют любые ожидающие и теперь размаскированные сигналы. Происходит возврат к тому моменту в программе, где она была прервана. Если поток был заблокирован в ядре, когда произошло прерывание, системный вызов завершается с EINTR
(исключения см. в ChannelCreate() и SyncMutexLock()).
![]() | Небезопасно использовать операции с плавающей запятой в обработчиках сигналов. |
При указании обработчика, необходимо указать адрес обработчика заглушки сигнала для sigstub. Это небольшой фрагмент кода в пространстве пользователя, который связывает пользовательский обработчик сигналов с ядром. Библиотека предоставляет стандартную заглушку __signalstub().
Обработчики сигналов и действия определяются для процесса и влияют на все его потоки. Например, если один поток игнорирует сигнал, то все потоки в процессе также будут игнорировать данный сигнал.
Можно передать сигнал потоку, процесс или группе процессов (см. SignalKill()). При направлении сигнала процессу, сигнал получает не более одного потока. Этот поток должен иметь разблокированный сигнал (см. SignalProcmask()), чтобы быть кандидатом на его получение. Все синхронно сгенерированные сигналы (например, SIGSEGV
) всегда доставляются в вызвавший их поток.
В многопоточном процессе, если сигнал завершает поток, то, по умолчанию, все потоки и, следовательно, процесс завершаются. Можно переопределить это стандартное поведение POSIX при создании потока; см. ThreadCreate().
![]() | При использовании longjmp() для возврата из обработчика сигнала, сигнал остается маскированным. Можное использовать siglongjmp() для восстановления маски в состояние, сохраненное предыдущим вызовом sigsetjmp(). |
Эти вызовы не блокируются.
-1
, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.EOK
возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.
1
или больше _SIGMAX
, либо была произведена попытка установить SIGKILL
или SIGSTOP
на что-то отличное от SIG_DFL
. ЗОСРВ «Нейтрино»
struct sigaction, abort(), ChannelCreate(), kill(), longjmp(), siglongjmp(), signal(), sigaction(), SignalKill(), SignalProcmask(), sigqueue(), sigsetjmp(), SyncMutexLock(), ThreadCreate(), wait(), waitpid()
Предыдущий раздел: Описание API системной библиотеки