msys2 如何显示来自非控制台应用程序的控制台输出?
How does msys2 display console output from non-console application?
如果我编译这个源代码:
#include <stdio.h>
int main(int argc, char* args[]) {
printf("Done!\n");
return 0;
}
with gcc hello.c -o hello -mwindows
under msys2 using mingw-w64-x86_64-toolchain
toolchain,然后 运行 从 msys2 里面我会看到:
同时,如果我从 powershell(或 cmd)调用同一个可执行文件,我会看到:
老实说,考虑到 -mwindows
说要生成 windows 可执行文件而不是控制台,我对后者并不感到惊讶 - 我已经看过很多次了.
但是 msys2 如何设法显示该输出?
Windows 上的控制台和 GUI 应用程序之间几乎没有区别,C run-time stdio 代码通常不关心,它只关心标准的 Win32 句柄。
主要区别在于 parent 应用程序中 CreateProcess
的工作方式。
如果 parent 有控制台,则控制台应用程序会连接到 parent 的标准 Win32 句柄。如果 parent 没有控制台,则会为应用程序创建一个新的控制台 window。 parent 可以将可选标志传递给 CreateProcess
到 force/deny 新控制台。
GUI 应用程序没有连接到标准的 Win32 句柄,也没有创建新的控制台。
Powershell.exe 是一个真正的控制台应用程序,它可以使用默认的 CreateProcess
处理。因为您的应用程序不是控制台应用程序,所以将在没有标准句柄的情况下创建它,因此它无处可写。
msys2 终端应用程序可能不是真正的控制台应用程序,并且可能使用强制句柄 (STARTF_USESTDHANDLES
) 调用 CreateProcess
。这些句柄可能是管道的句柄。您的应用程序会将这些句柄视为重定向的 stdio 句柄,并以与 cmd.exe 执行方式类似的方式执行 yourconsoleapp.exe | otherconsoleapp.exe
.
如果我编译这个源代码:
#include <stdio.h>
int main(int argc, char* args[]) {
printf("Done!\n");
return 0;
}
with gcc hello.c -o hello -mwindows
under msys2 using mingw-w64-x86_64-toolchain
toolchain,然后 运行 从 msys2 里面我会看到:
同时,如果我从 powershell(或 cmd)调用同一个可执行文件,我会看到:
老实说,考虑到 -mwindows
说要生成 windows 可执行文件而不是控制台,我对后者并不感到惊讶 - 我已经看过很多次了.
但是 msys2 如何设法显示该输出?
Windows 上的控制台和 GUI 应用程序之间几乎没有区别,C run-time stdio 代码通常不关心,它只关心标准的 Win32 句柄。
主要区别在于 parent 应用程序中 CreateProcess
的工作方式。
如果 parent 有控制台,则控制台应用程序会连接到 parent 的标准 Win32 句柄。如果 parent 没有控制台,则会为应用程序创建一个新的控制台 window。 parent 可以将可选标志传递给
CreateProcess
到 force/deny 新控制台。GUI 应用程序没有连接到标准的 Win32 句柄,也没有创建新的控制台。
Powershell.exe 是一个真正的控制台应用程序,它可以使用默认的 CreateProcess
处理。因为您的应用程序不是控制台应用程序,所以将在没有标准句柄的情况下创建它,因此它无处可写。
msys2 终端应用程序可能不是真正的控制台应用程序,并且可能使用强制句柄 (STARTF_USESTDHANDLES
) 调用 CreateProcess
。这些句柄可能是管道的句柄。您的应用程序会将这些句柄视为重定向的 stdio 句柄,并以与 cmd.exe 执行方式类似的方式执行 yourconsoleapp.exe | otherconsoleapp.exe
.