Книга: Linux программирование в примерах
10.4.3. Игнорирование сигналов
10.4.3. Игнорирование сигналов
Более практично, когда вызывается обработчик сигнала, это означает, что программа должна завершиться и выйти. Было бы раздражающим, если бы большинство программ по получении SIGINT
выводили бы сообщение и продолжали работу; смысл сигнала в том, что они должны остановиться!
Например, рассмотрите программу sort
. sort
, возможно, создала любое число временных файлов для использования на промежуточных этапах процесса сортировки. По получении SIGINT
, sort
должна удалить временные файлы и выйти. Вот упрощенная версия обработчика сигнала из GNU Coreutils sort.c
:
/* Обработка прерываний и отсоединений. Упрощена для представления */
static void sighandler(int sig) {
signal(sig, SIG_IGN); /* Отныне этот сигнал игнорировать */
cleanup(); /* Очистка после себя */
signal(sig, SIG_DFL); /* Восстановление действия по умолчанию */
raise(sig); /* Повторно отправить сигнал */
}
Установка действия SIG_IGN
гарантирует, что все последующие появляющиеся сигналы SIGINT
не повлияют на продолжающийся процесс очистки. Когда функция cleanup()
завершит работу, восстановление действия SIG_DFL
позволяет системе сделать снимок образа процесса, если это нужно возникшему сигналу. Вызов raise()
восстанавливает сигнал. Затем восстановленный сигнал вызывает действие по умолчанию, которое, скорее всего, завершит программу. (Далее в этой главе мы полностью покажем обработчик сигнала sort.c
.)
- 10.4. Обработчики сигналов в действии
- 10.6.5. Извлечение ожидающих сигналов: sigpending()
- 12.1. Концепция сигналов
- 10.2. Действия сигналов
- 7.4. Аналоговые перемножители сигналов
- 15.1.3. Обработка сигналов управления заданиями
- Пример: обработчик управляющих сигналов консоли
- 10.6.4. Перехват сигналов: sigaction()
- 19.7.9. Обработка сигналов и протоколирование
- 10.6.3. Управление маской сигналов: sigprocmask() и др.
- 10.3.2. Программная отправка сигналов: raise()
- 10.5. API сигналов System V Release 3: sigset() и др.