2016-05-25 9 views
0

Я попытался написать тестовое приложение для захвата текста из stdout третьего консольного приложения.Как захватить stdout из консольного приложения, чей жизненный цикл очень длинный для CreatePipe?

Я изучил многие статьи, чтобы использовать API CreatePipe, и INDEED получил текст ПОСЛЕ того, как консольное приложение завершено.

Я попытался заставить консольное приложение продолжать печатать что-то более 60 секунд, а функция ReadFile не вернулась в течение этих 60 секунд.

Для этой же цели я попробовал popen и fread, и все прошло отлично, за исключением черного окна консоли, созданного popen.

Хотя ReadFileEx и что-то о перекрывающемся вводе-выводе, похоже, в состоянии решить эту проблему, но на самом деле это не так.

Поскольку ReadFileEx требовал создания дескриптора файла для поддержки перекрытия, и это всегда невозможно, потому что дескриптор файла создается третьим консольным приложением. Он не будет контролироваться, если мы сами не разработаем консольное приложение.

Итак, есть ли способ захватить stdout из третьего консольного приложения, чей жизненный цикл очень длинный CreatePipe?

Заранее благодарен!

ответ

0

я, наконец понял, что проблема является третьим консольное приложение «MAC.EXE» не вызывает «fflush» после каждого выхода прогресса ....

Я вручную добавить операцию fflush в исходном коде mac.exe, и проблема решена.

Итак, новый вопрос: Если дочерний процесс никогда не вызывает fflush и редко печатает во время работы, как правильно прочитать содержимое?

+0

Я попытался заставить stdout сбросить флажок и использовать FlushFileBuffers в клиентском приложении, но он терпит неудачу, и GetLastError() возвращает 6 (Invalid handle). Мне так грустно, что созданная мной рукопись может быть написана третьей заявкой и отвергнуть от себя ... – user3849428