Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
SIG_SETMASK *setЕсли
setNULLoldsethowint sigpending(sigset_t *set)Эта функция позволяет увидеть, какие сигналы ожидают решения; т.е.
*setint sigsuspend(const sigset_t *set)Эта функция временно заменяет маску сигналов процесса содержимым
*set*set10.6.4. Перехват сигналов:
sigaction()Наконец мы готовы взглянуть на функцию
sigaction()#include <signal.h> /* POSIX */int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);Аргументы следующие:
int signumИнтересующий сигнал, как в случае с другими функциями обработки сигналов.
const struct sigaction *actОпределение нового обработчика для сигнала
signumstruct sigaction *oldactОпределение текущего обработчика. Если не
NULL*act*oldact*actNULL*oldactТаким образом,
sigaction()struct sigaction/* ПРИМЕЧАНИЕ: Порядок в структуре может варьировать. Могут быть также и другие поля! */struct sigaction { sigset_t sa_mask; /* Дополнительные сигналы для блокирования */ int sa_flags; /* Контролирует поведение */ void (*sa_handler)(int); /* Может образовать объединение с sa_sigaction */ void (*sa_sigaction)(int, siginfo_t*, void*); /* Может образовать объединение с sa_handler */}Поля следующие:
sigset_t sa_maskНабор дополнительных сигналов для блокирования при запуске функции обработчика. Таким образом, когда вызывается обработчик, общий набор заблокированных сигналов является объединением сигналов в маске процесса, сигналов в
act->maskSA_NODEFERsignumint sa_flagsФлаги, контролирующие обработку сигнала ядром. См. обсуждение далее.
void (*sa_handler)(int)Указатель на «традиционную» функцию обработчика. У нее такой же прототип (возвращаемый тип и список параметров), как у функции обработчика для
signal()bsd_signal()sigset()void (*sa_sigaction)(int, siginfo_t*, void*)Указатель на функцию обработчика «нового стиля». Функция принимает три аргумента, которые вскоре будут описаны.
Которая из функций
act->sa_handleract->sa_sigactionSA_SIGINFOact->sa_flagsact->sa_sigactionact->sa_handlerunionstruct sigactionПоле
sa_flagsТаблица 10.3. Значения флагов для
sa_flags| Флаг | Значение |
|---|---|
SA_NOCLDSTOP | Этот флаг имеет смысл лишь для SIGCHLDSIGSTOPSIGTSTPSIGTTINSIGTTOU |
SA_NOCLDWAIТ | Этот флаг имеет смысл лишь для SIGCHLD |
SA_NODEFER | Обычно данный сигнал блокируется, когда вызывается обработчик сигнала. Когда установлен один из этих флагов, данный сигнал не блокируется при запуске обработчика SA_NODEFER |
SA_NOMASK | Альтернативное имя для SA_NODEFER |
SA_SIGINFO | Обработчик сигнала принимает три аргумента. Как упоминалось, при данном установленном флаге должно использоваться поле sa_sigactionsa_handler |
SA_ONSTACK | Это продвинутая возможность. Обработчики сигналов могут вызываться с использованием предоставленной пользователем памяти в качестве «альтернативного стека сигнала». Эта память даётся ядру для подобного использования посредством sigaltstack() |
SA_RESETHAND | Этот флаг обеспечивает поведение V7: после вызова обработчика восстанавливается действие сигнала по умолчанию. Официальным именем POSIX флага (которое следует использовать) является SA_RESETHAND |
SA_ONESHOT | Альтернативное имя для SA_RESETHAND. |
SA_RESTART | Этот флаг предоставляет семантику BSD: системные вызовы, которые могут завершиться с ошибкой EINTR |