http://qs321.pair.com?node_id=74668

larsen has asked for the wisdom of the Perl Monks concerning the following question:

I need to write an application that forks multiple childs, maintaining for each child a communication channel, so that the childs can send data back to the parent (output and informations about their state).
Reading about interprocess communication, it seemed to me that pipes could solve my problem. Here what I naively wrote :)
#!/usr/bin/perl use strict; use FileHandle; use Data::Dumper; my $childs = { A => { pid => undef, handler => undef, blabla => () }, B => { pid => undef, handler => undef, blabla => () }, C => { pid => undef, handler => undef, blabla => () } }; foreach my $name ( keys %{$childs} ) { $childs->{ $name }->{ handler } = new FileHandle; $childs->{ $name }->{ pid } = $childs->{ $name }->{ handler }->ope +n( "-|" ); if ($childs->{ $name }->{ pid }) { # The child's talking... while(my $line = $childs->{ $name }->{ handler }->getline()) { push @{$childs->{ $name }->{ blabla }}, $line; } } else { # Childs' STDOUTs are read by the parent print "Hi! I'm $name and I'm good!"; exit; } } print Dumper( $childs );
As you can see, I maintain a hash for each child, containing a file handler that is used by the parent to read child's output. But this does not work, because the while-block that read child's output is blocking. This way doesn't seem to be worth further exploring. How could I realize what I've described at the beginning of this node?