Я пишу Perl-скрипт, который запишет некоторые входные данные и отправит эти входные данные во внешнюю программу. Существует небольшая, но ненулевая вероятность того, что эта программа зависнет, и я хочу определить время ожидания:
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
В нынешнем виде, после $ num_secs_to_timeout, program_of_interest сохраняется. Я попытался убить его в анонимной подпрограмме для $SIG{ALRM}
следующим образом:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
но это ничего не делает. program_of_interest все еще сохраняется. Как мне убить этот процесс?