Операционная система UNIX
Часть 53 из 155 Информация о книге
#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*)Обработчик сигнала при установленном флагеsigSA_SIGINFOsigset_t sa_maskМаска сигналов int sa_flagsФлаги Поле
определяет действие, которое необходимо предпринять при получении сигналов, и может принимать значенияsa_handler,SIG_IGNили адреса функции-обработчика. Если значениеSIG_DFLилиsa_handlerне равныsa_sigaction, то в полеNULLпередается набор сигналов, которые будут добавлены к маске сигналов перед вызовом обработчика. Каждый процесс имеет установленную маску сигналов, определяющую сигналы, доставка которых должна быть заблокирована. Если определенный бит маски установлен, соответствующий ему сигнал будет заблокирован. После возврата из функции-обработчика значение маски возвращается к исходному значению. Заметим, что сигнал, для которого установлена функция-обработчик, также будет заблокирован перед ее вызовом. Такой подход гарантирует, что во время обработки, последующее поступление определенных сигналов будет приостановлено до завершения функции. Как правило, UNIX не поддерживает очередей сигналов, и это значит, что блокировка нескольких однотипных сигналов в конечном итоге вызовет доставку лишь одного.sa_maskПоле
определяет флаги, модифицирующие доставку сигнала. Оно может принимать следующие значения:sa_flags
SA_ONSTACKЕсли определена функция-обработчик сигнала, и с помощью функции sigaltstack(2) задан альтернативный стек для функции-обработчика, то при обработке сигнала будет использоваться этот стек. Если флаг не установлен, будет использоваться обычный стек процесса. *SA_RESETHANDЕсли определена функция-обработчик, то диспозиция сигнала будет изменена на , и сигнал не будет блокироваться при запуске обработчика. Если флаг не установлен, диспозиция сигнала остается неизменной.SIG_DFL *SA_NODEFERЕсли определена функция-обработчик, то сигнал блокируется на время обработки только в том случае, если он явно указан в поле . Если флаг не установлен, в процессе обработки данный сигнал автоматически блокируется.sa_maskSA_RESTARTЕсли определена функция-обработчик, ряд системных вызовов, выполнение которых было прервано полученным сигналом, будут автоматически перезапущены после обработки сигнала. [25] Если флаг не установлен, системный вызов возвратит ошибку .EINTR *SA_SIGINFOЕсли диспозиция указывает на перехват сигнала, вызывается функция, адресованная полем . Если флаг не установлен, вызывается обработчикsa_sigaction.sa_handler *SA_NOCLDWAITЕсли указанный аргументом сигнал равенsig, при завершении потомки не будут переходить в состояние зомби. Если процесс в дальнейшем вызовет функции wait(2), wait3(2), waitid(2) или waitpid(2), их выполнение будет блокировано до завершения работы всех потомков данного процесса.SIGCHLD *SA_NOCLDSTOPЕсли указанный аргументом сигнал равенsig, указанный сигнал не будет отправляться процессу при завершении или останове любого из его потомков.SIGCHLD*Данные флаги не определены для 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);В первом аргументе
содержится номер сигнала,signoопределяет дополнительную информацию о причине поступления сигнала, acodeуказывает на контекст процесса.scpДля UNIX System V реализована следующая возможность получения более полной информации о сигнале. Если установлен флаг
, то при получении сигналаSA_SIGINFOбудет вызван обработчик, адресованный полемsig. Помимо номера сигнала, обычно передаваемого обработчику сигнала, ему будет переданы указатель на структуруsa_sigaction, содержащую информацию о причинах получения сигнала, а также указатель на структуруsiginfo_t, содержащую контекст процесса.ucontext_tСтруктура
определена в файле <siginfo.h> и включает следующие поля:siginfo_t
int si_signoНомер сигнала int si_errnoНомер ошибки int si_codeПричина отправления сигнала