Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

6.2. Обработка сигналов

При получении сигнала процесс может выполнить одно из трех действий:

  • выполнить действие по умолчанию. Обычно действие по умолчанию заключается в прекращении выполнения процесса. Для некоторых сигналов, например, для сигналов SIGUSR1 и SIGUSR2, действие по умолчанию заключается в игнорировании сигнала.1 Для других сигналов, например, для сигнала SIGSTOP, действие по умолчанию заключается в остановке процесса;

  • игнорировать сигнал и продолжать выполнение. В больших программах неожиданно возникающие сигналы могут привести к проблемам. Например, нет смысла позволять программе останавливаться в результате случайного нажатия на клавишу прерывания, в то время как она производит обновление важной базы данных;

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

В старых версиях UNIX обработка сигналов была относительно простой. Здесь будут изучены современные процедуры управления механизмом сигналов, и хотя эти процедуры несколько сложнее, их использование дает вполне надежный результат, в отличие от устаревших методов обработки сигналов. Прежде чем перейти к примерам, следует сделать несколько пояснений. Начнем с определена набора сигналов (signal set).

6.2.1. Наборы сигналов

Наборы сигналов являются одним из основных параметров, передаваемых работающим с сигналами системным вызовам. Они просто задают список сигналов, которые необходимо передать системному вызову.

Наборы сигналов определяются при помощи типа sigset_t, который определен в файле linux. Размер типа задан так, чтобы в нем мог поместиться весь набор определенных в системе сигналов. Выбрать определенные сигналы можно, начав либо с полного набора сигналов и удалив ненужные сигналы, либо с пустого набора, включив в него нужные. Инициализация пустого и полного набора сигналов выполняется при помощи процедур sigemptyset и sigfillset соответственно. После инициализации с наборами сигналов можно оперировать при помощи процедур sigaddset и sigdelset, соответственно добавляющих и удаляющих указанные вами сигналы.

Описание

uses stdio;

(* Инициализация *)

function sigemptyset(__set:psigset_t):integer;

function sigfillset(__set:psigset_t):integer;

(* Добавление и удаление сигналов *)

function sigaddset(__set:psigset_t;__signo:integer):integer;

function sigdelset(__set:psigset_t;__signo:integer):integer;

Процедуры sigemptyset и sigfillset имеют единственный параметр – указатель на переменную типа sigset_t. Вызов sigemptyset инициализирует набор __set, исключив из него все сигналы. И наоборот, вызов sigfillset инициализирует набор, на который указывает __set, включив в него все сигналы. Приложения должны вызывать sigemptyset или sigfillset хотя бы один раз для каждой переменной типа sigset_t.

Процедуры sigaddset и sigdelset принимают в качестве параметров указатель на инициализированный набор сигналов и номер сигнала, который должен быть добавлен или удален. Второй параметр, signo, может быть символическим именем константы, таким как SIGINT, или настоящим номером сигнала, но в последнем случае программа окажется системно-зависимой.

В следующем примере создадим два набора сигналов. Первый образуется из пустого набора добавлением сигналов SIGINT и SIGQUIT. Второй набор изначально заполнен, и из него удаляется сигнал SIGCHLD.

uses stdio;

var

mask1, mask2:sigset_t;

.

.

.

(* Создать пустой набор сигналов *)

sigemptyset(@mask1);

(* Добавить сигналы *)

sigaddset(@mask1, SIGINT);

sigaddset(@mask1, SIGQUIT);

(* Создать полный набор сигналов *)

sigfillset(@mask2);

(* Удалить сигнал *)

sigdelset(@mask2, SIGCHLD);

.

.

.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal