#!/usr/bin/perl use strict; use warnings; use IO::Select; my ($rh,$wh); pipe($rh,$wh); $wh->autoflush; if ((my $pid = fork) == 0) { # child here close $rh; sleep 2; print $wh "child here\n"; sleep 4; print $wh "child again\n"; close $wh; exit; } else { # parent here close $wh; my $s = IO::Select->new(); $s->add($rh); $SIG{ALRM} = sub { if ($s->can_read(0) and ! eof($rh) ) { my $line = <$rh>; print "child sent: $line"; } alarm 1; }; alarm 1; for(;;) { # body of your parent code print "waiting...\n"; sleep; print "again "; last if eof $rh; } print "child is done\n"; }