代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

如何通过管道传输只能写入文件(而不能写入stdout)的程序的输出?

  •  4
  • Ryan C. Thompson  · 技术社区  · 16 年前

    我想写点什么 Perl Audio Converter ,所以我需要能够将每个相关的音频格式解码为wav(pcm),然后将wav编码为每个相关的音频格式。我想通过将解码器的输出直接通过管道传输到编码器的输入端来并行完成这项工作。大多数解码器都可以选择解码到stdout,但并非所有解码器都可以。有些人坚持输出到文件。

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

    这是否不可能,因为程序可能希望在输出中来回搜索?

    顺便说一句,Perl音频转换器总是使用一个中间的wav文件来回避这个问题,这意味着它从不并行地解码和编码,即使对于支持它的格式也是如此。

    附言:是的,我不想只使用Perl音频转换器是有原因的,但这与问题无关。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Employed Russian    16 年前

    在Linux上,您可以 /proc/self/fd/1 作为“文件”输出。
    对于任何不尝试在输出中查找的程序来说,这都应该有效。

    有些程序在输出中执行SEEK(例如,在解码完成后在文件开头写入摘要信息),此搜索将失败,只会出现实际文件以外的任何情况。

    如果程序检查返回值 fseek lseek (应该如此),程序可能会返回一个错误。否则,它可能会成功退出,但会产生错误的输出(例如,开始时的摘要信息不正确,结束时的额外“垃圾”)。

        2
  •  3
  •   outis    16 年前

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

        3
  •  2
  •   nos    16 年前

    制作一个命名管道。

    mkfifo /tmp/mypipe
    

    而不是这样做,例如

    echo foo | wc -c 
    

    你可以把它当作一个文件

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

    (以先开始者为准,将阻塞管道,直到另一端打开) 但你是对的,如果程序确实需要一个实际的文件,例如搜索,这将不会起作用。

        4
  •  1
  •   user215054    16 年前

    创建管道并将输出指定给管道