Обнаружение, является ли stdout консолью с компиляцией MS Visual, с консолью, предоставленной mingw64 - PullRequest
0 голосов
/ 27 декабря 2018

Я поддерживаю утилиту командной строки, которая генерирует двоичные данные.Данные могут быть перенаправлены к 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, хотя я ожидаю, что если это так, больше приложений будетвоздействие.Тем не менее, поиск такой проблемы через Интернет вызывает относительно мало жалоб и не дает решения.

  • Это известная проблема?
  • Есть ли известное решение?

1 Ответ

0 голосов
/ 27 декабря 2018

mintty является эмулятором терминала и не представляет консоль запущенному приложению.Когда мне нужно запустить настоящую консольную программу, я должен использовать 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')
 */
...