Как сообщение Ctrl-C доставляется процессу, работающему в Windows? - PullRequest
7 голосов
/ 04 декабря 2011

Я создал консольное приложение C # для обработки Ctrl - C , подписав его на событие Console.CancelKeyPress.Когда я выполнил (отладочную версию) приложение, в процессе уже было создано 14 потоков.Когда я нажал Ctrl - C , был создан новый 15-й поток и был вызван мой обработчик.Я использовал проводник процессов из sysinternals для просмотра состояния процесса.

Мне любопытно узнать о том, как доставляется сообщение Ctrl - C процесс и как создается дополнительный поток?Я предполагаю, что даже если я не подпишусь на событие, оно все равно создаст дополнительный поток и выйдет из процесса.Как механизм по умолчанию для обработки Ctrl - C настроен для приложения.

Я разработчик .net, но хочу понять, как работает операционная система Windows.работает под капотом.Вышеупомянутый вопрос только из любопытства, чтобы узнать операционную систему Windows.

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Когда Windows необходимо уведомить консольную программу о внешнем событии, цикл отправки сообщений в окно отсутствует, поэтому Windows создаст поток в целевом процессе для выполнения любой функции обратного вызова. определены. Обработчик по умолчанию для события CTRL + C просто вызывает ExitProcess, но перехват события CancelKeyPress вызывает функцию Win32 SetConsoleCtrlHandler с функцией обработчика.

Документация для функции обработчика объясняет, как она работает:

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

Обратите внимание, что поток, который Windows внедряет в ваш процесс, имеет довольно небольшой стек, поэтому процедура обработчика CLR фактически ставит в очередь рабочий элемент Threadpool для выполнения вашего обработчика событий. Это означает, что поток, введенный Windows и рабочим потоком, может быть создан одновременно, в результате чего во время обработки события CTRL + C вы увидите до 2 дополнительных потоков.

1 голос
/ 04 декабря 2011

Да, Windows запускает поток для вызова обработчика, зарегистрированного SetConsoleCtrlHandler () .Который вызывается методом Hook () небольшого внутреннего вспомогательного класса с именем ControlCHooker.Который вызывается аксессором add () события Cancel.CancelKeyPress.Обратный вызов Windows запускает ваш обработчик событий.

Хороший дизассемблер, такой как Reflector или ILSpy, а также справочный источник могут помочь вам обнаружить эти детали реализации.

...