Обработка сигналов C - C signal handling
Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
в Стандартная библиотека C, обработка сигналов определяет, как программа обрабатывает различные сигналы пока он выполняется. Сигнал может сообщать об исключительном поведении в программе (Такие как деление на ноль ), или сигнал может сообщить о каком-то асинхронном событии вне программы (например, кто-то ударил интерактивный ключ внимания на клавиатуре).
Стандартные сигналы
Стандарт C определяет только 6 сигналов. Все они определены в signal.h
заголовок (csignal
заголовок в C ++ ):[1]
SIGABRT
- «прерывание», аварийное завершение.SIGFPE
- жлюбящий пмазь еxception.СИГИЛЛ
- «недопустимая», неверная инструкция.SIGINT
- «прерывание», интерактивный запрос внимания, отправленный программе.SIGSEGV
- "сегмышление vожесточение ", недопустимый доступ к памяти.SIGTERM
- «terminate», запрос на завершение отправляется программе.
Дополнительные сигналы могут быть указаны в signal.h
заголовок реализацией. Например, Unix и Unix-подобный операционные системы (такие как Linux ) определить более 15 дополнительных сигналов; видеть Сигнал Unix.[2]
Отладка
SIGTRAP
в целях отладки. Он зависит от платформы и может использоваться на Unix -подобные операционные системы.
Умение обращаться
Сигнал можно получить, позвонив поднимать()
или же убийство()
системные вызовы. поднимать()
посылает сигнал текущему процессу, убийство()
отправляет сигнал определенному процессу.
Обработчик сигнала - это функция который вызывается целевой средой при появлении соответствующего сигнала. Целевая среда приостанавливает выполнение программы до тех пор, пока обработчик сигнала не вернется или не вызовет longjmp ()
.
Обработчики сигналов могут быть установлены с помощью сигнал ()
или же sigaction ()
. Поведение сигнал ()
был изменен несколько раз за всю историю и теперь считается устаревшим.[3] Он переносится только тогда, когда используется для установки расположения сигнала в SIG_DFL или SIG_IGN. Обработчики сигналов могут быть указаны для всех сигналов, кроме двух (СИГКИЛЛ и SIGSTOP не могут быть пойманы, заблокированы или проигнорированы).
Если сигнал сообщает об ошибке в программе (и сигнал не является асинхронным), обработчик сигнала может завершить работу, вызвав прерывание ()
, выход()
, или же longjmp ()
.
Функции
Функция | Описание |
---|---|
поднимать | искусственно подает сигнал |
сигнал | устанавливает действие, выполняемое при получении программой определенного сигнала |
Пример использования
#включают <signal.h>#включают <stdio.h>#включают <stdlib.h>статический пустота catch_function(int Signo) { ставит(«Обнаружен интерактивный сигнал внимания».);}int главный(пустота) { // Установите указанную выше функцию в качестве обработчика сигнала SIGINT: если (сигнал(SIGINT, catch_function) == SIG_ERR) { fputs("Произошла ошибка при установке обработчика сигнала.", stderr); возвращаться EXIT_FAILURE; } ставит(«Повышение интерактивного сигнала внимания».); если (поднимать(SIGINT) != 0) { fputs("Ошибка при поднятии сигнала.", stderr); возвращаться EXIT_FAILURE; } ставит("Выход".); возвращаться EXIT_SUCCESS; // выход после повышения сигнала}
Смотрите также
Рекомендации
- ^ ISO / IEC 9899: 1999 спецификация (PDF). п. 258, § 7.14 Обработка сигналов.
- ^ "Базовые спецификации Open Group, выпуск 6 - signal.h - сигналы". Получено 10 января 2012.
- ^ http://man7.org/linux/man-pages/man2/signal.2.html Справочная страница Signal (2)