Sto scrivendo uno script Perl che scriverà alcuni input e invierà quegli input a un programma esterno. C'è un piccolo, ma non zero possibilità che questo programma si bloccherà, e voglio tempo fuori:Come posso sospendere un processo biforcato che potrebbe bloccarsi?
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);
}
Così com'è ora, dopo $ num_secs_to_timeout, program_of_interest persiste. Ho cercato di ucciderlo nella subroutine anonimo per $SIG{ALRM}
come segue:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
ma questo non fa nulla. program_of_interest è ancora persistente. Come faccio a uccidere questo processo?
Penso che "kill 9, - $ PID" dovrebbe essere "kill -9, $ PID". Ho usato invece il sistema ("kill -9 $ PID"). – Boolean
Penso che "kill -9 $ PID" dovrebbe essere "kill -9 $ pid", ma sì, il pid negativo indica di uccidere un gruppo di processi invece di un semplice processo. Dalla documentazione dell'uccisione: "A differenza della shell, se SIGNAL è negativo, uccide i gruppi di processi anziché i processi. (Nel sistema V, un numero di processo negativo ucciderà anche i gruppi di processi, ma non è portatile.)" – simpleuser