Подавить вывод из popen () - PullRequest
4 голосов
/ 18 февраля 2012

Есть ли способ подавить вывод из popen() без потери Ожидания ().

Тест 1:

FILE * stream = NULL;
char buffer [120];

stream = popen ("ffmpeg -y -i test.amr -ar 16000 test.wav -v quiet", "r");

while (fgets (buffer, sizeof(buffer), stream))
{
}

pclose (stream);

Тест2:

FILE * stream = NULL;
char buffer [120];

stream = popen ("ffmpeg -y -i test.amr -ar 16000 test.wav -v quiet &> /dev/null", "r");

while (fgets (buffer, sizeof(buffer), stream))
{
}

pclose (stream);

Проблема с Тест 2 заключается в том, что pclose() не ожидает завершения обработки трубы.Я не хочу получать кучу выходных данных FFMPEG каждый раз, когда мне нужно сделать трубу.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Вы должны использовать popen() только в том случае, если вы хотите отправлять данные или читать данные из дочернего процесса (и это эксклюзивный или; если вы хотите сделать и то, и другое, вы должны установить соединение самостоятельно ).

Если вы не хотите этого делать, не используйте popen().

Как jim mcnamara точно объяснил , учитывая, что вы перенаправили вывод дочернего элемента на /dev/null после создания канала, перенаправление закрывает вход канала в вашу программу popen() получает нулевые байты для чтения, что считается как EOF. И он возвращается - ему больше нечего читать (если бы его было больше, он не получил бы EOF).

В этом контексте используйте system(); он будет ждать завершения дочернего процесса - даже когда выходные данные дочернего объекта перенаправляются на /dev/null. В других контекстах может быть целесообразно использовать подпрограммы fork() и exec*() более низкого уровня.

1 голос
/ 18 февраля 2012

вывод в / dev / null означает, что popen (который вызывает read ()) не блокирует закрытый файловый дескриптор для stdout.Он сразу возвращается.

Вы фактически закрыли стандартный вывод, перенаправив его (dup ()), в действительности он возвращает EOF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...