msys2如何显示非控制台应用程序的控制台输出?

问题描述 投票:3回答:1

如果我编译这个源代码:

#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,然后从msys2内部运行它我会看到:

enter image description here

同时,如果我从powershell(或cmd)调用相同的可执行文件,我会看到:

enter image description here

老实说,鉴于-mwindows说制作一个Windows可执行文件而不是控制台一个,我对后者并不感到惊讶 - 我已经多次看过了。

但msys2如何设法显示该输出?

c windows console mingw msys2
1个回答
1
投票

Windows上的控制台和GUI应用程序之间的差异很小,而C运行时stdio代码通常并不关心,它只关心标准的Win32句柄。

主要区别在于父应用程序中的CreateProcess如何工作。

  • 如果父级具有控制台,则控制台应用程序将连接到父标准Win32句柄。如果父级没有控制台,则会为该应用程序创建一个新的控制台窗口。父级可以将可选标志传递给CreateProcess以强制/拒绝新控制台。
  • GUI应用程序未连接到标准Win32句柄,并且未创建新控制台。

Powershell.exe是一个真正的控制台应用程序,它可以使用默认的CreateProcess处理。因为您的应用程序不是控制台应用程序,所以它将在没有标准句柄的情况下创建,因此无处可写。

msys2终端应用程序可能不是真正的控制台应用程序,可能会使用强制句柄调用CreateProcessSTARTF_USESTDHANDLES)。这些手柄可能是管道的手柄。您的应用程序将这些句柄视为重定向的stdio句柄,并以与cmd.exe执行yourconsoleapp.exe | otherconsoleapp.exe的方式类似的方式执行。

© www.soinside.com 2019 - 2024. All rights reserved.