我发现a comment暗示了我认为我正在看到的一个问题,IPC::Open3的fork
ed孩子正在运行主程序代码,而不仅仅是{{1}像我期望的那样。
有没有其他人有过从IPC :: Open3中“泄漏”流程的经验?我查看了图书馆的来源,并没有看到任何令人发指的错误。
这是在Solaris 10上运行的Perl 5.8.4(是的,我知道......但无法更新)。
答案 0 :(得分:2)
虽然这已得到修复,但5.8.4中的open3
可能会引发孩子的异常,这意味着父母和孩子都可以从open3
“返回”。
虽然你可以处理它,但它有点复杂。*用更新的Perl替换IPC/Open3.pm
my $parent_pid = $$;
my $pid = eval { open3(...) };
if (!$pid) {
if ($parent_pid == $$) {
# Exception in parent.
die($@);
} else {
# Exception in child (pre-exec).
print STDERR $@;
_exit(255);
}
}
会更容易。
更好的是,如果你不需要像IPC :: Open3那样低级的东西,你可以使用更高级别的模块,例如one(更简单)或IPC::Run3(更强大)。
* - 至少,
{{1}}