BSD 4.0 (примерно с 1980 г.) ввел дополнительные функции API для предоставления «надежных» сигналов.[109]
В частности, стало возможнымSystem V Release 3 (примерно с 1984 г.) приняла эти API и популяризовала их, в большинстве связанных с Unix документации и книгах вы, возможно, увидите, что на эти API ссылаются, как ведущие начало от System V Release 3. Эти функции следующие:
#include
int sighold(int sig); /* Добавить sig к маске сигналов процесса */
int sigrelse(int sig); /* Удалить sig из маски сигналов процесса */
int sigignore(int sig); /* Сокращение для sigset(sig, SIG_IGN) */
int sigpause(int sig);
/* Приостановить процесс, позволить появиться sig */
void (*sigset(int sig, void (*disp)(int)))(int);
/* sighandler_t sigset(int sig, sighandler_t disp); */
Стандарт POSIX для этих функций описывает их поведение в терминах
sigset_t
и связанные функции». В API System V Release 3 нет способа получить или изменить маску сигналов процесса в целом. Функции работают следующим образом:int sighold(int sig)
Добавляет sig
int sigrelse(int sig)
Удаляет sig
int sigignore(int sig)
Игнорирует sig
int sigpause(int sig)
Удаляет sig
sighandler_t sigset(int sig, sighandler_t disp)
Это замена для signal(). (Здесь мы использовали обозначение из справочной страницы GNU/Linux, чтобы упростить восприятие объявления функции.)
Для sigset()
handler
может быть SIG_DFL
, SIG_IGN
или указатель функции, как и для signal()
. Однако, он может равняться также и SIG_HOLD
. В этом случае sig
добавляется к маске сигналов процесса, но связанное с ним действие никак не изменяется. (Другими словами, если бы у него был обработчик, он остается тем же; если было действие по умолчанию, оно не изменяется.)Когда для установки обработчика сигнала используется sigset()
sighold()
sigrelse()
могут использоваться совместно для выделения так называемых критических секций кода: участков кода, который не должен прерываться определенным сигналом, чтобы структуры данных не повреждались кодом обработчика сигнала.ЗАМЕЧАНИЕ
. POSIX стандартизует эти API, поскольку главной целью POSIX является формализация существующей практики, где это возможно. Однако, функцииsigaction()
, которые вскоре будут описаны, дают вам все, что делают эти API, и даже больше. В новых программах вам не следует использовать эти API Вместо этого используйте sigaction()
. (Мы заметили, что в справочной системе GNU/Linux нет даже страницы для 10.6. Сигналы POSIX