sub do_child { ... $SIG{HUP} = sub { $done++; }; while { !$done && $cycle--) { $status{$$} = 'idle'; kill ALRM=>getppid(); my $c; next unless eval { local $SIG{HUP} = sub { $done++; die}; ... } .... } }