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