如果我编译这个源代码:
#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内部运行它我会看到:
同时,如果我从powershell(或cmd)调用相同的可执行文件,我会看到:
老实说,鉴于-mwindows
说制作一个Windows可执行文件而不是控制台一个,我对后者并不感到惊讶 - 我已经多次看过了。
但msys2如何设法显示该输出?
Windows上的控制台和GUI应用程序之间的差异很小,而C运行时stdio代码通常并不关心,它只关心标准的Win32句柄。
主要区别在于父应用程序中的CreateProcess
如何工作。
CreateProcess
以强制/拒绝新控制台。Powershell.exe是一个真正的控制台应用程序,它可以使用默认的CreateProcess
处理。因为您的应用程序不是控制台应用程序,所以它将在没有标准句柄的情况下创建,因此无处可写。
msys2终端应用程序可能不是真正的控制台应用程序,可能会使用强制句柄调用CreateProcess
(STARTF_USESTDHANDLES
)。这些手柄可能是管道的手柄。您的应用程序将这些句柄视为重定向的stdio句柄,并以与cmd.exe执行yourconsoleapp.exe | otherconsoleapp.exe
的方式类似的方式执行。