eval { local $SIG{ALRM} = sub { die "alarm timeout" }; local $SIG{__DIE__} = sub { alarm 0; die @_ }; alarm $timeout; # operation you're waiting on which might die() # in the grandparent post, this was # $line=<$child> alarm 0; # cancel the alarm }; die $@ if $@ && $@ !~ /alarm timeout/; if ($@) { # Whatever you want on an alarm timeout }