Detecting if stdout is a console with MS Visual compilation, mingw64提供的console
Detecting if stdout is a console with MS Visual compilation, with console provided by mingw64
我维护一个生成二进制数据的命令行实用程序。请求时,数据可以重定向到 stdout
。
这在 stdout
重定向到管道或文件时有效,
但当 stdout
是一个控制台时就不那么重要了,因为它会垃圾控制台。
为了保护用户免受此类错误,程序必须检测 stdout
是否是控制台,并在是时退出。
现在,这不是什么新鲜事了,快速浏览一下 Internet 会发现多种解决方案。主要缺点是没有"universal"方法,Visual Studio
需要自己的风味
我用于 Visual 的控制台检测器有一个缺陷:它没有检测到 stdout
是一个控制台 当 控制台由 mingw
,我认为这意味着它是 mintty
。
这里是相关的代码部分:
#if defined(WIN32) || defined(_WIN32)
# include <io.h> /* _isatty */
# include <windows.h> /* DeviceIoControl, HANDLE, FSCTL_SET_SPARSE */
# include <stdio.h> /* FILE */
static __inline int IS_CONSOLE(FILE* stdStream) {
DWORD dummy;
return _isatty(_fileno(stdStream)) &&
GetConsoleMode((HANDLE)_get_osfhandle(_fileno(stdStream)), &dummy);
}
#endif
请注意,控制台检测器可以与内置 Windows 控制台 (conhost.exe) 一起正常工作。当二进制文件由 mingw64
编译时,它也能正常工作。所以问题主要是 "compiled with Visual
+ console is mintty
".
我一直在寻找一些潜在的备份解决方案,并发现了多种使用不同逻辑的 Visual 控制台检测器变体。但是 none 将 mintty
识别为控制台,它们都失败了。
我想知道这是否是 mintty
的问题,但我预计如果是的话,会有更多的应用程序受到影响。然而,通过互联网搜索此类问题得到的投诉相对较少,也没有解决方案。
- 这是一个已知问题吗?
- 是否有已知的解决方案?
mintty
是一个终端仿真器,不向 运行ning 应用程序提供控制台。当我需要 运行 一个真正的控制台程序时,我必须使用 winpty
。例如 winpty powershell
将允许 powershell 在 mintty
内正确地 运行。
这是一个已知问题,git
等多个应用程序都可以解决这个问题。这也是我发现的。
https://github.com/fusesource/jansi-native/issues/11.
https://github.com/fusesource/jansi-native/commit/461068c67a38647d2890e96250636fc0117074f5
所以显然你还应该检查你是否连接到具有以下名称的管道:
/*
* Check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX')
* or a cygwin pty pipe ('cygwin-XXXX-ptyN-XX')
*/
我维护一个生成二进制数据的命令行实用程序。请求时,数据可以重定向到 stdout
。
这在 stdout
重定向到管道或文件时有效,
但当 stdout
是一个控制台时就不那么重要了,因为它会垃圾控制台。
为了保护用户免受此类错误,程序必须检测 stdout
是否是控制台,并在是时退出。
现在,这不是什么新鲜事了,快速浏览一下 Internet 会发现多种解决方案。主要缺点是没有"universal"方法,Visual Studio
需要自己的风味
我用于 Visual 的控制台检测器有一个缺陷:它没有检测到 stdout
是一个控制台 当 控制台由 mingw
,我认为这意味着它是 mintty
。
这里是相关的代码部分:
#if defined(WIN32) || defined(_WIN32)
# include <io.h> /* _isatty */
# include <windows.h> /* DeviceIoControl, HANDLE, FSCTL_SET_SPARSE */
# include <stdio.h> /* FILE */
static __inline int IS_CONSOLE(FILE* stdStream) {
DWORD dummy;
return _isatty(_fileno(stdStream)) &&
GetConsoleMode((HANDLE)_get_osfhandle(_fileno(stdStream)), &dummy);
}
#endif
请注意,控制台检测器可以与内置 Windows 控制台 (conhost.exe) 一起正常工作。当二进制文件由 mingw64
编译时,它也能正常工作。所以问题主要是 "compiled with Visual
+ console is mintty
".
我一直在寻找一些潜在的备份解决方案,并发现了多种使用不同逻辑的 Visual 控制台检测器变体。但是 none 将 mintty
识别为控制台,它们都失败了。
我想知道这是否是 mintty
的问题,但我预计如果是的话,会有更多的应用程序受到影响。然而,通过互联网搜索此类问题得到的投诉相对较少,也没有解决方案。
- 这是一个已知问题吗?
- 是否有已知的解决方案?
mintty
是一个终端仿真器,不向 运行ning 应用程序提供控制台。当我需要 运行 一个真正的控制台程序时,我必须使用 winpty
。例如 winpty powershell
将允许 powershell 在 mintty
内正确地 运行。
这是一个已知问题,git
等多个应用程序都可以解决这个问题。这也是我发现的。
https://github.com/fusesource/jansi-native/issues/11.
https://github.com/fusesource/jansi-native/commit/461068c67a38647d2890e96250636fc0117074f5
所以显然你还应该检查你是否连接到具有以下名称的管道:
/*
* Check if this could be a MSYS2 pty pipe ('msys-XXXX-ptyN-XX')
* or a cygwin pty pipe ('cygwin-XXXX-ptyN-XX')
*/