Сигналы 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 наследуется дочерними процессами, но его можно включить или отключить в любом процессе, не затрагивая имеющиеся процессы.

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