В системах Linux концепция сигналов была расширена. Это вызвано следующими
недостатками старого подхода ANSI-C:
отсутствие возможности опросо актуального статуса сигналов.
возникновение конфликтов между двумя одинаковыми сигналами, например, SIGINT,
в одной программе. Один обработчик сигнала должен был игнорировать его,
а другой - выполнять определенную функцию, что могло запутать
программу.
В новой концепции сигналов вначале вводится переменная примитивного
типа данных:
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);
С помощью этой функции можно блокировать процесс до тех пор, пока
не придет нужный сигнал.