CodeNet / Языки программирования / C / C++ / Linux/Unix / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
signal
SIGNAL
#include <signal.h>
int (*signal(sig, func)();
int sig; значение сигнала
int (*func)(); выполняемая функция
Описание.
Функция signal позволяет выбрать из операционной системы
один из трех способов обработки сигнала прерывания. Аргумент sig
может быть одной из манифестных констант SIGINT или SIGFPE, опре-
деленых в <signal.h>. Манифестная константа SIGINT соответствует
в MS DOS сигналу прерывания INT 23H. SIGFPE соответствует преры-
ваниям плавающей точки, которые не маскированы, такие как пере-
полнение, деление на ноль, неверная операция. Аргумент func может
быть одной из манифестных констант SIG_DFL или SIG_IGN (также оп-
ределенных в <signal.h>), или адресом функции. При получении сиг-
нала прерывания принимаемое действие зависит от значения func и
является следующим:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
SIG_IGN Сигнал прерывания игнорируется. Это
значение для SIGFPE не задается, т.к.
состояние процесса с плавающей точкой
остается неопределенным.
SIG_DFL Вызванный процесс завершен; управление
передается на уровень команд MS DOS.
Все файлы, открытые в процессе, закры-
ваются, но буферы не обновляются.
Адрес функции Для сигналов SIGINT функции, на которую
указывает func, передается аргумент
SIGINT и она выполняется. Если функция
завершается нормально, прерванный про-
цесс возобновляет выполнение с команды,
следующей за той, в которой был получен
сигнал прерывания. Перед выполнением
специфицированной функции значение func
устанавливается в SIG_DFL; следующий
сигнал прерывания трактуется как и для
SIG_DFL, если внешний вызов signal,
задающий другое значение прерывания, не
определен. Это позволяет пользователю
переустанавливать сигналы в вызываемых
функциях, если необходимо. Для SIGFPE
функциц, на которую указывает func,
передаются два аргумента - SIGFPE и це-
лый подкод ошибки, FPE-xxx-, и затем
она выполняется. (Смотрите include-файл
<float.h> для определения подкодов
FPE-xxx.) Значение func не
переустановится до тех пор, пока не
будет получен сигнал прерывания; для
выхода из состояния плавающей точки
используется setjmp вместе с longjmp
(см. пример для функции_fprset). Если
функция завершается нормально, прерван-
ный процесс возобновляется в
неопределенном состоянии плавающей
точки.
Возвращаемое значение.
Функция signal возвращает предыдущее значение func. Возвра-
щаемое значение -1 свидетельствует об ошибке и errno устанавлива-
ется в EINVAL, определяя неверное значение sig.
См.также abort, exit, _exit, _fpreset, spawnl, spawnle,
spawnlp, spawnv, spawnve, spawnvp.
Замечание: В тех child-процессах, которые созданы посредст-
вом вызова процедур exec или spawn, установленные сигналы преры-
ваний не сохраняются. Эти сигналы в child-процессе переустанавли-
ваются по умолчанию.
Пример:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <process.h>
int handler();
main()
{
if(signal(SIGINT, handler)==(int(*)())-1) {
fprintf(stderr,"couldn't set SIGINT\n");
abort();
}
.
.
.
}
int handler()
{
char ch;
printf("terminate processing? ");
scanf("%1c", &ch);
if (ch=='y' ::ch=='Y')
exit(0);
signal(SIGINT, handler);
}
/* функция signal, вызванная здесь для следующего сигнала
прерываний, посылает управление не в ОС, а к handler() */
