Namespaces
Variants

signal

From cppreference.net
Определено в заголовке <signal.h>
void ( * signal ( int sig, void ( * handler ) ( int ) ) ) ( int ) ;

Устанавливает обработчик ошибок для сигнала sig . Обработчик сигнала может быть установлен таким образом, что будет происходить обработка по умолчанию, сигнал будет игнорироваться или будет вызываться пользовательская функция.

Когда обработчик сигнала установлен на функцию и возникает сигнал, определяется реализацией, будет ли signal ( sig, SIG_DFL ) выполнен непосредственно перед запуском обработчика сигнала. Кроме того, реализация может предотвращать возникновение некоторого определённого реализацией набора сигналов во время выполнения обработчика сигнала.

Содержание

Параметры

sig - сигнал, для которого устанавливается обработчик. Может быть реализационно-определенным значением или одним из следующих значений:
определяет типы сигналов
(макроконстанта)
handler - обработчик сигнала. Должен быть одним из следующих:
  • SIG_DFL макрос. Обработчик сигнала устанавливается в обработчик по умолчанию.
  • SIG_IGN макрос. Сигнал игнорируется.
  • указатель на функцию. Сигнатура функции должна быть эквивалентна следующей:
void fun ( int sig ) ;

Возвращаемое значение

Предыдущий обработчик сигнала при успехе или SIG_ERR при неудаче (установка обработчика сигнала может быть отключена в некоторых реализациях).

Обработчик сигналов

На пользовательскую функцию, устанавливаемую в качестве обработчика сигнала, накладываются следующие ограничения.

Если пользовательская функция возвращает управление при обработке SIGFPE , SIGILL или SIGSEGV , поведение не определено.

Если обработчик сигнала вызывается в результате abort или raise , поведение не определено, если обработчик сигнала вызывает raise .

Если обработчик сигнала вызывается НЕ в результате abort или raise (другими словами, обработчик сигнала является асинхронным ), поведение не определено, если

  • обработчик сигнала вызывает любую функцию из стандартной библиотеки, кроме
  • abort
  • _Exit
  • quick_exit
  • signal с первым аргументом, являющимся номером обрабатываемого в данный момент сигнала (асинхронный обработчик может перерегистрировать себя, но не другие сигналы).
  • атомарные функции из <stdatomic.h> если атомарные аргументы являются lock-free
  • atomic_is_lock_free (с любыми типами атомарных аргументов)
  • обработчик сигнала ссылается на любой объект со статической или поточно-локальной (since C11) длительностью хранения , который не является безблокировочным атомарным (since C11) , кроме как через присваивание статической переменной volatile sig_atomic_t .

При входе в обработчик сигнала состояние окружения с плавающей запятой и значения всех объектов не определены, за исключением

  • объекты типа volatile sig_atomic_t
  • объекты типов lock-free atomic (since C11)
  • побочные эффекты, становящиеся видимыми через atomic_signal_fence (since C11)

При возврате из обработчика сигнала значение любого объекта, изменённого обработчиком сигнала, который не является volatile sig_atomic_t или lock-free atomic (since C11) , является неопределённым.

Поведение не определено, если signal используется в многопоточном приложении. Не требуется, чтобы он был потокобезопасным.

Примечания

POSIX требует, чтобы signal был потокобезопасным, и определяет список асинхронно-безопасных библиотечных функций , которые могут вызываться из любого обработчика сигналов.

Помимо abort и raise , POSIX определяет, что kill , pthread_kill и sigqueue генерируют синхронные сигналы.

POSIX рекомендует использовать sigaction вместо signal из-за недостаточно специфицированного поведения и значительных вариаций в реализациях, касающихся доставки сигналов во время выполнения обработчика сигнала.

Пример

#include <signal.h>
#include <stdio.h>
volatile sig_atomic_t gSignalStatus;
void signal_handler(int signal)
{
  gSignalStatus = signal;
}
int main(void)
{
  signal(SIGINT, signal_handler);
  printf("SignalValue: %d\n", gSignalStatus);
  printf("Sending signal: %d\n", SIGINT);
  raise(SIGINT);
  printf("SignalValue: %d\n", gSignalStatus);
}

Вывод:

SignalValue: 0
Sending signal: 2
SignalValue: 2

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.14.1.1 Функция signal (стр. 193-194)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.14.1.1 Функция signal (стр. 266-267)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.14.1.1 Функция signal (стр. 247-248)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.7.1.1 Функция signal

Смотрите также

запускает обработчик сигнала для конкретного сигнала
(функция)
C++ documentation для signal