D перенаправить стандартный вывод на функцию

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

Что я пробовал:

  • Создание нового класса потока, но stdio.stdout — это файл, и вы не можете назначить ему поток
  • Создание нового файлового класса в целом, но вы не можете расширить структуру

Нужно ли для этого углубляться в привязки C? Любая помощь высоко ценится.


person weltensturm    schedule 16.11.2012    source источник


Ответы (3)


Типичное решение этой проблемы объясняется во многих местах. Вот старая статья, в которой объясняется, как это сделать в Windows: http://edn.embarcadero.com/article/10387

Точно так же он работает и на любом UNIX.

Короче говоря:

  1. создайте два канала, один для дочернего процесса stdin, а второй для дочернего процесса stdout.
  2. создайте процесс и подключите эти два канала к его стандартному вводу/выводу
  3. теперь из вашего графического интерфейса вы только что прочитали из канала, который атакован, в дочерний процесс stdout, и вы пишете в канал, который атакован, в дочерний процесс stdin.

Второй подход, который проще, заключается в простом использовании функции popen() всякий раз, когда вы запускаете какой-либо дочерний процесс. Эта стандартная функция делает более/менее все вышеперечисленное.

person DejanLekic    schedule 17.11.2012

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

person weltensturm    schedule 17.11.2012
comment
Это будет работать, если дочерний процесс является вашим D-приложением. Если дочернее приложение является вашей собственной работой, вы можете использовать некоторую форму IPC для отправки вывода в свой графический интерфейс. - person DejanLekic; 19.11.2012

Простой, но действительно хакерский способ сделать это - использовать freopen() C для перенаправления stdout во временный файл, а затем прочитать файл для вашей консоли.

Возможно, вы сможете перенаправить его на уровне операционной системы в канал, а затем ваша консоль прослушивает другой конец канала. Это было бы чище, но гораздо больше боли.

В любом случае, я не думаю, что библиотека D сильно поможет - вы захотите использовать какое-то решение библиотеки C.

person Adam D. Ruppe    schedule 16.11.2012