Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Системные вызовы signal и sigaction






Системный вызов signal служит для изменения реакции процесса на какой-либо сигнал.

 

Вызов signal (возвращает указатель на функцию с одним параметром типа int, которая ничего не возвращает) имеет два параметра:

 

 

1) параметр sig типа int — это номер сигнала, обработку которого предстоит изменить.

2) параметр handler, служащий указателем на ничего не возвращающую функцию с одним параметром типа int. Параметр handler описывает новый способ обработки сигнала — это может быть указатель на пользо­ вательскую функцию–обработчик сигнала, специальное значение SIG _ DFL или специальное значение SIG _ IGN.

 

 

Специальное значение SIG _ IGN используется для того, чтобы процесс игнорировал поступившие сигналы с номером sig, специальное значение SIG _ DFL — для восстановления реакции процесса по умолчанию на этот сигнал.

Системный вызов signal возвращает указатель на старый способ обработки сигнала, значение которого можно использовать для восстановления старого способа обработки в случае необходимости.

 

Итак, системный вызов signal имеет два параметра: один из них задает номер сигнала, реакцию процесса на который требуется изменить, а второй определяет, как именно мы собираемся ее менять.

 

Прототип

 

#include < signal.h>

 

void (*signal(int sig, void (*react)())) ();

 

Параметр react может иметь одно из следующих значений:

 

1) SIG_IGN — сигнал sig будет игнорироваться. Некоторые сигналы (например, SIGKILL) невозможно перехватить или проигнорировать.

2) SIG_DFL — восстановить реакцию по умолчанию (обычно — завершение процесса-получателя).

3) Имя функции — установить свой обработчик сигнала.

 

Пример 1. Установка пользовательского обработчика сигнала.

void fr(gotsig); … /* объявление прототипа обработчика */

В программе signal (sig, fr); /* задание реакции */ — установка своего обработчика (функция fr должна быть определена, а не только объявлена).

При получении сигнала sig будет вызвана функция fr, в которую в качестве аргумента системой будет передан номер сигнала, действительно вызвавшего ее — gotsig= =sig. Это полезно, т.к. можно задать одну и ту же функцию в качестве реакции для нескольких сигналов.

Пример 2. Указание одного и того же обработчика для нескольких сигналов:

signal (sig1, fr);

signal (sig2, fr);

В данных двух примерах параметры sig, sig1, sig2 — это сигналы, для которых необходимо установить обработчик (допустимые значения сигналов, определенные в файле signal.h).

После возврата из функции fr() программа продолжится с прерванного места. Перед вызовом функции-обработчика реакция автоматически устанавливается в значение реакции по умолчанию SIG _ DFL, а после выхода из обработчика снова восстанавливается в fr. Это значит, что во время работы функции-обработчика может прийти сигнал, который завершит процесс.

Вызов signal возвращает старое (предыдущее) значение реакции на сигнал, которое может быть сохранено в переменной вида void (*f)(); а потом восстановлено.

При системном вызове fork() все установленные реакции на сигналы наследуется порожденным процессом. При системном вызове exec() сохраняются реакции только для тех сигналов, которые игнорировались или обрабатывались по умолчанию. Получение любого сигнала, который до вызова exec() обрабатывался пользователем, приведет к завершению процесса.

 

Структура sigaction

 

Прототип системного вызова sigaction():

 

#include < signal.h>

 

int sigaction (int signum,

 

struct sigaction *action, struct sigaction *oldaction);

 

где signum — номер сигнала, action — реакция процесса на сигнал, oldaction- предыдущая реакция процесса на сигнал

 

Системный вызов sigaction позволяет процессу узнать или указать реакцию на сигнал. Аргумент signum задает сигнал (см. список сигналов, определенных в файле < signal.h>).

 

Структура sigaction, используемая в описании реакции процесса на сигнал, имеет следующие поля:

 

void (*)() sa _ handler — реакция на сигнал (SIG _ DFL, SIG _ IGN

 

или адрес функции)

 

sigset _ t sa _ mask — дополнительное множество сигналов, кото­ рые должны быть блокированы во время выполнения перехватывающей функции

 

int sa _ flags — специальные флаги, управляющие передачей сигнала.

 

Если переменная action не является нулевым указателем, она указы­ вает структуру типа sigaction, которая специфицирует реакцию на сиг­ нал. Если переменная oldaction не является нулевым указателем, преды­ дущая реакция на сигнал запоминается в структуре, которую указывает oldaction.

 

Если переменная action — нулевой указатель, то реакция на сигнал не изменяется, таким образом sigaction может использоваться для получения информации о текущей установленной реакции на сигнал.

 

Поле sa _ handler структуры sigaction указывает реакцию на данный сигнал. Если это поле определяет указатель на перехватывающую функцию, поле sa _ mask указывает множество сигналов, которые должны быть добавлены к сигнальной маске процесса перед входом в перехватывающую функцию. В добавляемое множество сигналов не могут входить сигналы SIGKILL и SIGSTOP.

 

Поле sa _ flags может быть использовано для управления передачей сигнала. В этом поле может быть установлен флаг SA _ NOCLDSTOP, опре­ деленный в файле < signal.h>. Если signum — это сигнал SIGCHLD и флаг SA _ NOCLDSTOP обнулен, сигнал SIGCHLD посылается процессу каждый раз, когда какой-либо из порожденных им процессов останавливается. Если signum — это сигнал SIGCLD и флаг SA _ NOCLDSTOP равен единице, то сигнал SIGCHLD не генерируется.

Когда сигнал перехватывается функцией, указанной в sigaction, вычисляется новая сигнальная маска, которая действует до завершения перехватывающей функции или до ближайшего вызова sigprocmask или sigsuspend. Эта маска получается объединением текущей сигнальной маски, множества из поля sa _ mask структуры, связанной с данной реак­ цией на сигнал, и используемого сигнала. После нормального завершения перехватывающей функции восстанавливается прежняя сигнальная маска.

Реакция, установленная на определенный сигнал, сохраняется до тех пор, пока она не будет изменена явно функцией sigaction или неявно функцией семейства exec (функции семейства exec заменяют текущий образ процесса новым образом и передают управление содержащейся в нем программе).

Если предыдущая реакция на сигнал была задана функцией signal, значения, возвращаемые в поля структуры по указателю oldaction, не определены. В частности, поле oldaction-> sa _ handler не обязано совпадать с реакцией, установленной функцией signal. Однако, если ука­ затель на эту структуру задается в качестве аргумента action функции sigaction, будет установлена та же реакция на сигнал, что была в свое время установлена функцией signal.

Возвращаемое значение:

 

Системный вызов sigaction при успешном завершении возвращает значение 0. В случае ошибки системный вызов sigaction возвращает значение –1, и новая реакция не устанавливается.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.