[英]What's wrong with this usage of IPC::Open3?
use IPC::Open3;
local(*A, *B, *C);
my $cmd = \&run;
my @args = ();
my $childpid = open3(*A, *B, *C, $cmd, @args);
print A "stuff\n";
close(A);
my @outlines = <B>;
my @errlines = <C>;
print "STDOUT:\n", @outlines, "\n";
print "STDERR:\n", @errlines, "\n";
close B;
close C;
waitpid($childpid, 0);
if ($?) {
print "That child exited with wait status of $?\n";
}
sub run {
}
報告:
STDERR:
sh: -c: line 0: syntax error near unexpected token `0x67bc50'
sh: -c: line 0: `CODE(0x67bc50)'
為什么?
看起來$cmd
應該是實際的shell命令,而不是perl子例程。 該錯誤消息來自perl,它試圖對shell中的子CODE(0x67bc50)
執行字符串化的引用。
要從子例程獲取返回值作為命令,請使用$cmd->()
。 但是,這可能並沒有達到我認為的預期。
您可以將子程序移到其自己的腳本中。 或者,您可以使用特殊的“ -
”命令進行分叉而不運行exec
。
my $pid = open3(*A, *B, *C, '-');
if (!$pid) {
run();
exit(0);
}
順便說說,
my @outlines = <B>;
my @errlines = <C>;
患有種族狀況。 如果孩子向STDERR打印足夠的墨水以填充管道,則這兩個過程將死鎖。 很難做到這一點,因此我建議您使用更高級別的模塊,例如IPC :: Run。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.