666___________________________________________Глава 11

Сам обработчик сигнала может иметь вид:

void Handl_SIGUSRl(int N)
{

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

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

signal(SIGUSR1, Handl_SIGUSRl) ;

else exit(EXIT_SUCCESS) ;

}

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

Генерация сигнала SIGUSR1 в необходимых местах программы осуществля-
ется оператором

raise(SIGUSR1) ;

Рассмотренный вариант функции сейчас считается несколько устаревшим.
Более современный вариант (подробнее о нем см. в главе 14 в разделе 14.14.1) вы-
глядит следующим образом. Определите в программе тип указателя на функцию
fptr:

typedef void (*fptr)(int);

Этот указатель используется в вызове функции signal:

signal(SIGFPE, (fptr)Handl_SIGFPE) ;

Весь остальной приведенный выше текст примера может не изменяться.