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