SIGVEC(3) | Руководство программиста Linux | SIGVEC(3) |
sigvec, sigblock, sigsetmask, siggetmask, sigmask - программный интерфейс сигналов BSD
#include <signal.h>
int sigvec(int sig, const struct sigvec *vec, struct sigvec *ovec);
int sigmask(int signum);
int sigblock(int mask);
int sigsetmask(int mask);
int siggetmask(void);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
Для всех функций, показанных выше: Начиная с glibc 2.19: _DEFAULT_SOURCE в glibc 2.19 и старее: _BSD_SOURCE
Данные функции предоставляются glibc для совместимости с программами, в которых используются старый программный интерфейс сигналов BSD. Данный программный интерфейс устарел: в новых приложениях нужно использовать программный интерфейс сигналов POSIX (sigaction(2), sigprocmask(2) и т.п.).
Функция sigvec() назначает или возвращает обработчик сигнала sig (подобно POSIX sigaction(2)). Если vec не равно NULL, то это значение указывает на структуру sigvec, в которой определён новый обработчик для sig. Если ovec не равно NULL, то это значение указывает на структуру sigvec, которая используется для возврата предыдущего обработчика sig. Чтобы получить текущий обработчик sig без его изменения, укажите NULL в vec и не-null указатель в ovec.
Обработку сигналов SIGKILL и SIGSTOP невозможно изменить.
Структура sigvec описана следующим образом:
struct sigvec { void (*sv_handler)(int); /* обработчик сигнала */ int sv_mask; /* сигналы для блокировки в обработчике */ int sv_flags; /* флаги */ };
В поле sv_handler задаётся обработчик сигнала и это может быть: адрес функции сигнального обработчика; SIG_DFL, означающее, что к сигналу применяется обработчик по умолчанию; SIG_IGN, означающее, что сигнал игнорируется.
Если в sv_handler задан адрес обработчика сигнала, то в sv_mask задаётся маска сигналов, которые будут блокироваться на время выполнения обработчика. Также блокируется сигнал, для которого вызывается обработчик. Попытка заблокировать SIGKILL или SIGSTOP просто игнорируется.
Если в sv_handler задан адрес обработчика сигнала, то в поле sv_flags задаются флаги, контролирующие, что происходит при вызове обработчика. Это поле может содержать ноль или несколько следующих флагов:
Макрос sigmask() создаёт и возвращает «сигнальную маску» для signum. Например, мы можем инициализировать поле vec.sv_mask передаваемого в sigvec() с помощью такого кода:
vec.sv_mask = sigmask(SIGQUIT) | sigmask(SIGABRT); /* Блокировать SIGQUIT и SIGABRT при выполнении обработчика */
Функция sigblock() добавляет сигналы в mask в сигнальную маску процесса (подобно POSIX sigprocmask(SIG_BLOCK)) и возвращает старую сигнальную маску процесса. Попытка блокировать SIGKILL или SIGSTOP просто игнорируется.
Функция sigsetmask() устанавливает сигнальную маску процесса равной значению mask (подобно POSIX sigprocmask(SIG_SETMASK)) и возвращает старую сигнальную маску процесса.
Функция siggetmask() возвращает текущую сигнальную маску процесса. Этот вызов эквивалентен sigblock(0).
При успешном выполнении sigvec() возвращается 0; при ошибке возвращается -1, а в errno содержится код ошибки.
Функции sigblock() и sigsetmask() возвращают предыдущую сигнальную маску процесса.
Макрос sigmask() возвращает сигнальную маску для signum.
Смотрите раздел ОШИБКИ в sigaction(2) и sigprocmask(2).
Начиная с версии 2.21, библиотека GNU C больше не экспортирует функцию sigvec() как часть программного интерфейса (для обеспечения обратной совместимости схема версий символов glibc продолжает экспортировать интерфейс для двоичного кода, скомпонованного со старыми версиями библиотеки).
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
sigvec(), sigmask(), sigblock(), sigsetmask(), siggetmask() | Безвредность в нитях | MT-Safe |
Все эти функции появились из 4.3BSD, за исключением siggetmask(), чьё происхождение неясно. Эти функции устарели: не используйте их в новых программах.
В 4.3BSD, функция signal() предоставляет надёжную семантику (как при вызове sigvec() со значением vec.sv_mask равным 0). В System V, signal() предоставляет ненадёжную семантику. В POSIX.1 эти аспекты signal() не определены. Подробности смотрите в signal(2).
Для ожидания сигналов в BSD и System V предоставляется функция sigpause(3), но в других системах она описана с другим аргументом. Подробности смотрите в sigpause(3).
kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), raise(3), sigpause(3), sigset(3), signal(7)
2017-09-15 | Linux |