Пример: обработчик управляющих сигналов консоли

Пример: обработчик управляющих сигналов консоли

В программе 4.5 организован бесконечный цикл, в котором каждые 5 секунд вызывается функция Веер, подающая звуковой сигнал. Пользователь может завершить выполнение программы, нажав комбинацию клавиш <Ctrl+C> или закрыв консоль. Процедура обработчика выводит на экран сообщение, выжидает 10 секунд, после чего, казалось бы, выполнение программы должно завершиться с возвратом значения TRUE. Однако в действительности основная программа обнаруживает флаг Exit и останавливает процесс. Это демонстрирует параллельную природу выполнения процедуры обработчика; заметьте, что объем выходной информации обработчика сигналов зависит от временных характеристик сигнала. Обработчики управляющих сигналов консоли будут использоваться также в примерах, приводимых в следующих главах.

Обратите внимание на использование макроса WINAPI; он применяется к пользовательским функциям, передаваемым в качестве аргументов функциям Windows, чтобы гарантировать выполнение соответствующих соглашений о вызовах. Этот макрос определен в заголовочном файле Microsoft С WTYPES.Н.

Программа 4.5. Ctrlc: программа обработки сигналов 

/* Глава 4. Ctrlc.с */

/* Перехватчик событий консоли. */

#include "EvryThng.h"

static BOOL WINAPI Handler(DWORD CtrlEvent); /* См. WTYPES.H. */

volatile static BOOL Exit = FALSE;

int _tmain(int argc, LPTSTR argv[])

 /* Периодическая подача звукового сигнала до поступления сигнала о прекращении выполнения. */

{

 /* Добавить обработчик событий. */

 if (!SetConsoleCtrlHandler(Handler, TRUE)) ReportError(_T("Ошибка при установке обработчика событий."), 1, TRUE);

 while (!Exit) {

  Sleep (5000); /* Подача звукового сигнала каждые 5 секунд. */

  Веер(1000 /* Частота. */, 250 /* Длительность. */);

 }

 _tprintf(_T("Прекращение выполнения программы по требованию. "));

 return 0;

}

BOOL WINAPI Handler (DWORD CtrlEvent) {

 Exit = TRUE;

 switch (CntrlEvent) {

 /* Увидите ли вы второе сообщения обработчика, зависит от соотношения временных параметров. */

 case CTRL_C_EVENT:

  _tprintf(_T("Получен сигнал Ctrl-c. Выход из обработчика через 10 секунд. "));

  Sleep(4000); /* Уменьшите это значение, чтобы получить другой эффект. */

  _tprintf(_T("Выход из обработчика через 6 секунд. "));

  Sleep(6000); /* Попробуйте уменьшить и это значение. */

  return TRUE; /* TRUE указывает на успешную обработку сигнала. */

 case CTRL_CLOSE_EVENT:

  _tprintf(_T("Выход из обработчика через 10 секунд. "));

  Sleep(4000);

  _tprintf(_Т ("Выход из обработчика через 6 секунд. "));

  Sleep (6000); /* Попробуйте уменьшить и это значение. */

  return TRUE; /* Попробуйте возвратить FALSE. Приводит ли это к изменению поведения программы? */

 default:

  _tprintf(_T("Событие: %d. Выход из обработчика через 10 секунд. "), CntrlEvent);

  Sleep(4000);

  _tprintf(_T("Выход из обработчика через 6 секунд. "));

  Sleep(6000);

  return TRUE;

 }

} 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

6.1. Русификация консоли

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

6.1. Русификация консоли Выбор языка системы производится при установке системы или при помощи соответствующих конфигураторов: keyboarddrake в Linux Mandrake и setup в Linux Red Hat. В случае некорректного отображения русских символов нужно подправить файл /etc/inputrc (см. листинг 6.1), изменив


7.2.6.4. Учебный пример: использование сигналов в программе fetchmail

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

7.2.6.4. Учебный пример: использование сигналов в программе fetchmail Утилита fetchmail обычно устанавливается для работы в качестве демона в фоновом режиме, который без вмешательства пользователя периодически собирает почту со всех удаленных узлов, указанных в конфигурационном


Универсальный обработчик исключений

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Универсальный обработчик исключений В одном блоке try можно вызывать исключения разных типов. В этом случае после блока try должны следовать обработчики для исключений каждого типа. Вы можете определить обработчик, обслуживающий исключения всех типов. Для этого вместо


7.2.6.4. Учебный пример: использование сигналов в программе fetchmail

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

7.2.6.4. Учебный пример: использование сигналов в программе fetchmail Утилита fetchmail обычно устанавливается для работы в качестве демона в фоновом режиме, который без вмешательства пользователя периодически собирает почту со всех удаленных узлов, указанных в конфигурационном


Обработчики управляющих сигналов консоли

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Обработчики управляющих сигналов консоли Обработчики исключений могут реагировать на самые разнообразные события, но они не в состоянии обнаруживать такие ситуации, как выход пользователя из системы или нажатие комбинации клавиш <Ctrl+C> на клавиатуре с целью


Генерация управляющих событий консоли

Из книги VBA для чайников автора Каммингс Стив

Генерация управляющих событий консоли Прерывание выполнения процесса извне может порождать проблемы, поскольку это лишает процесс возможности произвести необходимую завершающую обработку данных и очистку ресурсов. Воспользоваться SEH в данном случае нельзя ввиду


Обработчик управляющих команд службы

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Обработчик управляющих команд службы Обработчик управляющих команд службы, то есть функция косвенного вызова, определяемая с помощью функции RegisterServiceCtrlHandlerEx, имеет следующий прототип:  DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)  dwControl — обозначает


Обработчик прерывания

Из книги Разработка ядра Linux автора Лав Роберт

Обработчик прерывания Давайте рассмотрим собственно обработчик прерывания. В первом примере применим InterruptAttach(), а затем рассмотрим аналогичный случай, только с применением функции InterruptAttachEvent().Применение функции InterruptAttach()В продолжение примера приведем функцию intHandler()


Настоящий обработчик прерывания

Из книги автора

Настоящий обработчик прерывания Давайте рассмотрим настоящий обработчик прерывания, который используется в драйвере устройства RTC (real-time clock, часы реального времени), находящегося в файле drivers/char/rtc.c. Устройство RTC есть во многих вычислительных системах, включая


Обработчик прерываний таймера

Из книги автора

Обработчик прерываний таймера Теперь, когда мы разобрались, что такое jiffies и HZ, а также какова роль системного таймера, рассмотрим реализацию обработчика прерываний системного таймера. Обработчик прерываний таймера разбит на две части: часть, зависимую от аппаратной