Как узнать, куда направлен вывод stdout в данный момент (DOS/NTVDM)

Тема в разделе "WASM.ASSEMBLER", создана пользователем Ykidia, 10 мар 2009.

  1. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Здравствуйте! Собственно, проблема в том, чтобы узнать, перенаправлен ли стандартный вывод в файл или нет. Смысл - если пользователь написал в командной строке "myexe.exe >debug.log", значит надо делать вывод дополнительной инфы. Если же вывод идет на экран, тогда работаем как обычно.
    Сканировать ради этого командную строку желания нет, ибо думается, что получить сведения о перенаправлении stdout можно как-то проще и надежнее. Интересует правильная последовательность системных вызовов DOS (int 21h) и/или чтение каких-либо стандартных переменных DOS.
    Повторюсь: нужно не перенаправлять stdout (об этом полно статей в тырнете), а узнать, куда он в данный момент направлен - на экран или в файл.
    Спасибо.
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Ykidia, неправильная, в корне, идея. Весь смысл потоков ввода/вывода в том что б делать перенаправления:

    ./app -a -b -c | grep "/my/log" | less

    Добавь ключик и не парь моск.
     
  3. agrischuk

    agrischuk New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2009
    Сообщения:
    47
    Смотри чему равен stdout handle, если 1 - то консоль. Вот пример работы:
    http://bookz.ru/authors/avtor-neizvesten-3/msdosrukvorz/page-18-msdosrukvorz.html
     
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Эта, а на windows/unix ты хочешь что б работало?
     
  5. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    http://www.ctyme.com/intr/rb-2820.htm
    Если после int 21h/ax=4400h/bx=1 (хендл stdout) старший бит dl установлен, это символьное устройство (если нужна проверка, что это именно stdout, стоит дополнительно проверить 1-й бит), если сброшен, то файл.
     
  6. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    s0larian
    Хочу, чтобы работало в DOS/NTVDM. От Unix'а бы тоже не отказался, да вот незадача - ради него все придется переписывать заново, на что я пойтить не могу.
    agrischuk
    diamond
    Спасибо за информацию, щас попробую воспользоваться :)
     
  7. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Всем спасибо, работает. Т.к. работаю под DOS-расширителем DOS/32A, то опишу подробнее, что и как делал, мало ли кому понадобится.
    Код (Text):
    1. Verify_StdOut:
    2.                 ; ES должен быть проинициализирован селектором PSP
    3.                 ; Это происходит по умолчанию сразу после старта под управлением DOS/32A
    4.                 ; В этих же условиях DS имеет базу=0 и лимит=4 Гб.
    5.                 movzx   ecx, word ptr es:[032h]
    6.                 cmp     ecx, 2
    7.                 jc      Vstdout_020
    8.                 movzx   ebx, word ptr es:[034h]
    9.                 movzx   eax, word ptr es:[036h]
    10.                 shl     eax, 4
    11.                 add     ebx, eax
    12.                 cmp     byte ptr [ebx+1], 1
    13.                 jnz     Vstdout_010
    14.                 mov     bx, 1
    15.                 mov     ax, 04400h
    16.                 int     21h
    17.                 jc      Vstdout_020
    18.                 test    dl, 080h
    19.                 jnz     Vstdout_020
    20. Vstdout_010:
    21.                 ; Вывод перенаправлен в файл
    22.                 ;...
    23. Vstdout_020:
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    isatty() из C-Runtime используй, будет везде работать.
    Файл телетайпом не является, а консоль является.
     
  9. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Раз пошла такая пьянка, тогда такое дело. После запуска своего exe-шника я рисую пару сообщений туда же, куда только что это делал DOS/NTVDM, затем меняю видеорежим на свой, специфический, где буквочки вывожу уже вручную, минуя функции DOS/BIOS. Однако и то, что я вывожу в спец. видеорежиме, хотелось бы передавать дополнительно в консоль, в файл и т.д. - туда, куда пользователь указал (мало ли там другой монитор или COMx), лишь бы ресурсы консоли и моего видеорежима не пересекались. После инициализации своего спец. видеорежима я точно знаю границы его ресурсов, проще говоря это какая видяха и какие адреса памяти занимает ее буфер. Возможно ли выяснить то же самое для устройства, с которым ассоциирован в данный момент stdout?