2012-06-29 10 views
5

मैं एक मास्टर पर्ल स्क्रिप्ट बच्चों को perl स्क्रिप्ट कॉल करने और एक पाइप के माध्यम से बातचीत करने की कोशिश कर रहा हूं।सरल ओपन 3 उदाहरण काम नहीं कर रहा

#!/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 ; 
    } 
} 

लेकिन जब मैं मास्टर का शुभारंभ करते हुए वह सिर्फ बच्चे से प्रतिक्रिया पढ़ने लटका ।

मैंने जो भी गलत किया, उसके बारे में कोई विचार, और क्यों?

उत्तर

4

आप suffering from buffering हैं।

बच्चे की प्रक्रिया की शुरुआत के करीब $|=1 कहें ताकि बच्चे को आउटपुट बफर भरने के इंतजार किए बिना प्रिंट करने की अनुमति मिल सके।

0

एक साइड नोट के रूप में, तीसरे तर्क (जैसा कि आप हैं) के लिए अपरिचित पास करना आप जो चाहते हैं वह नहीं करता है। आपको सिंबल के gensym का उपयोग करके चर शुरू करने की आवश्यकता है।

use Symbol qw(gensym); 

my %child; 
$child{pid} = open3(
    $child{'_STDIN' } = gensym, 
    $child{'_STDOUT'} = gensym, 
    $child{'_STDERR'} = gensym, 
    'perl', 'child.pl', '-i' => $i 
); 

$children[$i] = \%child;