sigprocmask()

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

Прототип:

#include <signal.h>
int sigprocmask( int how,
const sigset_t *set,
sigset_t *oset );

Аргументы:

how
Способ измения маски сигналов:
SIG_BLOCK
добавить сигналы, на которые указывает set, в маску потока.
SIG_UNBLOCK
исключить сигналы, на которые указывает set, из маски потока.
SIG_SETMASK
установить маску потока сигналов в значение, на которые указывает set.
set
NULL или указатель на объект sigset_t, который определяет сигналы, которые необходимо изменить в маске сигналов потока. Если этот аргумент равен NULL, аргумент how игнорируется.
oset
NULL или указатель на объект sigset_t, который функция устанавливает для указания текущей маски сигналов потока.

Библиотека:

libc

Описание:

Функция sigprocmask() используется для проверки и/или изменения маски сигналов для вызывающего потока. Если значение set не равно NULL, оно указывает на набор сигналов, которые будут использоваться для изменения текущей заблокированной маске.

Аргумент set не изменяется. Результирующая маска сохраняется в таблице процессов вызывающего потока. Если поступает маскированный сигнал, он становится в очередь ожидания, но не влияет на выполнение процесса. Можно проверить ожидающие сигналы, вызвав sigpending(). Если ожидающий сигнал размаскируется, то он обрабатывается немедленно, прежде чем эта функция завершится.

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

Функция sigaction() позволяет указать любую маску, которая применяется до вызова обработчика. Это позволяет упростить разработку нескольких обработчиков сигналов.


Note: Для обеспечения лучшей переносимости кода следует использовать pthread_sigmask() в многопоточных приложениях.

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

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EAGAIN
Недостаточно системных ресурсов для маскирования сигналов.
EFAULT
Произошла ошибка при попытке доступа к предоставленным буферам.
EINVAL
Значение how некорректно или была произведена попытка установки SIGKILL или SIGSTOP в значение, отличное от SIG_DFL.

Примеры:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
int main( void )
{
sigset_t set, oset, pset;
sigemptyset( &set );
sigaddset( &set, SIGINT );
sigprocmask( SIG_BLOCK, &set, &oset );
printf( "Old set was %8.8ld.\n", oset );
sigpending( &pset );
printf( "Pending set is %8.8ld.\n", pset );
kill( getpid(), SIGINT );
sigpending( &pset );
printf( "Pending set is %8.8ld.\n", pset );
sigprocmask( SIG_UNBLOCK, &set, &oset );
/* The program terminates with a SIGINT */
return (EXIT_SUCCESS);
}

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

POSIX 1003.1 CX

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

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

kill(), pthread_sigmask(), raise(), sigaction(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), sigismember(), signal(), SignalProcmask(), sigpending()




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