Читать книгу 📗 "Операционная система UNIX - Робачевский Андрей Михайлович"
#include <signal.h>
int sigaction (int sig, const struct sigaction *act,
struct sigaction *oact);
Вся необходимая для управлением сигналами информация передается через указатель на структуру
sigaction
void (*sa_handler)() | Обработчик сигнала sig |
void (*sa_sigaction)(int, siginfo_t*, void*) | Обработчик сигнала sig SA_SIGINFO |
sigset_t sa_mask | Маска сигналов |
int sa_flags | Флаги |
Поле
sa_handler
SIG_IGN
SIG_DFL
sa_handler
sa_sigaction
NULL
sa_mask
Поле
sa_flags
SA_ONSTACK | Если определена функция-обработчик сигнала, и с помощью функции sigaltstack(2) задан альтернативный стек для функции-обработчика, то при обработке сигнала будет использоваться этот стек. Если флаг не установлен, будет использоваться обычный стек процесса. |
SA_RESETHAND | Если определена функция-обработчик, то диспозиция сигнала будет изменена на SIG_DFL |
SA_NODEFER | Если определена функция-обработчик, то сигнал блокируется на время обработки только в том случае, если он явно указан в поле sa_mask |
SA_RESTART | Если определена функция-обработчик, ряд системных вызовов, выполнение которых было прервано полученным сигналом, будут автоматически перезапущены после обработки сигнала. [25] Если флаг не установлен, системный вызов возвратит ошибку EINTR |
SA_SIGINFO | Если диспозиция указывает на перехват сигнала, вызывается функция, адресованная полем sa_sigaction sa_handler |
SA_NOCLDWAIT | Если указанный аргументом sig SIGCHLD |
SA_NOCLDSTOP | Если указанный аргументом sig SIGCHLD |
*Данные флаги не определены для UNIX BSD.
В системах UNIX BSD 4.x структура
sigaction
struct sigaction {
void (*sa_handler)();
sigset_t sa_mask;
int sa_flags;
};
где функция-обработчик определена следующим образом:
void handler(int signo, int code, struct sigcontext *scp);
В первом аргументе
signo
code
scp
Для UNIX System V реализована следующая возможность получения более полной информации о сигнале. Если установлен флаг
SA_SIGINFO
sig
sa_sigaction
siginfo_t
ucontext_t
Структура
siginfo_t
int si_signo | Номер сигнала |
int si_errno | Номер ошибки |
int si_code | Причина отправления сигнала |