我有2种格式的示例程序perl& embperl
perl版本作为CGI工作,但embperl版本不起作用。
任何有关解决方案的建议或指示都将受到赞赏
OS:Linux版本2.6.35.6-48.fc14.i686.PAE(...)(gcc版本4.5.1 20100924(Red Hat 4.5.1-4)(GCC))#1 SMP Fri Oct 22 15 :27:53 UTC 2010
注意:我最初将这个问题发布到perlmonks [x]和embperl邮件列表[x],但没有得到解决方案。
perl工作脚本
#!/usr/bin/perl
use warnings;
use strict;
use IPC::Open3;
print "Content-type: text/plain\n\n";
my $cmd = 'ls';
my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd);
close(HIS_IN); # give end of file to kid, or feed him
my @outlines = <HIS_OUT>; # read till EOF
my @errlines = <HIS_ERR>; # XXX: block potential if massive
print "STDOUT: ", @outlines, "\n";
print "STDERR: ", @errlines, "\n";
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
print "child_exit_status: $child_exit_status\n";
embperl非工作脚本
[-
use warnings;
use strict;
use IPC::Open3;
my $cmd = 'ls';
my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd);
close(HIS_IN); # give end of file to kid, or feed him
my @outlines = <HIS_OUT>; # read till EOF
my @errlines = <HIS_ERR>; # XXX: block potential if massive
print OUT "STDOUT: ", @outlines, "\n";
print OUT "STDERR: ", @errlines, "\n";
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
print OUT "child_exit_status: $child_exit_status\n";
-]
以下是我收到的输出
STDERR: ls: write error: Bad file descriptor
child_exit_status: 2
答案 0 :(得分:1)
open3
重定向与STDOUT关联的文件描述符,除了它是fd 1
(你exec
将考虑STDOUT的程序)。但它不是1
。它甚至没有与之关联的文件描述符!我认为这是open3
中的错误。我想你可以解决以下问题:
local *STDOUT;
open(STDOUT, '>&=', 1) or die $!;
...open3...
答案 1 :(得分:0)
非常感谢ikegami !!!!
这是有效的embperl代码。附: STDIN也存在类似的问题。我还不知道解决方案,但我认为它是相似的。
[-
use warnings;
use strict;
use IPC::Open3;
use POSIX;
$http_headers_out{'Content-Type'} = "text/plain";
my $cmd = 'ls';
open(my $fh, '>', '/dev/null') or die $!;
dup2(fileno($fh), 1) or die $! if fileno($fh) != 1;
local *STDOUT;
open(STDOUT, '>&=', 1) or die $!;
my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $cmd);
close(HIS_IN); # give end of file to kid, or feed him
my @outlines = <HIS_OUT>; # read till EOF
my @errlines = <HIS_ERR>; # XXX: block potential if massive
print OUT "STDOUT: ", @outlines, "\n";
print OUT "STDERR: ", @errlines, "\n";
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
print OUT "child_exit_status: $child_exit_status\n";
-]