I fear your version does not work in parallel!
I just tested it with this variant:
$g=10;
$|=1;
for ($i=0; $i<$g; $i++) {
pipe ($rh, $wh); # both of these are generated in the loop
if ($pid[$i]=fork()) { # parent process
waitpid($pid[$i], 0); # wait for child
close ($wh);
while (<$rh>) { # gimme the output
if ($_ =~ m/^Error/) { push (@error, $_); }
elsif ($_ =~ m/^Hits/) { push (@hits, $_); }
else { push (@data, $_); } # each is a result from an engine
}
}
else {
close ($rh);
open (STDOUT, ">&$wh");
$|=1;
print "I will wait for ",$i+2," seconds\n";
sleep $i+1;
print "Good morning. I slept about ",$i+2," seconds\n";
exit(0);
}
}
print @data;
Two problems:
- It really doesn't work in parallel
- It doesn't give the output to the parent
It produces this output:
I will wait for 2 seconds
Good morning. I slept about 2 seconds
I will wait for 3 seconds
Good morning. I slept about 3 seconds
I will wait for 4 seconds
Good morning. I slept about 4 seconds
I will wait for 5 seconds
Good morning. I slept about 5 seconds
I will wait for 6 seconds
Good morning. I slept about 6 seconds
I will wait for 7 seconds
Good morning. I slept about 7 seconds
I will wait for 8 seconds
Good morning. I slept about 8 seconds
I will wait for 9 seconds
Good morning. I slept about 9 seconds
I will wait for 10 seconds
Good morning. I slept about 10 seconds
I will wait for 11 seconds
Good morning. I slept about 11 seconds
But the output should be something like this:
I will wait for 2 seconds
I will wait for 3 seconds
I will wait for 4 seconds
I will wait for 5 seconds
I will wait for 6 seconds
I will wait for 7 seconds
I will wait for 8 seconds
I will wait for 9 seconds
I will wait for 10 seconds
I will wait for 11 seconds
Good morning. I slept about 2 seconds
Good morning. I slept about 3 seconds
Good morning. I slept about 4 seconds
Good morning. I slept about 5 seconds
Good morning. I slept about 6 seconds
Good morning. I slept about 7 seconds
Good morning. I slept about 8 seconds
Good morning. I slept about 9 seconds
Good morning. I slept about 10 seconds
Good morning. I slept about 11 seconds
which I produced with a variant of my former version:
#!/usr/local/bin/perl
use warnings;
use strict;
my $children= 10;
my @out;
my $first_child;
$|=1;
my $pid= open($first_child, '-|');
if ($pid) {
# parent
@out= <$first_child>;
}
else {
my(@child, @childpid);
for (my $i=0; $i<$children; ++$i) {
$childpid[$i]= open($child[$i], '|-');
if ($childpid[$i]) {
# do nothing yet
}
else {
print "I will wait for ",$i+2," seconds\n";
sleep $i+1;
print "Good morning. I slept about ",$i+2," seconds\n";
exit;
}
}
foreach (@child) {
close $_;
}
exit;
}
print @out;
|