Изменить маску сигналов потока
#include <sys/neutrino.h>int SignalProcmask( pid_t pid,int tid,int how,const sigset_t *set,sigset_t *oldset );int SignalProcmask_r( pid_t pid,int tid,int how,const sigset_t *set,sigset_t *oldset );
0
или идентификатор процесса (pid, process ID).0
или идентификатор потока (tid, thread ID).NULL
или указатель на объект sigset_t
, указывающий набор сигналов, который будет использоваться для изменения текущей заблокированный набор.NULL
или указатель на объект sigset_t
, где функция может хранить предыдущую заблокированную маску сигналов. Можно использовать различные комбинации set и oldset для запроса и/или изменения маски блокированных сигналов.libc
Данные системные вызовы изменяют или проверяют маску блокированных сигналов потока tid процесса pid. Если pid равен нулю, то подразумевается текущий процесс. Если tid равен нулю, то подразумевается вызывающий поток текущего процесса.
Функции SignalProcmask() и SignalProcmask_r() идентичны, за исключением того, как они информируют об ошибках.
Вместо прямого использования данных системных вызовов, следует рассмотреть возможность вызовов pthread_sigmask() или sigprocmask(). |
Когда сигнал размаскирован, ядро проверяет наличие ожидающих сигналов в потоке и, если таковых нет, проверяется наличие ожидающих сигналов в процессе:
Проверка | Действие |
---|---|
Сигнал ожидает в потоке | Сигнал немедленно обрабатывается. |
Сигнал ожидает в процессе | Сигнал назначается потоку и немедленно обрабатывается. |
Нет ожидающих сигналов | Никаких действий с сигналом не выполняется до поступления незаблокированного сигнала. |
Невозможно заблокировать сигналы SIGCONT
, SIGKILL
и SIGSTOP
. Также невозможно размаскировать специальные сигналы ЗОСРВ «Нейтрино» (SIGSELECT
, SIGPHOTON
и шесть безымянных).
Когда вызывается обработчик сигнала, соответствующий сигнал автоматически маскируется перед вызовом его обработчика (см. SignalAction()). Если обработчик завершается штатно, операционная система восстанавливает маску сигналов, имевшуюся непосредственно перед вызовом обработчика в виде атомарной операции. Изменения, сделанные с помощью SignalProcmask() в обработчике, отменяются.
Когда сигнал поступает в процесс, ядро доставляет его не более чем одному потоку (см. SignalKill()), в котором данный сигнал разблокирован. Даже если сигнал разблокирован в нескольких потоках, сигнал поступает только в один поток. Какой именно поток получит сигнал заранее не известно. Чтобы точно задать поток, можно сделать следующее:
Если все потоки заблокировали сигнал, сигнал начинает ожидать обработки. Первый поток, который разблокирует сигнал, получит ожидающий сигнал. Если сигнал находится в состоянии ожидания на потоке, он никогда не перенаправится на процесс или другой поток, независимо от изменений в маске блокировки сигнала.
Сигналы, направленные на поток, всегда воздействуют только на этот поток.
Эти вызовы не блокируются.
-1
, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.EOK
возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.
SIGKILL
или SIGSTOP
значение, отличное от SIG_DFL
. ЗОСРВ «Нейтрино»
pthread_sigmask(), SignalAction(), SignalKill(), sigprocmask()
Предыдущий раздел: Описание API системной библиотеки