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 Пользовательский сигнал 1 POSIX
SIGUSR2 Пользовательский сигнал 2 POSIX
SIGCHLD Изменение статуса дочернего процесса POSIX
SIGCLD Аналогично SIGCHLD System V
SIGPWR Перезапуск после проблемы с питанием System V
SIGXCPU Ограничение процессорного времени POSIX

Примечания править

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

Ссылки править