CTRL+C и CTRL+BREAK-сигналы

Сочетания клавиш CTRL+C и CTRL+BREAK получают специальную обработку процессами консоли. По умолчанию, если окно консоли имеет фокус клавиатуры, CTRL+C или CTRL+BREAK обрабатывается как сигнал (SIGINT или SIGBREAK), а не как ввод клавиатуры. По умолчанию эти сигналы передаются всем процессам консоли, подключенным к консоли. (Отсоединяемые процессы не затрагиваются. См . статью "Создание консоли".) Система создает новый поток в каждом клиентском процессе для обработки события. Поток вызывает исключение, если выполняется отладка процесса. Отладчик может обрабатывать исключение или продолжать работу с исключением необработанным.

CTRL+BREAK всегда рассматривается как сигнал, но приложение может изменить поведение CTRL+C по умолчанию двумя способами, которые препятствуют вызову функций обработчика:

  • Функция SetConsoleMode может отключить режим ввода ENABLE_PROCESSED_INPUT для входного буфера консоли, поэтому CTRL+C передается как ввод клавиатуры, а не сигнал.
  • При вызове SetConsoleCtrlHandler с значениями NULL и TRUE для параметров вызывающий процесс игнорирует сигналы CTRL+C. Обычная обработка CTRL+C восстанавливается путем вызова SetConsoleCtrlHandler со значениями NULL и FALSE . Этот атрибут игнорировать или не игнорировать сигналы CTRL+C наследуется дочерними процессами, но его можно включить или отключить любым процессом, не затрагивая существующие процессы.

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