Прототип функции signal:
void (*signal(int sign, void (*funcptr)(int)))(int);
Заголовочный файл
Название | Язык |
---|---|
signal.h | С |
csignal | С++ |
Описание
Функция signal
определяет способ обработки сигналов, номер сигнала передается через параметр sign
.
Есть три способа, обработки сигнала программой (способ обработки указывается параметром funcptr
):
- Обработка сигналов по умолчанию
SIG_DFL
: сигнал обрабатывается, по умолчанию, событием для данного сигнала. - Игнорировать сигнал
SIG_IGN
: сигнал игнорируется и выполнение кода будет продолжаться, даже если это бессмысленно. - Функция обработчик: специфическая функция, определена для обработки сигналов.
Конкретная реализация компилятора может использовать или SIG_DFL
, или SIG_IGN
, как способ обработки сигнала по умолчанию при запуске программы.
Параметры:
- sign
Номер сигнала, который функция будет обрабатывать. Далее в таблице указаны константы, определяющие стандартные номера сигналов:
Макрос | Сигнал |
---|---|
SIGABRT | (Сигнал остановки) Аварийное завершение, такой сигнал вызывает функцию abort . |
SIGFPE | (Сигнал исключения с плавающей точкой) Возникновение ошибочных арифметических операций, таких, как деление на ноль или переполнение типов данных (данный сигнал актуален и для целочисленных операций). |
SIGILL | (Сигнал недопустимой инструкции) Неправильная запись функции, то есть неправильно сформированная инструкция. Как правило, это связано с ошибками в коде или ошибочной попыткой обработать информацию. |
SIGINT | (Сигнал прерывания) Интерактивный сигнал внимания. Как правило, генерируемый приложением пользователя. |
SIGSEGV | (Сигнал о нарушении сегментации) Неверный доступ к памяти: когда программа пытается считать или записать данные в некорректно выделенную память. |
SIGTERM | (Сигнал Завершения) Прекращение запроса, отправленного в программу. |
В различных реализациях компиляторов могут быть предусмотрены дополнительные номера сигналов и их макро-константы, для использования этой функцией.
Обратите внимание, что не все среды программирования поддерживают возможность создания автоматических сигналов, даже тех, которые описаны выше.
- funcptr
Указатель на функцию. Это может быть либо функция, определенная программистом или один из следующих предопределенных способов обработки сигналов:
SIG_DFL | Сигнал обрабатывается по умолчанию. |
SIG_IGN | Сигнал игнорируется. |
Если функция, то её прототип должен быть таким:
void function( int param );
Возвращаемое значение
Тип данных возвращаемого значения точно такой же, как для параметра func
.
Если запрос выполнен успешно, signal
возвращает указатель на конкретную функцию обработчик, которая отвечает за обработку этого сигнала, если таковой имеется. Или SIG_DFL
или SIG_IGN
, если перед вызовом, сигнал обрабатывается по умолчанию или игнорируется.
Если функция не обработала успешно сигнал, она возвращает SIG_ERR
и устанавливает ERRNO
в положительное значение.
Пример: исходный код программы
// пример использования функции signal #include <iostream> // для оператора cout #include <cstdio> // для функций tmpnam, remove #include <cstdlib> // для функции exit #include <csignal> char tmpfilename [L_tmpnam]; // строка для хранения имени временного файла void terminate (int param) { std::cout << "Завершение программы..." << std::endl; remove (tmpfilename); // удалить временный файл exit(1); // завершить работу программы со значением 1 } int main() { void (*funcptr)(int); // указатель на функцию funcptr = signal (SIGTERM,terminate); // обработка сигнала if (funcptr == SIG_IGN) signal(SIGTERM,SIG_IGN); // в случае, если funcptr будет указывать на SIG_IGN, то сигнал SIGTERM будет игнорироваться tmpnam(tmpfilename); // сгенерировать имя файла // остальной код программы raise(SIGTERM); // отправить программе сигнал SIGTERM return 0; }
Пример работы программы
Эта программа определяет функцию terminate
, которая удаляет ранее созданные временные файлы. Эта функция использует сигнал SIGTERM
, если этот сигнал игнорируется, он сбрасывается в SIG_IGN
, так что поведение остается неизменным.