Linux программирование в примерах
10.2. Действия сигналов
Каждый сигнал (вскоре мы представим полный список) имеет связанное с ним действие по умолчанию. POSIX обозначает это как диспозицию (disposition) сигнала. Это то действие, которое ядро осуществляет для процесса, когда поступает определенный сигнал. Действие по умолчанию варьирует:
Завершение
Процесс завершается.
Игнорирование
Сигнал игнорируется. Программа никогда не узнает, что что-то случилось.
Снимок образа процесса
Процесс завершается, и ядро создает файл core (в текущем каталоге процесса), содержащий образ работавшей на момент поступления сигнала программы. Снимок процесса может впоследствии использоваться с отладчиком для исследования состояния программы (см. главу 15 «Отладка»).
По умолчанию системы GNU/Linux создают файлы с именем
, гдеcore.<i>pid</i>является ID завершаемого процесса. (Это можно изменить; см. sysctl(8).) Такое именование позволяет хранить в одном и том же каталоге несколько файлов<i>pid</i>, за счет использования большего дискового пространства. [105] Традиционные системы Unix называют файлcore, и это ваше дело сохранить какие-нибудь файлыcoreдля последующего изучения, если есть шанс создания других таких же файлов в том же каталоге.coreОстановка
Процесс останавливается. Впоследствии он может быть возобновлен. (Если вы использовали управление заданиями оболочки с помощью CTRL-Z,
иfg, вы понимаете остановку процесса.)bg10.3. Стандартные сигналы С:
иsignal()raise()Стандарт ISO С определяет первоначальный API управления сигналами V7 и новый API для посылки сигналов. Вы должны использовать их для программ, которым придется работать на не-POSIX системах, или в случаях, когда предоставляемые ISO С API возможности являются достаточными.
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создают эту ошибку.) В табл. 10.1 перечислены сигналы, доступные под GNU/Linux, их числовые значения, действия по умолчанию для каждого, формальный стандарт или современная операционная система, которые их определяют, и смысл каждого.signumТаблица 10.1. Сигналы GNU/Linux
Имя Значение По умолчанию Источник Смысл SIGHUP1 Term POSIX Отсоединение SIGINT2 Term ISO C Прерывание SIGQUIT3 Core POSIX Выход SIGILL4 Core ISO C Недействительная инструкция SIGTRAP5 Core POSIX Трассировочная ловушка SIGABRT6 Core ISO C Прекращение SIGIOT6 Core BSD Ловушка IOT SIGBUS7 Core BSD Ошибка шины SIGFPE8 Core ISO C Исключение с плавающей точкой SIGKILL9 Term POSIX Завершение, неблокируемый SIGUSR110 Term POSIX Сигнал 1 пользователя SIGSEGV11 Core ISO C Нарушение сегмента SIGUSR212 Term POSIX Сигнал 2 пользователя SIGPIPE13 Term POSIX Нарушенный канал SIGALRM14 Term POSIX Аварийные часы SIGTERM15 Term ISO C Завершение SIGSTKFLT16 Term Linux Ошибка стека в процессоре (не используется) SIGCHLD17 Ignr POSIX Изменение статуса порожденного процесса SIGCLD17 Ignr System V То же, что и SIGCHLD (для совместимости) SIGCONT18 POSIX Продолжить при остановке SIGSTOP19 Stop POSIX Стоп, неблокируемый SIGTSTP20 Stop POSIX Стоп от клавиатуры SIGTTIN21 Slop POSIX Фоновое чтение от tty SIGTTOU22 Stop POSIX Фоновая запись в tty SIGURG23 Ignr BSD Срочный сигнал сокета SIGXCPU24 Core BSD Превышение предела процессора SIGXFSZ25 Core BSD Превышение предела размера файла SIGVTALRM26 Term BSD Виртуальные аварийные часы SIGPROF27 Term BSD Профилирующие аварийные часы SIGWINCH28 Ignr BSD Изменение размера окна SIGIO29 Term BSD Возможен ввод/вывод SIGPOLL29 Term System V Опрашиваемое событие, то же, что и SIGIO (для совместимости) SIGPWR30 Term System V Повторный запуск из-за сбоя питания SIGSYS31 Core POSIX Неверный системный вызов