我正在使用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请求的客户端。如何重定向?
答案 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`;