Ни одна из ваших четырех возможностей на самом деле не подходит, и ответ на ваш дополнительный вопрос: «Какой из двух процессов отвечает за управление окном?», Заключается в том, что ни один процесс не отвечает , Программы TUI вообще не должны ничего знать об окнах , а под крышками не обязательно даже подключаться к GUI.
Консоли - это объекты, доступ к которым осуществляется с помощью таких же дескрипторов, как файлы, каталоги, каналы, процессы и потоки. Один процесс не «владеет» консолью через свой дескриптор, так же как процесс «владеет» любым файлом, к которому у него есть открытый дескриптор. Дескрипторы к консолям наследуются дочерними процессами от их родителей так же, как и все другие (наследуемые) дескрипторы. Ваше приложение TUI, созданное CMD, просто наследует стандартные дескрипторы, которые CMD сказал, что оно должно наследовать, когда оно вызывает CreateProcess()
& mdash; которые обычно будут стандартным вводом, выводом и ошибкой CMD (если командная строка не указала CMD использовать некоторые другие дескрипторы в качестве стандартного ввода, вывода и ошибки дочернего элемента).
Консоли не зависят от CMD. Они существуют до тех пор, пока есть (а) какие-либо открытые дескрипторы входных или выходных буферов консоли или (б) любые процессы, иным образом "прикрепленные" к консоли. Таким образом, в вашем примере вы можете убить CMD, но консоль на самом деле будет уничтожена только тогда, когда вы также завершите дочерний процесс.
Процесс, отвечающий за отображение окон графического интерфейса пользователя, в которых представлены консоли, в Windows NT до версии 6.1, CSRSS, - подсистема времени выполнения клиент-сервер. Код обработки окна находится в WINSRV.DLL, который содержит «консольный сервер», который & mdash; под одеялом & ndash; Программы Win32, выполняющие консольный ввод / вывод, выполняют LPC-вызовы. В Windows NT 6.1 эта функциональность по причинам , охваченным Рэймондом Ченом , перешла из CSRSS в менее привилегированный процесс, который порождает CSRSS.