Perl 从open3中读取句柄和句柄错误
我使用Open3来执行我的python脚本,我想看到handle_out和handle_error的输出,我怎么能看到它呢?它打印Perl 从open3中读取句柄和句柄错误,perl,Perl,我使用Open3来执行我的python脚本,我想看到handle_out和handle_error的输出,我怎么能看到它呢?它打印 sel : IO::Select=ARRAY(0x18e15040) local (*HANDLE_IN, *HANDLE_OUT,*HANDLE_ERR); open3( \*HANDLE_IN, \*HANDLE_OUT, \*HANDLE_ERR, "@args") or die "open3 failed $!\n"; my $sel
sel : IO::Select=ARRAY(0x18e15040)
local (*HANDLE_IN, *HANDLE_OUT,*HANDLE_ERR);
open3( \*HANDLE_IN, \*HANDLE_OUT, \*HANDLE_ERR, "@args") or die "open3 failed $!\n";
my $sel = new IO::Select;
$sel->add(\*HANDLE_OUT,\*HANDLE_ERR);
print "sel : $sel";
谢谢您不需要使用IO::Select。这些只是普通的文件句柄
while (my $line = <HANDLE_OUT>) {
print $line;
}
下面的内容表明,上述建议是错误的,因为它会导致死锁。由于上述建议,以下程序永远不会退出:
perl -MIPC::Open3=open3 -E'
my $pid = open3(
local *TO_CHILD,
local *FROM_CHILD,
local *FROM_CHILD_ERROR,
"perl",
"-E" => q{say STDERR "x"x(64*1024); say "y";},
);
say "Getting STDOUT";
print while <FROM_CHILD>;
say "Getting STDERR";
print while <FROM_CHILD_ERR>;
waitpid($pid, 0);
'
perl-MIPC::Open3=Open3-E'
我的$pid=open3(
本地*至_儿童,
本地*来自_CHILD,
本地*来自子项错误,
“perl”,
“-E”=>q{say STDERR“x”x(64*1024);say“y”;},
);
说“正在做某事”;
边打印边打印;
说“获取标准”;
边打印边打印;
waitpid($pid,0);
'
open3
仍然是一个相当低级的解决方案。它可以为您处理许多事情,但不能帮助您处理进程间通信(ipc)
如果您希望独立地读取子对象的STDOUT和STDERR,或者如果您同时从子对象发送和接收数据,则会遇到死锁
虽然可以使用
select
来避免死锁,但这非常复杂。我不建议你走那条路。我建议您使用(最简单的)或(更多功能)而不是open3
,绕过整个问题。实际上,如果您想避免死锁,您确实需要使用select
(或线程或非阻塞句柄)看到您接受了这个答案,我想您没有看到我的评论或不相信我,因此,我在答案中添加了一个片段,说明了为什么这个答案是错误的。另外,open3
在传递词法句柄时有一些错误。虽然我建议在其他时间使用词汇句柄,但OP应该继续在open3
中使用globals。
perl -MIPC::Open3=open3 -E'
my $pid = open3(
local *TO_CHILD,
local *FROM_CHILD,
local *FROM_CHILD_ERROR,
"perl",
"-E" => q{say STDERR "x"x(64*1024); say "y";},
);
say "Getting STDOUT";
print while <FROM_CHILD>;
say "Getting STDERR";
print while <FROM_CHILD_ERR>;
waitpid($pid, 0);
'