Функция signal

Прототип функции 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, так что поведение остается неизменным.

Автор: admin
Дата: 08.09.2012
Поделиться:

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.