alarm
Fa in modo che un SIGALARM sia inviato a questo processo dopo che è
trascorso il numero di secondi indicato. Se SECONDI non viene
specificato, viene utilizzato il valore memorizzato in $_. (Su alcune
macchine, sfortunatamente, il tempo trascorso può essere inferiore
o superiore fino a un secondo rispetto al numero specificato
a causa del sistema con cui vengono contati i secondi, e lo scheduling
[programmazione, NdT] dei processi può ulteriormente ritardare
la consegna del segnale).
Può essere in esecuzione un solo timer alla volta. Ciascuna
chiamata disabilita il timer definito in precedenza, ed un argomento
di 0 può essere fornito per cancellare il timer precedente
senza avviarne uno nuovo. Il valore restituito rappresenta
il tempo rimanente sul timer precedente.
Per intervalli di una granularità più fine, inferiore
al secondo, potete utilizzare la versione a quattro argomenti di
select(), fornita da Perl, lasciando i primi tre argomenti non
definiti. In alternativa potreste essere in grado di servirvi
dell'interfaccia syscall per accedere a setitimer(2) se il vostro
sistema supporta ciò. Anche il modulo Time::HiRes (da CPAN, e
parte della distribuzione standard a partire da Perl 5.8) potrebbe
risultare utile.
Solitamente è un errore mischiare chiamate alarm e sleep.
(nel vostro sistema, sleep potrebbe essere essere implementata
internamente con alarm)
Se volete utilizzare alarm per far scadere una chiamata di sistema,
dovrete utilizzare una coppia eval/die. Non potete contare
sul fatto che alarm faccia fallire la chiamata di sistema impostando
$! a EINTR, poiché in alcuni sistemi Perl imposta i gestori
dei segnali in modo che riavviino le chiamate di sistema. La soluzione
che prevede l'uso di eval/die funziona sempre, a meno degli avvertimenti
indicati in perlipc/"Signals" ["Segnali", NdT].
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n richiesto
alarm $timeout;
$nletto = sysread SOCKET, $buffer, $dimensione;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propaga gli errori inattesi
# scaduto
}
else {
# non scaduto
}
Per maggiori informazioni consultate perlipc.