Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

В стандартной библиотеке 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().

Функции [ править ]

Пример использования [ править ]

#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

Ссылки [ править ]

  1. ^ ISO / IEC 9899: 1999 спецификация (PDF) . п. 258, § 7.14 Обработка сигналов .
  2. ^ «Базовые спецификации открытой группы, выпуск 6 - signal.h - сигналы» . Проверено 10 января 2012 года .
  3. ^ http://man7.org/linux/man-pages/man2/signal.2.html Справочная страница Signal (2)