Spec-Zone.ru › C

signal

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

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

Ссылки

  • Стандарт 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

См. также

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

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

Spec-Zone.ru

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