Трубный поток Вопрос - PullRequest
       24

Трубный поток Вопрос

0 голосов
/ 04 апреля 2011

Я пытаюсь выполнить программу, которую я создал в popen, и затем собрать вывод.Программа, которую я выполняю, занимает 30 секунд (есть 30 снов (1) с), и через каждую секунду она отправляет куски вывода.Что меня озадачивает, так это то, что когда я звоню pipe = popen("test -flag", "r"), он немедленно завершается, и канал потока FILE пуст.Являются ли мои предположения о том, что программа остановится и подождет, пока тест завершится, прежде чем продолжить, или она инициирует порядок сбора выходных данных и немедленно продолжит работу?Если это последнее, есть ли способ приостановить программу, пока канал не получит все выходные данные, прежде чем продолжить?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Предполагается, что вызов popen() будет относительно быстрым, поэтому ваша программа может продолжить чтение результатов программы. Конечно, popen() сам не ожидает завершения вызванной программы. Как только popen() вернется, ваша программа сможет читать из потока файлов; он будет зависать до тех пор, пока не поступит входной сигнал или пока другой процесс не закроет канал (например, завершится), после чего он получит указание EOF. Затем вы можете pclose() поток, который вы читали.

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

1 голос
/ 04 апреля 2011

Чтение pipe до тех пор, пока EOF не будет возвращено.

...