I gather from eyepopslikeamosquito's post that a pure-Perl solution that both kills the process on timeout and captures its exit status otherwise is non-trivial.
It is not trivial, but is is not so complex either:
# 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; }
Using AnyEvent it would be even easier.
In reply to Re^2: Need Function for Timing out shell commands
by salva
in thread Need Function for Timing out shell commands
by bae11208
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |