Linux
2017-09-15
Aliases: rt_sigprocmask(2), rt_sigprocmask(2), rt_sigprocmask(2), rt_sigprocmask(2), rt_sigprocmask(2), rt_sigprocmask(2)
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages-dev
Manual pages about using GNU/Linux for development
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
sigprocmask, rt_sigprocmask - проверка и изменение блокировки сигналов
ОБЗОР
#include <signal.h>
/* Прототип обёрточной функции glibc */ int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/* Прототип используемого системного вызова */ int rt_sigprocmask(int how, const kernel_sigset_t *set, kernel_sigset_t *oldset, size_t sigsetsize);
/* Прототип устаревшего системного вызова */ int sigprocmask(int how, const old_kernel_sigset_t *set, old_kernel_sigset_t *oldset);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
sigprocmask(): _POSIX_C_SOURCE
ОПИСАНИЕ
Вызов sigprocmask() используется для выборки и/или изменения маски сигналов вызывающей нити. Маска сигналов представляет собой набор сигналов, чья доставка в настоящее время заблокирована вызывающим (подробнее об этом смотрите также в signal(7)).
Если значение oldset не равно NULL, то предыдущее значение маски сигналов записывается в oldset.
Работа вызова зависит от значения how:
SIG_BLOCK | |
Набор блокируемых сигналов — объединение текущего набора и аргумента set. | |
SIG_UNBLOCK | |
Сигналы в set удаляются из списка блокируемых сигналов. Допускается разблокировать незаблокированные сигналы. | |
SIG_SETMASK | |
Набор блокируемых сигналов приравнивается к аргументу set. |
Если значение set равно NULL, то маска сигналов не изменяется (т.е., значение how игнорируется), но текущее значение маски сигналов всё же возвращается в oldset (если его значение не равно NULL).
Функции для изменения и получения переменных с типом sigset_t («наборы сигналов») описаны в sigsetops(3).
Использование sigprocmask() в многонитевых процессах не определено; смотрите pthread_sigmask(3).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция sigprocmask() возвращает 0 и -1 при ошибке. В случае ошибки в errno указывается номер ошибки.
ОШИБКИ
EFAULT | Аргумент set или oldset указывает за пределы выделенного адресного пространства процесса. |
EINVAL | Значение how некорректно или ядро не поддерживает размер, переданный в sigsetsize. |
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.
ЗАМЕЧАНИЯ
Невозможно заблокировать SIGKILL или SIGSTOP. Попытка выполнить это просто игнорируется.
Каждая нить процесса имеют свою маску сигналов.
Потомок, создаваемый с помощью fork(2), наследует копию родительской маски сигналов; маска сигналов сохраняется при вызове execve(2).
Если генерируется сигнал SIGBUS, SIGFPE, SIGILL или SIGSEGV, а он заблокирован, то результат не определён, если сигнал был сгенерирован не из kill(3), sigqueue(3) или raise(3).
Подробная информация о работе с наборами сигналов есть на странице sigsetops(3).
Заметим, что разрешается (хотя не очень полезно) передавать в set и oldset значение NULL.
Отличия между библиотекой C и ядром
Определение ядра sigset_t отличается по размеру от используемого в библиотеке C. В данной справочной странице оно упоминается как kernel_sigset_t (хотя в исходном коде ядра оно называется sigset_t).
Обёрточная функция glibc для sigprocmask() просто игнорирует попытки блокирования двух сигналов реального времени, которые используются внутри реализации NPTL. Подробности смотрите в nptl(7).
Изначально, системный вызов Linux назывался sigprocmask(). Однако из-за добавления сигналов реального времени в Linux 2.2, 32-битный тип sigset_t (который называется old_kernel_sigset_t в этой справочной странице) постоянного размера, поддерживаемый этим системным вызовом, перестал подходить для этой цели. В связи с этим был добавлен новый системный вызов rt_sigprocmask(), поддерживающий увеличенный тип sigset_t (который называется kernel_sigset_t в этой справочной странице). У нового системного вызова есть четвёртый аргумент, size_t sigsetsize, которым задаётся размер набора сигналов (в байтах) в set и oldset. В настоящее время этот аргумент должен задаваться постоянным определяемым архитектурой значением (равен sizeof(kernel_sigset_t)).
Обёрточная функция glibc sigprocmask() скрывает эти детали от нас, вызывая rt_sigprocmask(), если это необходимо ядру.
СМОТРИТЕ ТАКЖЕ
REFERENCED BY
clone(2), poll(2), ptrace(2), rt_sigqueueinfo(2), seccomp(2), select(2), select_tut(2), sgetmask(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigsuspend(2), sigwaitinfo(2), getcontext(3), makecontext(3), posix_spawn(3), pthread_sigmask(3), sigpause(3), sigset(3), sigsetops(3), sigvec(3), system(3), nptl(7), signal(7), getcontext(2), sigblock(2freebsd), sigpause(2freebsd), rt_sigsuspend(2), rt_sigtimedwait(2), io_uring_enter(2)