Я поддерживаю утилиту командной строки, которая генерирует двоичные данные.Данные могут быть перенаправлены к stdout
по запросу.Это действительно, когда stdout
перенаправляется в канал или файл, но в меньшей степени, когда stdout
является консолью, поскольку это может привести к загрязнению консоли.
Чтобы защитить пользователей от такой ошибки,Программа должна определить, является ли stdout
консолью или нет, и выручить, когда это так.
Теперь, в этом нет ничего нового, и быстрый просмотр интернета найдет несколько решений.Основным недостатком является то, что не существует «универсального» метода, и 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
, хотя я ожидаю, что если это так, больше приложений будетвоздействие.Тем не менее, поиск такой проблемы через Интернет вызывает относительно мало жалоб и не дает решения.
- Это известная проблема?
- Есть ли известное решение?