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);

测试 2的问题在于pclose()没有等待管道完成处理。我不想每次我必须做一个管道时都有一堆 FFMPEG 输出。

4

2 回答 2

2

你应该只popen()在你想向子进程发送数据或从中读取数据时使用(这是一个异或;如果你想两者都做,你必须自己建立连接)。

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

正如jim mcnamara准确解释的那样,假设您将子节点的输出重定向到/dev/null创建管道之后,重定向会关闭程序的管道输入,因此popen()读取零字节,这算作 EOF。并且它返回 - 它没有更多内容可供阅读(如果可能有更多内容,它就不会收到 EOF)。

在这种情况下,使用system(); 它会等待孩子完成 - 即使孩子的输出被重定向到/dev/null. fork()在其他情况下,使用较低级别的和exec*()例程可能是合适的。

于 2012-02-18T01:51:28.693 回答
1

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

您通过重定向它(dup())有效地关闭了标准输出,实际上它返回 EOF

于 2012-02-18T01:23:26.063 回答