On Feb 9, 4:46 pm, Matteo <fakem...@fakehost.fakedomain> wrote:
> [...]
> Invece il programma B parte ma non chiama la sub alarm.
È POSIX che vuole così, né Perl né tanto meno Time::HiRes (difatti
avresti la stessa situazione anche con una semplice alarm()).
La situazione (un po' intricata, ma neanche tanto) è la seguente.
All'interno del signal handler, il recapito del segnale stesso (nel
tuo caso SIGALRM) viene bloccato, mediante la cosiddetta /process
signal mask/, la quale signal mask (del processo padre) viene
ereditata da un eventuale processo forkato.
Ora la system di Perl esegue come prima cosa una fork, e siccome tu
esegui la system dentro un signal handler, dove come detto la signal
mask blocca il segnale SIGALRM, tale signal mask viene passata pari
pari al processo invocato via system, che pertanto a sua volta
ignorerà ogni SIGALRM che gli dovesse eventualmente pervenire.
Per far funzionare le cose come vuoi tu, dovresti resettare la signal
mask nel processo figlio, cosa che puoi fare semplicemente aggiungendo
queste due righe all'inizio di progB.pl:
use POSIX qw(:signal_h);
sigprocmask( SIG_UNBLOCK, POSIX::SigSet->new(SIGALRM) );
Ciao
-Emanuele