抑制popen()的输出

时间:2012-02-18 01:14:25

标签: c linux ffmpeg popen suppress

有没有办法在不丢失Wait()的情况下抑制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 个答案:

答案 0 :(得分:2)

当您想要向子进程发送数据或从子进程读取数据时,您应该只使用popen()(这是一个排他性的;如果您想要同时执行这两项操作,则必须设置自己连接)。

如果您不想这样做,请不要使用popen()

准确jim mcnamaraexplained,假设您在创建管道后将子项的输出重定向到/dev/null,重定向会关闭程序的管道输入,因此{{ 1}}获取零字节进行读取,计为EOF。并且它返回 - 没有什么可以阅读(如果它可能有更多,它将不会收到EOF)。

在此上下文中,使用popen();它将等待孩子完成 - 即使孩子的输出被重定向到system()。在其他情况下,可能适合使用较低级别的/dev/nullfork()例程。

答案 1 :(得分:1)

输出到/ dev / null意味着popen(调用read())不会阻止stdout的已关闭文件描述符。它立即返回。

你通过重定向(dup())有效地关闭了stdout,实际上它返回了EOF