in reply to Re^2: Setting an alarm
in thread Setting an alarm
The $SIG{CHLD} + sleep approach you took (instead of wait/waitpid) is interesting, since it saves you from using alarm. While an alarm would interrupt wait/waitpid, why use signals when they're not needed.
use POSIX qw( _exit ); if (!stat($png)) { my $child_code; local $SIG{CHLD} = sub { wait(); # Reap child $child_code = $?; }; defined( my $pid = fork() ) or die("Can't fork: $!\n"); if (!$pid) { # Child if (eval { create_thumbnail($pdf,$png); 1 }) { _exit(0); } else { # Especially deadly version of die() print STDERR $@; _exit($! || $?>>8 || 255); } } print "Waiting on $pid...\n"; sleep($timeout); # Interrupted by SIGCHLD since we have a handler if (defined($child_code)) { die("Child failure\n") if $child_code; } else { $SIG{CHLD} = 'DEFAULT'; kill KILL => $pid; wait(); # Reap child die("Child timeout\n"); } }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Setting an alarm
by Rodster001 (Pilgrim) on Mar 10, 2010 at 17:59 UTC | |
by ikegami (Patriarch) on Mar 10, 2010 at 18:37 UTC |