Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

       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⟩.