872_____________________________________________Глава 14

SIGINT     Получение интерактивного сигнала (например, прерывание
Ctrl+C). Действие по умолчанию — прерывание INT 23Ь

SIGSEGV   Нарушение доступа к памяти. Действие по умолчанию — вызов
_exit(l)

SIGTERM   «Мягкое» завершение процесса. Действие по умолчанию — вызов
_exit(l)

SIGUSR1,  Определенные пользователем (только в Win32) сигналы пользова-
SIGUSR2,  теля, генерируемые функцией raise. Действие по умолчанию —
SIGUSR3   игнорирование сигнала

SIGBREAK Прерывание по Ctrl-Break

В функцию signal передаются два параметра: целочисленный номер сигнала
sig и указатель func на функцию обработки сигнала. Обработчик func может быть
определенной пользователем функцией или одним из трех предопределенных об-
работчиков: SIG_DFL — завершение программы, SIG_IGN — игнорирование сиг-
налов данного вида, и SIG_ERR — генерация ошибки. Например:

signal(SIGINT, SIG_ERR); // генерация сообщения об ошибке
или

signal(SIGINT, SIG IGN); // игнорирование сигнала SIGINT

Если вы хотите задать свой обработчик стандартного сигнала или определен-
ного вами сигнала, это может выглядеть так. Пусть, например, вы хотите преду-
смотреть в своей программе обработчик некоторого вводимого вами сигнала
SIGUSR1. Назовем функцию этого обработчика Handl_SIGUSRl. Определите в
программе тип указателя на функцию fptr:

typedef void (*fptr)(int);

He забудьте также вставить в файл директиву

ftinclude <signal.h>

Далее где-то в начале программы надо ввести оператор:

signal(SIGUSR1, (fptr)Handl_SIGUSRl);

Этот оператор установит функцию Handl_SIGUSRl как обработчик сигнала
SIGUSR1. В нужных местах программы вставьте оператор генерации вашего сиг-
нала:

raise(SIGUSR1) ;

Рассмотрим подробнее последовательность операций, выполняемых системой
при выполнении этого оператора. Если в программе задан приведенным выше опе-
ратором signal обработчик пользователя для данного события, то происходит обра-
щение к этому обработчику, но прежде система сбрасывает установку на SIG_DFL.
Это значит, что при следующей генерации этого сигнала, если не повторить вызов
функции signal, система забудет прежнюю установку и не будет опять обращаться
к обработчику пользователя. Поэтому обычно в конце обработчика повторяют вы-
зов signal. С учетом этого обработчик сигнала может иметь вид:

void Handl_SIGUSRl(int N)

(

if(Message Dig("Продолжать?", mtConfirmation,

TMsgDIgButtons() « mbYes« mbNo,0) == mrYes)
// повторная установка обработчика:

signal(SIGUSR1, Handl_SIGUSRl) ;

else exit(EXIT_SUCCESS);

)