Программа вместо функции signal
sigaction для задания функции ouch как обработчика сигнала, возникающего при нажатии комбинации клавиш SIGINTsigaction, содержащую обработчик, маску сигналов и флаги, В данном случае вам не нужны никакие флаги, и создается пустая маска сигналов с помощью новой функции sigemptyset.После выполнения программы вы можете обнаружить дамп ядра (в файле core). Его можно безбоязненно удалить.
Множества сигналов
В заголовочном файле signal.h определены тип sigset_t
sigaction и других функциях для изменения поведения процесса при получении сигналов.#include
int sigaddset(sigset_t *set, int signo);
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigdelset(sigset_t *set, int signo);
Приведенные функции выполняют операции, соответствующие их названиям, sigemptyset
sigfillset инициализирует множество сигналов, заполняя его всеми заданными сигналами, sigaddset и sigdelset добавляют заданный сигнал (signo) в множество сигналов и удаляют его из множества. Они все возвращают 0 в случае успешного завершения и -1 в случае ошибки, заданной в переменной errno. Единственная определенная ошибка EINVAL описывает сигнал как некорректный.Функция sigismember
errno, равной EINVAL, если сигнал неверный.#include
int sigismember(sigset_t *set, int signo);
Маска сигналов процесса задается и просматривается с помощью функции sigprocmask
#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
Функция sigprocmask
how. Новые значения маски сигналов передаются в аргументе set, если он не равен null, а предыдущая маска сигналов будет записана в множество сигналов oset.Аргумент how
SIG_BLOCK
set добавляются к маске сигналов;SIG_SETMASK
set;SIG_UNBLOCK
set удаляются из маски сигналов.Если аргумент set
null, значение how не используется и единственная цель вызова — перенести значение текущей маски сигналов в аргумент oset.Если функция sigprocmask
how неверен, в этом случае переменная errno будет равна EINVAL.Если сигнал заблокирован процессом, он не будет доставлен, но останется ждать обработки. Программа может определить с помощью функции sigpending
#include
int sigpending(sigset_t *set);
Она записывает множество сигналов, заблокированных от доставки и ждущих обработки, в множество сигналов, на которое указывает аргумент set
errno, содержащей ошибку. Данная функция может пригодиться, когда программе потребуется обрабатывать сигналы и управлять моментом вызова функции обработки.С помощью функции sigsuspend
pause, с которой вы уже встречались.#include
int sigsuspend(const sigset_t *sigmask);
Функция sigsuspend
sigmask, и затем приостанавливает выполнение. Оно будет возобновлено после выполнения функции обработки сигнала. Если полученный сигнал завершает программу, sigsuspend никогда не вернет ей управление. Если полученный сигнал не завершает программу, sigsuspend вернет с переменной errno, равной EINTR.