signal.h

Перейти к навигацииПерейти к поиску
Стандартная библиотека
языка программирования С

signal.h — заголовочный файл, определенный в стандартной библиотеке языка Си, для указания того, как программа обрабатывает сигналы во время её выполнения. Сигнал может быть как синхронным с помощью вызова raise(), так и асинхронным.

Каждая реализация определяет какой сигнал что генерирует и определяет их генерацию.

Эта часть библиотеки используется для перехвата сигналов — назначения обработчика определённого сигнала.

Обработчик сигнала может вызывать только следующие функции: _exit(), _Exit(), abort(), raise() (только если обработчик не вызван функциями abort или raise). Вызов прочих библиотечных функций приводит к неопределённому поведению, хотя отдельными реализациями такие вызовы могут быть разрешены, например в posix есть список async-signal-safe функций.

Типы данных

Стандарт объявляет тип данных sig_atomic_t, доступ к которому является атомарным, даже при наличии асинхронных прерываний.[1]

Макросы

Стандарт объявляет макросы SIG_DFL, SIG_ERR, SIG_IGN, которые используются как аргументы и возвращаемое значение для функции signal().[1] Макрос SIG_DFL используется для установки поведения по умолчанию для выбранного сигнала, SIG_IGN — для игнорирования сигнала, а SIG_ERR — как возвращаемое значение, свидетельствующее об ошибке.

Кроме того, стандарт определяет следующие типы сигналов:[1]

КонстантаЗначение
SIGINTПолучение интерактивного сигнала
SIGILLНедопустимая инструкция
SIGABRTНенормальное завершение программы, которое может быть вызвано abort()
SIGFPEОшибочная арифметическая операция, такая как деление на ноль или переполнение
SIGSEGVОшибочное обращение к объекту в памяти
SIGTERMЗапрос на прекращение выполнения

и разрешает другие, зависящие от платформы. При запуске программы часть сигналов может игнорироваться, для другой части определяется поведение по умолчанию.

Функции

Стандарт объявляет следующие функции:

#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
int raise(int sig);

Функция signal устанавливает обработчик func для сигнала sig. В качестве аргумента func может принимать SIG_IGN и SIG_DFL. В случае успеха функция возвращает старый обработчик сигнала, в противном случае — SIG_ERR.

Если обработчик возвращает управление при типе сигнала SIGILL, SIGFPE, SIGSEGV или иных, связанных с ошибками выполнения, поведение программы не определено. Кроме того, обработчик если был вызван не с помощью abort или raise, может изменять переменные только типа volatile sig_atomic_t.

Функция raise генерирует сигнал sig.[1]

Методы

  • int raise(int sig). Искусственно вызывает сигнал.
  • psignal(int sig, const char *s), выводит в stderr строку, содержащую номер сигнала. Применяется в 4.3BSD, Solaris и Linux, но не указан в POSIX, стандартной библиотеке Си и SUS. На тех же системах string.h содержит нестандартный strsignal(int sig), который работает аналогично strerror.
  • void* signal(int sig, void (*func)(int)) назначает действие, предпринимаемое при получении программой сигнала sig. Если значение func равно SIG_DFL, то происходит обработка по умолчанию для указанного сигнала. Если значение func равно SIG_IGN, то сигнал игнорируется. В остальных случаях func указывает на вызываемую функцию обработчик сигнала при получении сигнала. Функция func может завершиться выполнением операции возврата или вызовом функций самозавершения, выхода или перехода.

Члены-константы

КонстантаЗначениеСтандарты
SIGHUPОтбойPOSIX
SIGINTПрерываниеANSI
SIGQUITВыходPOSIX
SIGILLНедопустимая инструкцияANSI
SIGABRTСамоостановкаANSI
SIGTRAPПерехват событияPOSIX
SIGIOTПерехват ввода-вывода4.2 BSD
SIGEMTПерехват эмуляции4.2 BSD
SIGFPEИсключение с плавающей запятойANSI
SIGKILLНеперехватываемый сигнал завершенияPOSIX
SIGBUSОшибка шины4.2 BSD
SIGSEGVНарушение сегментацииANSI
SIGSYSНеправильный аргумент в системный вызов4.2 BSD
SIGPIPEНарушение каналаPOSIX
SIGALRMИстечение времениPOSIX
SIGTERMЗавершениеANSI
SIGUSR1Пользовательский сигнал 1POSIX
SIGUSR2Пользовательский сигнал 2POSIX
SIGCHLDИзменение статуса дочернего процессаPOSIX
SIGCLDАналогично SIGCHLDSystem V
SIGPWRПерезапуск после проблемы с питаниемSystem V
SIGXCPUОграничение процессорного времениPOSIX

Примечания

  1. 1 2 3 4 ISO/IEC 9899:TC3 7.14. Дата обращения: 29 декабря 2011. Архивировано 11 января 2018 года.

Ссылки