加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 简单的open3示例不起作用

发布时间:2020-12-15 21:45:29 所属栏目:大数据 来源:网络整理
导读:我正在尝试制作一个主perl脚本,调用子perl脚本并通过管道进行交互. 我为master写了这段代码: #!/usr/bin/env perluse strict;use warnings;use IPC::Open3;my @children;for my $i ( 0 .. 4 ) { print "Master: " . $i . ",I summon youn"; $children[$i]
我正在尝试制作一个主perl脚本,调用子perl脚本并通过管道进行交互.

我为master写了这段代码:

#!/usr/bin/env perl

use strict;
use warnings;

use IPC::Open3;

my @children;

for my $i ( 0 .. 4 ) {
    print "Master: " . $i . ",I summon youn";

    $children[$i] = {};

    $children[$i]->{'pid'} = open3( my $CH_IN,my $CH_OUT,my $CH_ERR,'perl child.pl -i ' . $i );

    $children[$i]->{'_STDIN'}  = $CH_IN;
    $children[$i]->{'_STDOUT'} = $CH_OUT;
    $children[$i]->{'_STDERR'} = $CH_ERR;

    my $line = readline $children[$i]->{'_STDOUT'};
    print $line ;

}

print "Master: Go fetch me the sacred crownn";

for my $i ( 0 .. 4 ) {
    $children[$i]->{'_STDIN'}->write("fetch the sacred crownn");
    my $line = readline $children[$i]->{'_STDIN'};
    print $line ;
}

print "Master: Thanks. Now die!!!n";

for my $i ( 0 .. 4 ) {
    $children[$i]->{'_STDIN'}->write("die !!n");
    my $line = readline $children[$i]->{'_STDIN'};
    print $line ;
}

而这一个给孩子:

#!/usr/bin/env perl

use Getopt::Long ;

my $cmdline_id ;

GetOptions ('i=s' => $cmdline_id) ;

my $id = $cmdline_id ;

exit 1 if !defined $id ;

print "I am $id,and I am awakenn" ;

while(<STDIN>) {
    print STDOUT $id . ': Master ask me to ' . $_ ;

    if ($_ =~ /exit/oi) {
        exit 0 ;
    }
}

但是当我启动大师时,他只是在阅读孩子的回答时挂了.

关于我做错了什么,为什么?

解决方法

你是 suffering from buffering.

在子进程开头附近说$| = 1允许子进程打印而不等待输出缓冲区填满.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读