В системах Linux концепция сигналов была расширена. Это вызвано следующими
недостатками старого ANSI-C подхода:
Не был возможен опрос актуального статуса сигналов;
Возникают конфликты между 2 одинаковыми сигналами, например, SIGINT,
в одной программе. Один обработчик сигнала должен игнорировать его,
а другой должен выполнять определенную функцию. Это может запутать
программу.
В новой концепции сигналов вначале вводится переменная примитивного
типа данных sigset_t.
sigset_t signal_set;
Множество сигналов инициализируется функцией sigemptyset().
#include <signal.h>
int sigemptyset(sigset_t *sig_m);
Теперь можно добавлять новые сигналы для конкретного процесса функцией:
#include <signal.h>
int sigaddset(sigset_t *sig_m, int signr);
signr являются номерами сигналов, которые добавляются во
множество. Также можно использовать символическое имя, например:
sigaddset(&signal_set, SIGINT);
С помощью функции
#include <signal.h>
int sigdelset(setsig_t *sig_m, int signr);
сигнал signr удаляется из множества сигналов sig_m.
Чтобы проверить, имеется ли некоторый сигнал в множестве, можно использовать
следующую функцию:
#include <signal.h>
int sigismember(sigset_t sig_m,int signr);
Если сигнал присутствует в множестве, функция возвращает 1, иначе
0.
Существует функция для сохранения или изменения маски сигналов:
#include <signal.h>
int sigprocmask(int mode, const sigset_t *sig_m, sigset_t *alt_sig_m);
Существует три режима использования этой функции:
sigprocmask (mode, NULL, alt_sig_m); При этом в текущем процессе множество сигналов записывается по адресу
alt_sig_m. mode в этом случае не оказывает эффекта.
sigprocmask (mode, sig_m, NULL); Маска сигналов изменяется на новую маску sig_m.
sigprocmask (mode, sig_m, alt_sig_m); Сначала актуальная, используемая в текущем процессе маска сигналов
записывается в alt_sig_m, то есть сохраняется. Затем устанавливается
множество сигналов sig_m.
Функция позволяет использовать три предопределенные константы:
SIG_BLOCK Ко множеству сигналов добавляются все установленные в sig_m
сигналы.
SIG_UNBLOCK Сигналы, установленные в sig_m, удаляются.
SIG_SETMASK Устанавливается новая маска сигналов с сигналами, указанными в sig_m.
Если нужно изменить маску сигналов или запретить все сигналы во время
выполнения определенной части кода, существует функция:
#include <signal.h>
int sigsuspend(const sigset_t *sig_m);
С помощью этой функции можно блокировать процесс до тех пор, пока
не придет нужный сигнал.