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() */