Как msys2 отображает вывод консоли из неконсольного приложения? - PullRequest
3 голосов
/ 21 апреля 2019

Если я скомпилирую этот исходный код:

#include <stdio.h>

int main(int argc, char* args[]) {
  printf("Done!\n");
  return 0;
}

с gcc hello.c -o hello -mwindows в msys2 , используя mingw-w64-x86_64-toolchain toolchain, а затем запустим его изнутри msys2, я посмотрю:

enter image description here

В то же время, если я вызову этот же исполняемый файл из powershell (или cmd), я увижу:

enter image description here

Если честно, учитывая -mwindows, который говорит о создании исполняемого файла Windows, а не консольного, я не удивлен последним - я видел это многораз.

Но как msys2 удается отобразить этот вывод?

1 Ответ

1 голос
/ 21 апреля 2019

Очень мало различий между консолью и приложением с графическим интерфейсом в Windows, и код stdio времени выполнения C обычно не заботится, он заботится только о стандартных дескрипторах Win32.

Основное отличие заключается в том, как CreateProcess в родительском приложении работает.

  • Консольное приложение подключается к родительским стандартным дескрипторам Win32, если у родителя есть консоль.Если родительский объект не имеет консоли, для приложения создается новое окно консоли.Родитель может передать необязательные флаги CreateProcess для принудительного / отклонения новой консоли.

  • Приложение с графическим интерфейсом не подключено к стандартным дескрипторам Win32, и новая консоль не создается.

Powershell.exe - это настоящее консольное приложение, которое может использовать стандартную обработку CreateProcess.Поскольку ваше приложение не является консольным приложением, оно будет создано без стандартных дескрипторов, и поэтому ему некуда писать.

Терминальное приложение msys2, вероятно, не является настоящим консольным приложением и, вероятно, вызывает CreateProcess с принудительными дескрипторами(* * тысяча двадцать одна).Эти ручки, вероятно, ручки для труб.Ваше приложение увидит эти дескрипторы как перенаправленные stdio-дескрипторы и будет работать аналогично тому, как cmd.exe будет выполнять yourconsoleapp.exe | otherconsoleapp.exe.

...