Как определить, когда вывод перенаправляется? - PullRequest
9 голосов
/ 18 января 2010

У меня есть приложение Win32, написанное на C, которое может выводить консоль через printf () , перенаправленным в файл журнала.

Было бы неплохо, если бы я мог получить свое приложение. определить, был ли он запущен с или без перенаправления '>'.

Есть идеи?

Ответы [ 5 ]

5 голосов
/ 18 января 2010

Том, спасибо за ввод.

Я провел несколько экспериментов и обнаружил, что это работает для меня ..

fpost_t pos ;

fgetpos (stdout, & pos) ;

Когда выходные данные приложения перенаправляются в файл, fgetpos () устанавливает 'pos' в ноль.Это имеет смысл, так как его недавно открытый stderr для вас. РЕДАКТИРОВАТЬ: На самом деле возвращаемое значение может быть положительным целым числом, если текст уже был перенаправлен в журнал / файл.Таким образом, в вашем коде у вас будет что-то вроде «if (pos> = 0) bfRedirected = TRUE;»

Когда вывод приложения не перенаправляется - он идет на консольное устройство - не файл,fgetpos () установит для pos значение -1. ​​

2 голосов
/ 18 января 2010

Я думаю, что каналы по своей природе слепы, поэтому у вас нет встроенного способа определить, перенаправлены ли вы. Более того, пытаться выяснить, что происходит за слоем абстракции, - плохая привычка.

Если вам действительно нужно контролировать вывод, добавьте имя файла журнала в качестве параметра командной строки!

При этом, вы можете сделать некоторые умные догадки, чтобы узнать:

  • Программа может запросить историю команд оболочки, чтобы узнать, какие последние команды были выполнены.
  • Если вам известен путь к файлам журналов, вы можете отсканировать этот каталог и посмотреть, был ли файл создан или изменился его размер.
  • Тест скорости записи при перенаправлении, а не при перенаправлении. Это будет работать только в том случае, если ваша система является сверхстабильной, и состояние среды не изменится.
1 голос
/ 18 января 2010

Может быть способ сделать это - быстрый гугл дал хит , который может дать вам подсказку в правильном направлении.

0 голосов
/ 14 мая 2018

Метод от Microsoft: WriteConsole завершается ошибкой, если он используется со стандартным дескриптором, который перенаправляется в файл. Если приложение обрабатывает многоязычный вывод, который можно перенаправить, определите, является ли дескриптор вывода дескриптором консоли (один из методов - вызвать функцию GetConsoleMode и проверить, успешно ли она выполнена).

0 голосов
/ 18 января 2010

AFAIK ответ на этот вопрос, что вы не можете. Перенаправление вывода работает путем простого чтения потока вывода из данной программы и перенаправления его в другой канал / поток. Структура файла / потоков такова, что автор не знает о читателе до такой степени, что вы не должны знать, что вас читают.

Даже обнаружение, что был читатель, было бы бесполезно, потому что в обычном случае он есть. Консоль читает вывод вашей программы и выводит его на экран уже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...