Spec-Zone.ru › C

signal

Определено в заголовочном файле <signal.h>
void (*signal( int sig, void (*handler) (int))) (int);

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

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

Параметры

sig - сигнал, для которого устанавливается обработчик. Это может быть определённое реализацией значение или одно из следующих значений:
SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM
определяет типы сигналов
(макроконстанта)
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>, если атомарные аргументы являются безблокировочными
    • atomic_is_lock_free (с любым типом атомарных аргументов)
  • обработчик сигнала ссылается на любой объект со статической или локальной для потока(с C11) длиной хранения которая не является безблокировочной атомарной(с C11) кроме как путем присваивания статической volatile sig_atomic_t.

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

  • объектов типа volatile sig_atomic_t
  • объектов безблокировочных атомарных типов (с C11)
  • побочных эффектов, видимых через atomic_signal_fence (с C11)

При возврате из обработчика сигнала значение любого объекта, изменённого обработчиком сигнала, который не является volatile sig_atomic_t или безблокировочным атомарным(с 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

См. также

raise
выполняет обработчик сигнала для конкретного сигнала
(функция)
Документация C++ для signal

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/program/signal

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API