+# set CPU limit, in case the alarm handler will
+# be ignored
+eval {
+ require BSD::Resource;
+ 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";
+}
+
+#
+# configure signal handlers
+#
+$SIG{ALRM} = sub {
+ my $pgid = getpgrp();
+
+ warn "Alarm handler got called after $timeout seconds\n";
+ warn "Kill now the process group $pgid\n\n";
+
+ # kill process group
+ kill "INT", -$pgid;
+};
+
+# don't kill ourself
+$SIG{INT} = "IGNORE";
+
+alarm($timeout);