From 238734efd7a190c653631ac2db4624c6761df8ec Mon Sep 17 00:00:00 2001 From: Wolfram Schneider Date: Fri, 31 Oct 2014 08:46:07 +0000 Subject: [PATCH] configure signal handlers to kill process group at timeout --- test/bin/bomb.pl | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/test/bin/bomb.pl b/test/bin/bomb.pl index 0f434d0..b91f049 100755 --- a/test/bin/bomb.pl +++ b/test/bin/bomb.pl @@ -42,26 +42,31 @@ die usage if !@system; # be ignored eval { require BSD::Resource; - BSD::Resource::setrlimit("RLIMIT_CPU", $timeout, 2*$timeout) or die "Cannot set CPU limit: $!\n"; + BSD::Resource::setrlimit( "RLIMIT_CPU", $timeout, 2 * $timeout ) + or die "Cannot set CPU limit: $!\n"; }; if ($@) { - warn "WARNING: things would go more nicely with the BSD::Resource package\n"; + warn + "WARNING: things would go more nicely with the BSD::Resource package\n"; } - # -# use fork/exec instead system() +# configure signal handlers # -$pid = fork(); -die "fork() failed: $!" unless defined $pid; +$SIG{ALRM} = sub { + my $pgid = getpgrp(); -# child -if ($pid) { - alarm($timeout); - exec(@system) or die "exec @system: $!\n"; -} + # kill process group + kill "INT", -$pgid; +}; -# parent -else { } +# don't kill ourself +$SIG{INT} = "IGNORE"; + +alarm($timeout); + +system(@system) == 0 + or die "system @system failed: $?"; 1; + -- 1.7.10.4