Примечание
После выполнения программы вы можете обнаружить дамп ядра (в файле 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определяет, включен ли заданный сигнал в множество сигналов. Она возвращает 1, если сигнал является элементом множества, 0, если нет и -1 с 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завершается успешно, она возвращает 0. Функция вернет -1, если параметр howневерен, в этом случае переменная errnoбудет равна EINVAL.
Если сигнал заблокирован процессом, он не будет доставлен, но останется ждать обработки. Программа может определить с помощью функции sigpending, какие из заблокированных ею сигналов ждут обработки.
#include
int sigpending(sigset_t *set);
Она записывает множество сигналов, заблокированных от доставки и ждущих обработки, в множество сигналов, на которое указывает аргумент set. Функция возвращает 0 при успешном завершении и -1 в противном случае с переменной errno, содержащей ошибку. Данная функция может пригодиться, когда программе потребуется обрабатывать сигналы и управлять моментом вызова функции обработки.
С помощью функции sigsuspendпроцесс может приостановить выполнение, пока не будет доставлен один сигнал из множества сигналов. Это более общая форма функции pause, с которой вы уже встречались.
#include
int sigsuspend(const sigset_t *sigmask);
Функция sigsuspendзамещает маску сигналов процесса множеством сигналов, заданным в аргументе sigmask, и затем приостанавливает выполнение. Оно будет возобновлено после выполнения функции обработки сигнала. Если полученный сигнал завершает программу, sigsuspendникогда не вернет ей управление. Если полученный сигнал не завершает программу, sigsuspendвернет с переменной errno, равной EINTR.
Флаги sigaction
Поле sa_flagsструктуры sigaction, применяемой в функции sigaction, может содержать значения, изменяющие поведение сигнала (табл. 11.5).
Таблица 11.5
Читать дальше