Здавалка
Главная | Обратная связь

Установка обработчика сигнала



Простейшая функция, с помощью которой можно изменить обработку сигнала, это функция signal, описанная следующим образом:

#include <signal.h>

void (*signal(int, void (*handler)(int)))(int);

Если ввести специальный тип для указателя на функцию-обработчик сигнала, определение функции упростится:

typedef void (*sighandler_t)(int signum);

sighandler_t signal( int signum, sighandler_t handler);

Первый аргумент signum задает номер сигнала, обработку которого нужно изменить. Вместо номера сигнала предпочтительнее использовать символическое имя сигнала, как определено выше.

Второй аргумент handler определяет, как будет обрабатываться сигнал. Он может принимать следующие значения:

SIG_DFL устанавливает обработку сигнала на стандартную обработку по умолчанию (см. таблицы выше).

SIG_IGN задает, что сигнал должен игнорироваться. Программа не должна игнорировать сигналы, которые обозначают серьёзные программные ошибки или используются для завершения процесса. Если процесс игнорирует сигнал SIGSEGV и другие аналогичные сигналы, его поведение после ошибки неопределено (например, он может зациклиться на месте ошибки). Игнорировать запросы пользователя, такие как SIGINT и пр. — недружественно по отношению к пользователю.

Третья возможность — это задать функцию обработки сигнала. Эта функция будет вызвана, когда процесс получит сигнал.

Если обработка сигнала устанавливается в SIG_IGN, или когда обработка сигнала устанавливается в SIG_DFL, а обработка по умолчанию игнорирует сигнал, все сигналы этого типа, ожидающие доставки, будут сброшены, даже если они заблокированы. Такие сигналы никогда не будут доставлены, даже если впоследствии обработчик сигнала будет переустановлен, и сигнал будет разблокирован.

Функция signal возвращает предыдущий обработчик сигнала. Это значение может использоваться для того, чтобы восстановить старый обработчик, если это необходимо.

Функция signal присутствует в стандарте ANSI C, тем не менее её использование не рекомендуется. Исторически существовало два подхода к обработке сигналов: подход, реализованный в System V, и подход BSD, различия между которыми приведены в таблице ниже. Поэтому рекомендуется использовать более универсальную функцию sigaction, описанную ниже.

Свойство System V BSD
Блокировка сигнала Текущий обрабатываемый сигнал не блокируется на время выполнения обработчика. Текущий обрабатываемый сигнал блокируется на время выполнения обработчика.
Сброс обработчика Обработчик переустанавливает­ся на обработчик по умолчанию. Обработчик не переустанавливается на обработчик по умолчанию.
Системные вызовы Прерываются с кодом ошибки EINTR. Перезапускаются.

 

Пример программы

В следующем примере программа завершит работу, когда три раза будет нажата комбинация Ctrl-C. Предполагается, что функция signal поддерживает семантику BSD, то есть программа будет работать без изменений на операционных системах семейства BSD и н Linux.

#include <stdio.h>

#include <signal.h>

int cnt = 0;







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.