Namespaces
Variants

signal

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

Изменяет обработку сигнала sig. В зависимости от значения handler, сигнал может быть проигнорирован, установлен по умолчанию или обработан пользовательской функцией, вызываемой как (*handler)(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 (с любыми атомарными аргументами)
  • обработчик сигнала обращается к любому объекту со статической или локальной для потока(начиная с C11) продолжительностью хранения , который не является не блокируемым (lock-free) atomic(начиная с C11) кроме как путем присваивания статическому volatile sig_atomic_t.

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

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

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

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.14.1.1 Функция signal (стр. 285-286)
  • Стандарт 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

Смотри также

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