SignalProcmask(), SignalProcmask_r()

Изменить маску сигналов потока

Прототип:

#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 );

Аргументы:

pid
0 или идентификатор процесса (pid, process ID).
tid
0 или идентификатор потока (tid, thread ID).
how
Способ изменения set:
SIG_BLOCK
результирующая маска представляет собой объединение текущей маски и маски сигналов, на которую указывает set.
SIG_UNBLOCK
результирующая маска является пересечением текущей маски и маски сигналов, на которую указывает set.
SIG_SETMASK
результирующая маска - это маски сигналов, на которую указывает set.

В качестве особого случая можно использовать аргумент how для запроса текущей маски ожидающих сигналов:
SIG_PENDING
объединенная маска ожидающих сигналов в потоке и процессе сохраняется в маске oldset. Аргумент set игнорируется.
set
NULL или указатель на объект sigset_t, указывающий набор сигналов, который будет использоваться для изменения текущей заблокированный набор.
oldset
NULL или указатель на объект sigset_t, где функция может хранить предыдущую заблокированную маску сигналов. Можно использовать различные комбинации set и oldset для запроса и/или изменения маски блокированных сигналов.

Библиотека:

libc

Описание:

Данные системные вызовы изменяют или проверяют маску блокированных сигналов потока tid процесса pid. Если pid равен нулю, то подразумевается текущий процесс. Если tid равен нулю, то подразумевается вызывающий поток текущего процесса.

Функции SignalProcmask() и SignalProcmask_r() идентичны, за исключением того, как они информируют об ошибках.


Note: Вместо прямого использования данных системных вызовов, следует рассмотреть возможность вызовов pthread_sigmask() или sigprocmask().

Когда сигнал размаскирован, ядро проверяет наличие ожидающих сигналов в потоке и, если таковых нет, проверяется наличие ожидающих сигналов в процессе:

Проверка Действие
Сигнал ожидает в потоке Сигнал немедленно обрабатывается.
Сигнал ожидает в процессе Сигнал назначается потоку и немедленно обрабатывается.
Нет ожидающих сигналов Никаких действий с сигналом не выполняется до поступления незаблокированного сигнала.

Невозможно заблокировать сигналы SIGCONT, SIGKILL и SIGSTOP. Также невозможно размаскировать специальные сигналы ЗОСРВ «Нейтрино» (SIGSELECT, SIGPHOTON и шесть безымянных).

Когда вызывается обработчик сигнала, соответствующий сигнал автоматически маскируется перед вызовом его обработчика (см. SignalAction()). Если обработчик завершается штатно, операционная система восстанавливает маску сигналов, имевшуюся непосредственно перед вызовом обработчика в виде атомарной операции. Изменения, сделанные с помощью SignalProcmask() в обработчике, отменяются.

Когда сигнал поступает в процесс, ядро доставляет его не более чем одному потоку (см. SignalKill()), в котором данный сигнал разблокирован. Даже если сигнал разблокирован в нескольких потоках, сигнал поступает только в один поток. Какой именно поток получит сигнал заранее не известно. Чтобы точно задать поток, можно сделать следующее:

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

Сигналы, направленные на поток, всегда воздействуют только на этот поток.

Состояния блокировки:

Эти вызовы не блокируются.

Возвращаемое значение:

SignalProcmask()
Если возникла ошибка функция возвращает -1, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.
SignalProcmask_r()
EOK возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.

Коды ошибок:

EAGAIN
Системе не удалось выделить память для обработчика сигнала. Критически низкий уровень памяти.
EFAULT
Произошла ошибка при попытке ядра получить доступ к предоставленным буферам.
EINVAL
Недопустимое значение how или была произведена попытка установить для SIGKILL или SIGSTOP значение, отличное от SIG_DFL.
EPERM
У процесса нет разрешения на изменение маски сигнала указанного процесса.
ESRCH
Процесс, указанный в pid, или поток, указанный в tid, не существует.

Классификация:

ЗОСРВ «Нейтрино»

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

pthread_sigmask(), SignalAction(), SignalKill(), sigprocmask()




Предыдущий раздел: Описание API системной библиотеки