Обработка сигнала C
Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
В стандартной библиотеке C обработка сигналов определяет, как программа обрабатывает различные сигналы во время своего выполнения. Сигнал может сообщать о каком-то исключительном поведении внутри программы (например, о делении на ноль ) или сигнал может сообщать о каком-то асинхронном событии вне программы (например, о нажатии клавиши интерактивного внимания на клавиатуре).
Стандартные сигналы
[ редактировать ]Стандарт C определяет только 6 сигналов. Все они определены в signal.h
заголовок ( csignal
заголовок в C++ ): [ 1 ]
SIGABRT
– «прерывание», аварийное завершение.SIGFPE
– исключение с плавающей запятой .SIGILL
– «незаконное», недействительное указание.SIGINT
– «прерывание», интерактивный запрос внимания, отправленный в программу.SIGSEGV
– « нарушение сегментации », неверный доступ к памяти.SIGTERM
– «прекратить», запрос на завершение, отправленный в программу.
Дополнительные сигналы могут быть указаны в 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>
volatile sig_atomic_t status = 0;
static void catch_function(int signo) {
status = signo;
}
int main(void) {
// Set above function as signal handler for the SIGINT signal:
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr);
return EXIT_FAILURE;
}
puts("Raising the interactive attention signal.");
if (raise(SIGINT)) {
fputs("Error raising the signal.\n", stderr);
return EXIT_FAILURE;
}
if (status == SIGINT) puts("Interactive attention signal caught.");
puts("Exiting.");
return EXIT_SUCCESS;
// exiting after raising signal
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Спецификация ISO/IEC 9899:1999 (PDF) . п. 258, § 7.14 Обработка сигналов .
- ^ «Базовые спецификации открытой группы, выпуск 6 — signal.h — сигналы» . Проверено 10 января 2012 г.
- ^ https://man7.org/linux/man-pages/man2/signal.2.html Страница руководства Signal(2)