ИМЯ
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.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
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 <[email protected]>, Azamat Hackimov <[email protected]>, Hotellook, Nikita <[email protected]>, Spiros Georgaras <[email protected]>, Vladislav <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]3 декабря 2022 г. | Linux man-pages 6.03 |