有没有办法在不丢失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输出。
答案 0 :(得分:2)
当您想要向子进程发送数据或从子进程读取数据时,您应该只使用popen()
(这是一个排他性的;如果您想要同时执行这两项操作,则必须设置自己连接)。
如果您不想这样做,请不要使用popen()
。
准确jim mcnamara为explained,假设您在创建管道后将子项的输出重定向到/dev/null
,重定向会关闭程序的管道输入,因此{{ 1}}获取零字节进行读取,计为EOF。并且它返回 - 没有什么可以阅读(如果它可能有更多,它将不会收到EOF)。
在此上下文中,使用popen()
;它将等待孩子完成 - 即使孩子的输出被重定向到system()
。在其他情况下,可能适合使用较低级别的/dev/null
和fork()
例程。
答案 1 :(得分:1)
输出到/ dev / null意味着popen(调用read())不会阻止stdout的已关闭文件描述符。它立即返回。
你通过重定向(dup())有效地关闭了stdout,实际上它返回了EOF