Простой пример open3 не работает

Я пытаюсь создать сценарий Master perl, вызывающий сценарий perl для детей и взаимодействующий через канал.

Я написал этот код для мастера:

#!/usr/bin/env perl

use strict;
use warnings;

use IPC::Open3;

my @children;

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

    $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 crown\n";

for my $i ( 0.. 4 ) {
    $children[$i]->{'_STDIN'}->write("fetch the sacred crown\n");
    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 awaken\n" ;

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

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

Но когда запускаю Мастер он просто завис при чтении ответа от ребенка.

Любая идея о том, что я сделал неправильно, и почему?

5
задан Mayeu 29 June 2012 в 16:13
поделиться