Можно ли получить вывод программы во время ее работы?

Если у меня есть консольная программа Windows, написанная на С++, можно ли получить стандартный вывод этой программы во время работы программы? А если нет, то как лучше переписать программу? Я знаю, что могу выводить в файлы и постоянно проверять эти файлы на наличие обновлений. Есть ли другой способ? Есть ли способ лучше?


person blindley    schedule 06.11.2009    source источник
comment
Достать куда? В другую программу или файл журнала?   -  person zebrabox    schedule 06.11.2009
comment
А та другая программа тоже написана на С++?   -  person zebrabox    schedule 06.11.2009
comment
Скорее всего. Но лучше всего было бы решение, не зависящее от языка.   -  person blindley    schedule 06.11.2009


Ответы (5)


В Code Project есть несколько интересных статей:

person kgiannakakis    schedule 06.11.2009

Да, если вы запускаете программу самостоятельно:

в CreateProcess вы передаете STARTUPINFO, где можно указать дескрипторы для SDIN, STDOUT и STDERR. . Обратите внимание, что вам необходимо указать все три, как только вы укажете флаг STARTF_USESTDHANDLES.

Кроме того, дескрипторы должны быть наследуемыми (иначе дочерний процесс не сможет получить к ним доступ), поэтому SECURITY_ATTRIBUTES в основном должен выглядеть как минимум так:

SECURITY_ATTRIBUTES secattr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };

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

person peterchen    schedule 06.11.2009

Если это готовый исполняемый файл консоли, вы всегда можете перенаправить его вывод в такой файл:

c:> echo Какой-то текст > файл

or

c:> программа> файл

Если вы имеете в виду это? Поскольку ваш вопрос не совсем ясен.

\\ в другую программу

О, хорошо
Но мой первый ответ тоже к этому привык. Так как есть и другая возможность, например:

с:> программа1 | программа2

он создает «канал» между консольными программами
программа2 получает на него стандартный ввод того, что программа1 выдает на стандартный вывод
Это обычная устаревшая практика Unix в консольных программах.
И таким образом НЕТ необходимости переписывать программы специально поддерживать его.

person user204724    schedule 06.11.2009

Если вас интересует только стандартный вывод программы, popen() сделает это довольно просто:

FILE* program_output = popen("command line to start the other program");
//read from program_output as you would read a "normal" file
//...
pclose(program_output);
person Éric Malenfant    schedule 06.11.2009

Скорее всего, для этого вам потребуется использовать конвейеры, и, поскольку вы используете Windows, вот ссылка на Статья MSDN с примером, который, кажется, делает именно то, что вы хотели.

person Dmitry    schedule 06.11.2009