Other Alias
rt_sigprocmask
ОБЗОР
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
sigprocmask(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
ОПИСАНИЕ
Вызов sigprocmask() используется для выборки и/или изменения маски
сигналов вызывающей нити. Маска сигналов представляет собой набор сигналов,
чья доставка в настоящее время заблокирована вызывающим (подробнее об этом
смотрите также в signal(7)).
Работа вызова зависит от значения how:
SIG_BLOCK Набор блокируемых сигналов — объединение текущего набора и аргумента set.
SIG_UNBLOCK Сигналы в set удаляются из списка блокируемых сигналов. Допускается разблокировать незаблокированные сигналы.
SIG_SETMASK Набор блокируемых сигналов приравнивается к аргументу set.
Если значение oldset не равно NULL, то предыдущее значение маски сигналов записывается в oldset.
Если значение set равно NULL, то маска сигналов не изменяется (т.е., значение how игнорируется), но текущее значение маски сигналов всё же возвращается в oldset (если его значение не равно NULL).
Использование sigprocmask() в многонитиевых процессах не определено; смотрите pthread_sigmask(3).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция sigprocmask() возвращает 0 и -1 при
ошибке. В случае ошибки в errno указывается номер ошибки.
ОШИБКИ
EFAULT Аргумент set или oldset указывает за пределы выделенного адресного пространства процесса.
EINVAL Неверное значение в how.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.
ЗАМЕЧАНИЯ
Невозможно заблокировать SIGKILL или SIGSTOP. Попытка выполнить это
просто игнорируется.
Каждая нить процесса имеют свою маску сигналов.
Потомок, создаваемый с помощью fork(2), наследует копию родительской маски сигналов; маска сигналов сохраняется при вызове execve(2).
Если генерируется сигнал SIGBUS, SIGFPE, SIGILL или SIGSEGV, а он заблокирован, то результат не определён, если сигнал был сгенерирован не из kill(3), sigqueue(3) или raise(3).
Подробная информация о работе с наборами сигналов есть на странице sigsetops(3).
Отличия между библиотекой C и ядром
Обёрточная функция glibc для sigprocmask() просто игнорирует попытки блокирования двух сигналов реального времени, которые используются внутри реализации NPTL. Подробности смотрите в nptl(7).Первоначально, системный вызов Linux назывался sigprocmask(). Однако, с добавлением сигналов реального времени в Linux 2.2, 32-битный аргумент sigset_t неизменяемого размера, поддерживаемый этим системным вызовом, не мог больше использоваться. В результате был добавлен новый системный вызов rt_sigprocmask() с увеличенным типом sigset_t. У нового системного вызова появился четвёртый аргумент, size_t sigsetsize, в котором указывается размер (в байтах) наборов сигналов set и oldset. В настоящее время значение этого аргумента должно быть равно sizeof(sigset_t) (иначе возникает ошибка EINVAL). Обёрточная функция glibc sigprocmask() скрывает это и вызывает rt_sigprocmask(), если он есть в ядре.