# untested! use POSIX qw(WNOHANG _exit); use Errno qw(ECHILD); local $SIG{CHLD} = sub {}; # this do-nothing sub ends the # select below on SIGCHLD my $pid = fork; if (!$pid) { defined $pid or die "fork failed: $!"; do { exec @cmd }; # warnings friendly! _exit(1); } my $start = time; while (1) { my $rc = waitpid ($pid, WNOHANG); last if $rc == $pid; last if $rc < 0 and $! == ECHILD; select (undef, undef, undef, 1); kill INT => $pid if time > $start + $timeout; }