簡體   English   中英

IPC :: Open3的用法有什么問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM