如何管道只能写入文件(而不是STDOUT)的程序输出?

时间:2009-11-22 01:57:00

标签: linux pipe

我正在尝试编写类似Perl Audio Converter的内容,因此我需要能够将每个相关的音频格式解码为wav(PCM),然后将wav编码为每种相关的音频格式。我想通过将解码器的输出直接连接到编码器的输入来并行执行此操作。大多数解码器都有一个解码到stdout的选项,但并非所有解码器都能解码。有些人坚持要输出到文件。

所以我的问题是,如何使用stdout将仅输出到指定文件的程序欺骗?另外,补充问题是:我如何欺骗输入文件中需要从stdin读取的程序?

这是不可能的,因为程序可能想要在输出中来回寻找?

顺便提一下,Perl Audio Converter总是使用中间wav文件来回避这个问题,这意味着它永远不会并行解码和编码,即使对于支持它的格式也是如此。

PS:是的,有一个原因我不想只使用Perl Audio Converter,但这与问题无关。

4 个答案:

答案 0 :(得分:3)

在Linux上,您可以将/proc/self/fd/1作为“文件”输出 这应该适用于任何不试图在输出中寻找的程序。

某些程序确实在输出中寻找(例如,在解码完成后在文件的开头写入摘要信息),并且此搜索将失败,而不是真实文件。

如果程序检查fseeklseek的返回值(应该如此),程序可能会返回错误。如果没有,它可能会成功退出,但会产生错误的输出(例如,开头有错误的摘要信息,最后有额外的“垃圾”)。

答案 1 :(得分:3)

某些操作系统(如Unix变体和win32系列)支持named pipes。您可以使用它们而不是stdout / stdin。

答案 2 :(得分:2)

制作命名管道。

mkfifo /tmp/mypipe

而不是做例如

echo foo | wc -c 

您可以将其用作文件

echo foo > /tmp/myfifo &
wc -c /tmp/myfifo

(无论哪个先开始都将阻止,直到管道的另一端打开) 但是你是对的,如果程序确实需要一个实际的文件,例如寻求,这是行不通的。

答案 3 :(得分:1)

创建管道并将输出分配给管道