从popen()中抑制输出

4
有没有方法可以抑制popen()的输出,而不失去Wait()的功能。 测试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);
Test 2的问题在于pclose()没有等待管道处理完成。我不想每次进行管道操作时都看到大量的FFMPEG输出。

抱歉,我没有在代码中发现问题。您能否发布实际输出、描述所需输出等内容?我们程序员也需要输入和输出管道 :) - salezica
2
ffmpeg 是否因某些原因正在写入 stderr?你可以尝试使用 ffmpeg ... 2> /dev/null 吗? - cnicutar
@cnicutar 谢谢 2> 解决了这个问题! - user548266
供日后参考:&> 重定向 标准输出标准错误。要仅重定向标准输出,请使用 >1>;要仅重定向标准错误,请使用 2>,如 cnicutar 建议的那样。 - ruakh
"&>" 是非标准的写法,不应该使用。正确的重定向方式是 >/dev/null 2>&1 - R.. GitHub STOP HELPING ICE
2个回答

2
当你想要向子进程发送数据或从子进程读取数据时,应该只使用popen()(这是互斥的;如果你想同时做两件事,就必须自己设置连接)。
如果你不想这样做,请不要使用popen()
正如jim mcnamara准确地解释的那样,在创建管道后将子进程的输出重定向到/dev/null,重定向会关闭程序的管道输入,因此popen()获取零字节以读取,这被视为EOF。然后它返回-没有更多内容可供读取(如果可能还有内容可供读取,则不会收到EOF)。
在这种情况下,请使用system();即使将子进程的输出重定向到/dev/null,它也会等待子进程完成。在其他情况下,可能适合使用更低级别的fork()exec*()例程。

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接