簡體   English   中英

IPC :: Open3遇到問題

[英]Trouble with IPC::Open3

我正在使用IPC :: Open3編寫一個簡單的腳本。 該腳本不會向stdout或stderr產生任何輸出,而我希望兩者都輸出。

完整的源代碼:

#!/usr/bin/env perl 

use strict;
use warnings;
use utf8;

use IPC::Open3;

pipe my $input, my $output or die $!;
my $pid =  open3(\*STDIN, $output, \*STDERR, 'dd', 'if=/usr/include/unistd.h') or die $!;

while(<$input>) {
    print $_."\n";
}
waitpid $pid, 0;

我可以肯定我使用的IPC :: Open3錯誤。 不過,我仍然困惑,我應該做的。

pipe 不知道為什么會在那里,我不能說更多。 這很好。

my $reader;
my $pid =  open3(\*STDIN, $reader, \*STDERR, 'dd', 'if=/usr/include/unistd.h') or die $!;

while(<$reader>) {
    print $_."\n";
}
waitpid $pid, 0;

我意識到這可能只是一個例子,但萬一不是……這完全是您正在做的事。 您可以使用反引號來實現。

print `dd if=/usr/include/unistd.h`

IPC :: Open3有點復雜。 有更好的模塊,例如IPC :: RunIPC :: Run3

use strict;
use warnings;

use IPC::Run3;

run3(['perl', '-e', 'warn "Warning!"; print "Normal\n";'],
     \*STDIN, \*STDOUT, \*STDERR
);

您的程序存在以下問題:

  • \\*STDIN (打開的STDIN作為連接到孩子的STDIN的管道)應為<&STDIN (使用父母的STDIN作為孩子的STDIN )。
  • \\*STDERR (將STDERR作為連接到孩子的STDERR的管道打開)應為>&STDERR (將父級的STDERR用作孩子的STDERR )。
  • 您放置在$output的值將被忽略和覆蓋。 幸運的是,它被正確的值覆蓋!
  • 您使用print $_."\\n"; ,但$_已經以換行符結尾。 要么先chomp ,要么不添加換行符。
  • open3不是系統調用,因此不會設置$!
  • open3不會在錯誤時返回false; 它會引發異常。

因此,我們得到如下信息:

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw( say );

use IPC::Open3;

my $pid = open3('<&STDIN', my $output, '>&STDERR',
    'dd', 'if=/usr/include/unistd.h');

while (<$output>) {
    chomp;
    say "<$_>";
}

waitpid($pid, 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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