Как я обнаруживаю, когда произведенный перенаправляется?

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

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

Какие-либо идеи?

9
задан Michael Kohne 22 May 2014 в 05:31
поделиться

4 ответа

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

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

fpost_t pos ;

fgetpos (stdout, & pos) ;

Когда вывод приложения перенаправляется в файл, fgetpos() устанавливает 'pos' в ноль. Это имеет смысл, так как его свежеоткрытый stderr для вас. EDIT: На самом деле возвращаемое значение может быть положительным целым числом, если текст уже был перенаправлен в лог/файл. Таким образом, в вашем коде будет что-то вроде "if (pos >= 0) bfRedirected = TRUE ;"

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

5
ответ дан 3 November 2019 в 03:47
поделиться

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

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

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

  • Программа может запрашивать историю команды оболочки, чтобы узнать самые последние команды.
  • Если вы знаете путь к LogFiles, вы можете сканировать этот каталог и посмотреть, был ли файл создан или изменил его размер.
  • Тема скорости записи при перенаправленной и не перенаправленной. Это будет работать только в том случае, если ваша система ультрашительна, а состояние окружающей среды не изменится.
2
ответ дан 3 November 2019 в 03:47
поделиться

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

1
ответ дан 3 November 2019 в 03:47
поделиться

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

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

0
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: