use IO::Handle; my ($readPIPE,$writePIPE, $pid); pipe $readPIPE, $writePIPE; $writePIPE->autoflush(1); $pid = fork; if ( !$pid ) { # child close($writePIPE); nonBlockingRead( $readPIPE ); exit; } else { # parent close($readPIPE); my (n,$s) = (0,0); while (1) { $s = (int(rand( 50 ))); sleep (int(rand( 50 ))); print $writePIPE "Dad: line ",++$n," after $s s\n"; } } sub nonBlockingRead { use IO::Select; my $PIPE = ( shift ); my $SEL = IO::Select->new( $PIPE ); my @LINES = qw ( ini deafault array size ); IO::Handle->new_from_fd(fileno( $PIPE ),"r")->blocking(0); while ( $SEL->exists( $PIPE ) ) { ($sleep,$send) = doWait( $sleep, scalar @LINES ); @LINES = (); foreach my $h ( $SEL->can_read(0) ) { push @LINES, ( <$h> ); } foreach my $l ( @LINES ) { &doSomething( $l ); } } } sub doWait { my $sec = (shift); my $NoL = (shift); #: every whole min $sec = ($NoL>20)?($sec/2):(($NoL< 5)?($sec+1):$sec); my $m = 60 - (time%60); if ( ( $m - $sec/2 ) < $sec ) { sleep ($m-0.2); return ($sec, 1); # ok full Min } else { sleep ($sec); return ($sec, 0); # default } }