父进程如何和多个子进程通信?

父进程如何和多个子进程通信?

my $sel = new IO::Select();
  my ($fd1, $fd2);
  my @fds;
  while ($child < $max) {
    local($fd1, $fd2);  ### error
    pipe($fd1, $fd2);
    $fd1->autoflush(1);
    $fd2->autoflush(1);
    ....
    fork
    ....
    父进程 push @fds, $fd2;
}

$ perl -c xxx.pl
Can't localize lexical variable $fd1 at xxx.pl line 90.
local 用错了
perldoc -f local
么看明白~ 很少用local


QUOTE:
原帖由 tmp 于 2008-11-28 12:01 发表
么看明白~ 很少用local

那你在这用 local 是想干吗?
保存多个子进程的对应的管道句柄


QUOTE:
原帖由 tmp 于 2008-11-28 12:12 发表
保存多个子进程的对应的管道句柄

在 while 里面用 my ($fd1, fd2); 然后把 while 之前的 my ($fd1, $fd2); 去掉。
额。。。把问题想复杂了, 以为pipe的时候会覆盖原来的fd

试了一下,很好很强大!谢谢!

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

use strict;
use warnings;

use IO::Handle;

my @fds;
for (1..5) {
  my ($fd1, $fd2);
  pipe($fd1, $fd2);
  $fd1->autoflush(1);
  $fd2->autoflush(1);

  my $ret = fork();
  if ($ret < 0) {
    die "fork $!";
  }elsif($ret == 0) {
    my $str;
    close $fd2;
    sleep 5;
    sysread $fd1, $str, 100;
    print "[$$] parent say $str";
    exit(0);
  }else{
    close $fd1;
    push @fds, $fd2;
  }

}

my $n = 0;
for my $fd ( @fds ) {
  $n++;
  print $fd $n, "\n";
}

for (1..5){ wait(); }

$ perl /tmp/pipe.pl
[5508] parent say 2
[5509] parent say 3
[5507] parent say 1
[5510] parent say 4
[5511] parent say 5