如何从HTTP :: Server :: Simple重定向我的STDOUT?

时间:2011-03-24 06:21:55

标签: perl http

我正在使用HTTP :: Server :: Simple :: CGI编写一个简单的Web服务器。在我的处理程序中,我必须运行一个向STDOUT输出内容的进程。我希望STDOUT重定向到客户端而不是控制台。

这是我的处理程序

sub serve_content {
     $| =  undef;
     my $cgi  = shift;
     print $cgi->header('image/png');
     IPC::Run::run ['/usr/bin/myapp', '-o', '/dev/fd/3'], '3>&1', '1>&2', '>', *STDOUT;
 }

这会将应用程序的输出打印到控制台,而不是发出http请求的客户端。如何重定向?

2 个答案:

答案 0 :(得分:0)

重定向顺序很重要。重定向3到1和1到2,efectivelly重定向3到2.尝试:

IPC::Run::run ['/usr/bin/myapp', '-o', '/dev/fd/3'], , '1>&2', '3>&1', '>', *STDOUT;

或者可能是

IPC::Run::run ['/usr/bin/myapp', '-o', '/dev/fd/3'], , '1>&2', '3>', *STDOUT;

答案 1 :(得分:0)

我想知道你是否真的需要IPC :: Run,我不相信它能带给你任何真正的好处。

为什么不用管道打开脚本,从块中读取管道,并将每个块发送到浏览器?类似的东西:

open my $pipe, '/usr/bin/myapp|';
binmode $pipe;
local $/ = \4096;
while(<$pipe>) {
    print;
}

如果图像文件小到足以一次保留在内存中,你也可以使用反引号。

 print `/usr/bin/myapp`;