Операционная система UNIX - страница 75

стр.

, определенную процессом. Для управления непосредственно сигналами используются дополнительные функции, которые мы рассмотрим позже.

Функция sigemptyset(3C) инициализирует набор, очищая все биты. Если процесс вызывает sigfillset(3C), то набор будет включать все сигналы, известные системе. Функции sigaddset(3C) и sigdelset(3C) позволяют добавлять или удалять сигналы набора. Функция sigismember(3C) позволяет проверить, входит ли указанный параметром >signo сигнал в набор.

Вместо функции signal(3C) стандарт POSIX. 1 определяет функцию sigaction(2), позволяющую установить диспозицию сигналов, узнать ее текущее значение или сделать и то и другое одновременно. Функция имеет следующее определение:

>#include


>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 передается набор сигналов, которые будут добавлены к маске сигналов перед вызовом обработчика. Каждый процесс имеет установленную маску сигналов, определяющую сигналы, доставка которых должна быть заблокирована. Если определенный бит маски установлен, соответствующий ему сигнал будет заблокирован. После возврата из функции-обработчика значение маски возвращается к исходному значению. Заметим, что сигнал, для которого установлена функция-обработчик, также будет заблокирован перед ее вызовом. Такой подход гарантирует, что во время обработки, последующее поступление определенных сигналов будет приостановлено до завершения функции. Как правило, UNIX не поддерживает очередей сигналов, и это значит, что блокировка нескольких однотипных сигналов в конечном итоге вызовет доставку лишь одного.

Поле >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, при завершении потомки не будут переходить в состояние зомби. Если процесс в дальнейшем вызовет функции wait(2), wait3(2), waitid(2) или waitpid(2), их выполнение будет блокировано до завершения работы всех потомков данного процесса.
>SA_NOCLDSTOP>*Если указанный аргументом >sig сигнал равен >SIGCHLD, указанный сигнал не будет отправляться процессу при завершении или останове любого из его потомков.

>*Данные флаги не определены для UNIX BSD.


В системах UNIX BSD 4.x структура >sigaction имеет следующий вид:

>struct sigaction {

> void (*sa_handler)();

> sigset_t sa_mask;