sigprocmask(2)

ИМЯ
sigprocmask, rt_sigprocmask - проверка и изменение блокировки сигналов

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#include <signal.h>

/* Prototype for the glibc wrapper function */
int sigprocmask(int how, const sigset_t *_Nullable restrict set,
                           sigset_t *_Nullable restrict oldset);

#include <signal.h>           /* Definition of SIG_* constants */
#include <sys/syscall.h>      /* Definition of SYS_* constants */
#include <unistd.h>

/* Prototype for the underlying system call */
int syscall(SYS_rt_sigprocmask, int how,
                           const kernel_sigset_t *_Nullable set,
                           kernel_sigset_t *_Nullable oldset,
                           size_t sigsetsize);

/* Prototype for the legacy system call */
[[deprecated]] int syscall(SYS_sigprocmask, int how,
                           const old_kernel_sigset_t *_Nullable set,
                           old_kernel_sigset_t *_Nullable oldset);

    Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

sigprocmask():
    _POSIX_C_SOURCE

ОПИСАНИЕ
Вызов sigprocmask() используется для выборки и/или изменения маски сигналов вызывающей нити. Маска сигналов представляет собой набор сигналов, чья доставка в настоящее время заблокирована вызывающим (подробнее об этом смотрите также в signal(7)).

Работа вызова зависит от значения how:

SIG_BLOCK
    Набор блокируемых сигналов — объединение текущего набора и аргумента set.

SIG_UNBLOCK
    Сигналы в set удаляются из списка блокируемых сигналов. Допускается разблокировать незаблокированные сигналы.

SIG_SETMASK
    Набор блокируемых сигналов приравнивается к аргументу set.

Если значение oldset не равно NULL, то предыдущее значение маски сигналов записывается в oldset.

Если значение set равно NULL, то маска сигналов не изменяется (т.е., значение how игнорируется), но текущее значение маски сигналов всё же возвращается в oldset (если его значение не равно NULL).

Функции для изменения и получения переменных с типом sigset_t («наборы сигналов») описаны в sigsetops(3).

Использование sigprocmask() в многонитевых процессах не определено; смотрите pthread_sigmask(3).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
sigprocmask() returns 0 on success. On failure, -1 is returned and errno is set to indicate the error.

ОШИБКИ

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(), если это необходимо ядру.

СМ. ТАКЖЕ
kill(2), pause(2), sigaction(2), signal(2), sigpending(2), sigsuspend(2), pthread_sigmask(3), sigqueue(3), sigsetops(3), signal(7)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.