我维护一个生成二进制数据的命令行实用程序。stdout
数据可以在请求时重定向。这在stdout
重定向到管道或文件时有效,但在stdout
控制台时则较少,因为它会使控制台产生垃圾。
为了保护用户免受此类错误的影响,程序必须检测是否stdout
是控制台,并在是时退出。
现在,这已经不是什么新鲜事了,快速浏览一下 Internet 就会发现多种解决方案。主要缺点是没有“通用”方法,并且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
. 所以问题主要是“用Visual
+控制台编译的是mintty
”。
我一直在寻找一些潜在的备份解决方案,并发现使用不同逻辑的 Visual 控制台检测器的多种变体。但是它们都不会被识别mintty
为控制台,它们都失败了。
我想知道这是否是一个问题mintty
,但我预计如果是这样,更多的应用程序会受到影响。然而,通过互联网搜索此类问题的投诉相对较少,并且没有解决方案。
- 这是一个已知问题吗?
- 有已知的解决方案吗?