Linux программирование в примерах - Арнольд Роббинс
Шрифт:
Интервал:
Закладка:
Функция 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 Неверный системный вызовОбозначения: Core: Завершить процесс и создать снимок образа процесса Ignr: Игнорировать сигнал Stop: Остановить процесс. Term: Завершить процесс.
Более старые версии оболочки Борна (/bin/sh) непосредственно связывали с номерами сигналов ловушки (traps), которые являются обработчиками сигналов на уровне оболочки. Таким образом, всесторонне образованному Unix-программисту нужно было знать не только имена сигналов для использования в коде С, но также и соответствующие номера сигналов! POSIX требует, чтобы команда trap понимала символические имена сигналов (без префикса 'SIG'), поэтому этого больше не требуется. Однако (главным образом для лучшего разбирательства), мы предоставили эти номера в интересах полноты из-за того, что однажды вам может понадобиться иметь дело со сценарием оболочки, созданным до POSIX, или с древним кодом на С, которые непосредственно используют номера сигналов.
ЗАМЕЧАНИЕ. Для некоторых более новых сигналов, от 16 и выше, соответствующие номера сигнала и их имена на различных платформах не обязательно совпадают! Проверьте заголовочные файлы и справочные страницы на своей системе. Табл. 10.1 верна для GNU/Linux
Некоторые системы определяют также и другие сигналы, такие, как SIGEMT, SIGLOST и SIGINFO. Справочная страница GNU/Linux signal(7) предоставляет полный список; если ваша программа должна обработать сигналы, не поддерживаемые GNU/Linux, это можно сделать с помощью #ifdef: