sigignore - программный интерфейс сигналов System
sigignore(3)
программный интерфейс сигналов System
Other Alias
sigset, sighold, sigrelse
ОБЗОР
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t sigset(int sig, sighandler_t disp);
int sighold(int sig);
int sigrelse(int sig);
int sigignore(int sig);
Требования макроса тестирования свойств для glibc
(см. feature_test_macros(7)):
sigset(), sighold(), sigrelse(), sigignore():
_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
ОПИСАНИЕ
Данные функции предоставляются glibc для совместимости с программами, в
которых используются старый программный интерфейс сигналов System V. Данный
программный интерфейс устарел: в новых приложениях нужно использовать
программный интерфейс сигналов POSIX (sigaction(2), sigprocmask(2) и
т.п.).
Функция sigset() изменяет обработку сигнала sig. В аргументе disp
может быть указан адрес функции обработчика сигнала или одна из следующих
констант:
SIG_DFL
Сбросить обработку sig в значение по умолчанию.
SIG_IGN
Игнорировать sig.
SIG_HOLD
Добавить sig в маску сигналов процесса, но оставить обработку sig
неизменной.
Если в disp задан адрес обработчика сигналов, то при его выполнении
sig добавляется в маску сигналов процесса.
Если в disp было указано значение отличное от SIG_HOLD, то sig
удаляется из маски сигналов процесса.
Обработку сигналов SIGKILL и SIGSTOP невозможно изменить.
Функция sighold() добавляет sig в маску сигналов вызвавшего процесса.
Функция sigrelse() удаляет sig из маски сигналов вызвавшего процесса.
Функция sigignore() устанавливает обработку sig равной SIG_IGN.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении sigset() возвращает SIG_HOLD, если sig был
заблокирован до вызова, или предыдущий обработчик сигнала, если блокировки
не было. При ошибке sigset() возвращает -1, а errno записывает номер
ошибки (но смотрите раздел ДЕФЕКТЫ далее).
При успешном выполнении функции sighold(), sigrelse() и sigignore()
возвращают 0; при ошибке возвращается -1, а в errno — номер ошибки.
ОШИБКИ
Для функции sigset() смотрите раздел
ОШИБКИ в sigaction(2) и
sigprocmask(2).
Для функции sighold() и sigrelse() смотрите раздел
ОШИБКИ в
sigprocmask(2).
Для функции sigignore() смотрите раздел
ОШИБКИ в
sigaction(2).
АТРИБУТЫ
Описание терминов данного раздела смотрите в
attributes(7).
Интерфейс Атрибут Значение
sigset(),
sighold(),
sigrelse(),
sigignore()
безвредность в потоках: безвредно (MT-Safe)
СООТВЕТСТВИЕ СТАНДАРТАМ
Существует в SVr4, POSIX.1-2001, POSIX.1-2008. Эти функции устарели: не
используйте их в новых программах. В POSIX.1-2008 функции
sighold(),
sigignore(),
sigpause(),
sigrelse() и
sigset() помечены как
устаревшие, вместо них рекомендуется использовать
sigaction(2),
sigprocmask(2),
pthread_sigmask(3) и
sigsuspend(2).
ЗАМЕЧАНИЯ
Данные функции впервые появились в glibc 2.1.
Тип sighandler_t является расширением GNU; в этой странице он
используется только для более понятного описания прототипа sigset().
Функция sigset() предоставляет семантику надёжной обработки сигналов (как
при вызове sigaction(2) с значением sa_mask равным 0).
В System V, функция signal() предоставляет ненадёжную семантику (как при
вызове sigaction(2) со значением sa_mask равным SA_RESETHAND |
SA_NODEFER). В BSD, signal() предоставляет надёжную семантику. В
POSIX.1-2001 эти аспекты signal() не определены. Подробности смотрите в
signal(2).
Для ожидания сигналов в BSD и System V предоставляется функция
sigpause(3), но в других системах она описана с другим
аргументом. Подробности смотрите в sigpause(3).
ДЕФЕКТЫ
В версиях glibc до 2.2,
sigset() не блокирует
sig, если в
disp было
указано значение, отличное от
SIG_HOLD.
В версиях glibc до 2.5, sigset() в двух случаях некорректно возвращает
предыдущий обработчик сигнала. Во-первых, если disp равно SIG_HOLD, то
при успешном выполнении sigset() всегда возвращается SIG_HOLD. Вместо
этого должен возвращаться предыдущий обработчик сигнала (если сигнал не
заблокирован, в этом случае должно возвращаться SIG_HOLD). Во-вторых,
если сигнал в данный момент заблокирован, то возвращаемое значение
успешного выполнения sigset() должно быть равно SIG_HOLD. Вместо этого
возвращается предыдущий обработчик сигнала. Эти проблемы были устранены
начиная с glibc 2.5.