Здравствуйте! Собственно, проблема в том, чтобы узнать, перенаправлен ли стандартный вывод в файл или нет. Смысл - если пользователь написал в командной строке "myexe.exe >debug.log", значит надо делать вывод дополнительной инфы. Если же вывод идет на экран, тогда работаем как обычно. Сканировать ради этого командную строку желания нет, ибо думается, что получить сведения о перенаправлении stdout можно как-то проще и надежнее. Интересует правильная последовательность системных вызовов DOS (int 21h) и/или чтение каких-либо стандартных переменных DOS. Повторюсь: нужно не перенаправлять stdout (об этом полно статей в тырнете), а узнать, куда он в данный момент направлен - на экран или в файл. Спасибо.
Ykidia, неправильная, в корне, идея. Весь смысл потоков ввода/вывода в том что б делать перенаправления: ./app -a -b -c | grep "/my/log" | less Добавь ключик и не парь моск.
Смотри чему равен stdout handle, если 1 - то консоль. Вот пример работы: http://bookz.ru/authors/avtor-neizvesten-3/msdosrukvorz/page-18-msdosrukvorz.html
http://www.ctyme.com/intr/rb-2820.htm Если после int 21h/ax=4400h/bx=1 (хендл stdout) старший бит dl установлен, это символьное устройство (если нужна проверка, что это именно stdout, стоит дополнительно проверить 1-й бит), если сброшен, то файл.
s0larian Хочу, чтобы работало в DOS/NTVDM. От Unix'а бы тоже не отказался, да вот незадача - ради него все придется переписывать заново, на что я пойтить не могу. agrischuk diamond Спасибо за информацию, щас попробую воспользоваться
Всем спасибо, работает. Т.к. работаю под DOS-расширителем DOS/32A, то опишу подробнее, что и как делал, мало ли кому понадобится. Код (Text): Verify_StdOut: ; ES должен быть проинициализирован селектором PSP ; Это происходит по умолчанию сразу после старта под управлением DOS/32A ; В этих же условиях DS имеет базу=0 и лимит=4 Гб. movzx ecx, word ptr es:[032h] cmp ecx, 2 jc Vstdout_020 movzx ebx, word ptr es:[034h] movzx eax, word ptr es:[036h] shl eax, 4 add ebx, eax cmp byte ptr [ebx+1], 1 jnz Vstdout_010 mov bx, 1 mov ax, 04400h int 21h jc Vstdout_020 test dl, 080h jnz Vstdout_020 Vstdout_010: ; Вывод перенаправлен в файл ;... Vstdout_020:
isatty() из C-Runtime используй, будет везде работать. Файл телетайпом не является, а консоль является.
Раз пошла такая пьянка, тогда такое дело. После запуска своего exe-шника я рисую пару сообщений туда же, куда только что это делал DOS/NTVDM, затем меняю видеорежим на свой, специфический, где буквочки вывожу уже вручную, минуя функции DOS/BIOS. Однако и то, что я вывожу в спец. видеорежиме, хотелось бы передавать дополнительно в консоль, в файл и т.д. - туда, куда пользователь указал (мало ли там другой монитор или COMx), лишь бы ресурсы консоли и моего видеорежима не пересекались. После инициализации своего спец. видеорежима я точно знаю границы его ресурсов, проще говоря это какая видяха и какие адреса памяти занимает ее буфер. Возможно ли выяснить то же самое для устройства, с которым ассоциирован в данный момент stdout?