eval { local $SIG{ALRM} = sub { die "alarm timeout" }; alarm $timeout; eval { # operation you're waiting on which might die() }; alarm 0; # cancel the alarm die $@ if $@; }; alarm 0; # race help die $@ if $@ && $@ !~ /alarm timeout/; if ($@) { # Whatever you want on an alarm timeout } #### 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 }