我正在尝试制作一个主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 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 ; } }
但是当我启动大师时,他只是在阅读孩子的回答时挂了.
关于我做错了什么,为什么?
解决方法
你是
suffering from buffering.
在子进程开头附近说$| = 1允许子进程打印而不等待输出缓冲区填满.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。