Роббинс Арнольд
Шрифт:
10.3.1. Функция
signal
Действие сигнала изменяется с помощью функции
signal
. Вы можете изменить действие на «игнорировать сигнал», «восстановить для сигнала действие системы по умолчанию» или «вызвать при появлении сигнала мою функцию с номером сигнала в качестве параметра». Функция, которую вы предоставляете для распоряжения сигналом, называется обработчиком сигнала (или просто обработчиком), а установка ее в соответствующем месте осуществляет перехват (catch) сигнала.
Получив эти сведения, давайте перейдем к API. В заголовочном файле
<signal.h>
представлены определения макросов для поддерживаемых сигналов и объявления функций управления сигналами, предоставляемыми стандартом С: #include <signal.h> /* ISO С */
void (*signal(int signum, void (*func)(int)))(int);
Это объявление для функции signal почти невозможно прочесть. Поэтому справочная страница GNU/Linux signal(2) определяет ее таким способом:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
Теперь это более вразумительно. Тип
sighandler_t
является указателем на функцию с возвращаемым типом void
, которая принимает один целый аргумент. Это целое является номером поступающего сигнала. Функция
signal
принимает номер сигнала в качестве своего первого параметра, а указатель функции (новый обработчик) в качестве своего второго аргумента. Если последний не является указателем функции, он может быть лишь SIG_DEF,
что означает «восстановить действие по умолчанию», либо SIG_IGN
, что означает «игнорировать сигнал». signal
изменяет действие для signum
и возвращает предыдущее действие. (Это дает вам возможность восстановить при желании предыдущее действие.) Возвращаемое значение может равняться также SIG_ERR
, что указывает на произошедшую ошибку. (Некоторые сигналы невозможно перехватить или игнорировать; предоставление для них обработчика сигнала или неверный signum
создают эту ошибку.) В табл. 10.1 перечислены сигналы, доступные под GNU/Linux, их числовые значения, действия по умолчанию для каждого, формальный стандарт или современная операционная система, которые их определяют, и смысл каждого. Таблица 10.1. Сигналы GNU/Linux
Имя | Значение | По умолчанию | Источник | Смысл |
---|---|---|---|---|
SIGHUP | 1 | Term | POSIX | Отсоединение |
SIGINT | 2 | Term | ISO C | Прерывание |
SIGQUIT | 3 | Core | POSIX | Выход |
SIGILL | 4 | Core | ISO C | Недействительная инструкция |
SIGTRAP | 5 | Core | POSIX | Трассировочная ловушка |
SIGABRT | 6 | Core | ISO C | Прекращение |
SIGIOT | 6 | Core | BSD | Ловушка IOT |
SIGBUS | 7 | Core | BSD | Ошибка шины |
SIGFPE | 8 | Core | ISO C | Исключение с плавающей точкой |
SIGKILL | 9 | Term | POSIX | Завершение, неблокируемый |
SIGUSR1 | 10 | Term | POSIX | Сигнал 1 пользователя |
SIGSEGV | 11 | Core | ISO C | Нарушение сегмента |
SIGUSR2 | 12 | Term | POSIX | Сигнал 2 пользователя |
SIGPIPE | 13 | Term | POSIX | Нарушенный канал |
SIGALRM | 14 | Term | POSIX | Аварийные часы |
SIGTERM | 15 | Term | ISO C | Завершение |
SIGSTKFLT | 16 | Term | Linux | Ошибка стека в процессоре (не используется) |
SIGCHLD | 17 | Ignr | POSIX | Изменение статуса порожденного процесса |
SIGCLD | 17 | Ignr | System V | То же, что и SIGCHLD (для совместимости) |
SIGCONT | 18 | POSIX | Продолжить при остановке | |
SIGSTOP | 19 | Stop | POSIX | Стоп, неблокируемый |
SIGTSTP | 20 | Stop | POSIX | Стоп от клавиатуры |
SIGTTIN | 21 | Slop | POSIX | Фоновое чтение от tty |
SIGTTOU | 22 | Stop | POSIX | Фоновая запись в tty |
SIGURG | 23 | Ignr | BSD | Срочный сигнал сокета |
SIGXCPU | 24 | Core | BSD | Превышение предела процессора |
SIGXFSZ | 25 | Core | BSD | Превышение предела размера файла |
SIGVTALRM | 26 | Term | BSD | Виртуальные аварийные часы |
SIGPROF | 27 | Term | BSD | Профилирующие аварийные часы |
SIGWINCH | 28 | Ignr | BSD | Изменение размера окна |
SIGIO | 29 | Term | BSD | Возможен ввод/вывод |
SIGPOLL | 29 | Term | System V | Опрашиваемое событие, то же, что и SIGIO (для совместимости) |
SIGPWR | 30 | Term | System V | Повторный запуск из-за сбоя питания |
SIGSYS | 31 | Core | POSIX | Неверный системный вызов |