alarm Ordena mandar una señal SIGALRM al proceso actual después de que
haya pasado el número de segundos especificados. Si no se ha
especificado SEGUNDOS, se usará el valor almacenado en $_. (En
algunas máquinas, desafortunadamente, el tiempo transcurrido puede
ser hasta un segundo más o menos del especificado debido a cómo se
cuentan los segundos, y la planificación de procesos puede
retrasar incluso más la entrega de la señal).
Sólo un temporizador puede estar contando cada vez. Cada llamada
desactiva el temporizador anterior, y se puede indicar un
argumento 0 para cancelar el temporizador anterior sin empezar uno
nuevo. El valor devuelto es la cantidad de tiempo restante del
temporizador anterior.
Para lapsos de tiempo inferiores a un segundo, el módulo
Time::HiRes (en CPAN, y a partir de Perl 5.8 como parte de la
distribución estándar) ofrece "ualarm". Puede también usar la
versión de "select" de cuatro argumentos, dejando los tres
primeros indefinidos, o puede usar la interfaz "syscall" para
acceder a setitimer(2) si su sistema lo soporta. Vea perlfaq8 para
más detalles.
Normalmente, es un error entremezclar llamadas a "alarm" y
"sleep", porque "sleep" se puede, internamente, implementar en su
sistema con "alarm".
Si quiere usar "alarm" para controlar la duración de una llamada
del sistema necesita una pareja "eval"/"die". No puede confiar en
que la alarma que llama a la llamada del sistema falle y
establezca $! a "EINTR" porque Perl activa controladores de señal
para reiniciar llamadas al sistema, en algunos sistemas. Usar
"eval"/"die" siempre funciona, teniendo en cuenta las advertencias
dadas en "Señales" in perlipc.
eval {
local $SIG{ALRM} = sub { die "alarma\n" }; # NB: \n necesario
alarm $timeout;
my $nread = sysread $socket, $bufer, $largo;
alarm 0;
};
if ($@) {
die unless $@ eq "alarma\n"; # propagar errores inesperados
# fin de temporización
}
else {
# no hacer nada
}
Para más información ver perlipc.
Cuestiones de portabilidad: "alarm" in perlport.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4