Esto está respondido en una de las preguntas de perlfaq8, que dirige la cuestión hacia la sección
Signals del documento
perlipc, pero recomienda el uso del módulo
Sys::AlarmCall.
Del manual de
DBI:
Los dos usos más comunes de las señales, en relación a DBI, son para cancelar las operaciones cuando el usuario pulse Ctrl-C (Interrupción), y para implementar un
timeout usando "alarm()" y $SIG{ALRM}.
[...]
La forma tradicional de implementar un
timeout es darle a $SIG{ALRM} una referencia a algún código que se ejecute cuando llegue una señal ALRM, y luego llamar a alarm($segundos) para que se genere una futura señal ALRM en el número indicado de segundos. Por ejemplo:
Using perl Syntax Highlighting
eval {
local $SIG{ALRM} = sub { die "TIMEOUT\n" }; # "\n" es requerido
eval {
alarm($segundos);
# ... código a ejecutar que sospechamos que puede alargarse en el tiempo...
};
# el eval exterior captura la alarma que podría dispararse justo antes de este alarm(0)
alarm(0); # cancela la alarma (si el código se ejecutó a su tiempo)
die "$@" if $@; # si hubo algún error, lanzamos un die() para que sea capturado por eval exterior
};
if ( $@ eq "TIMEOUT\n" ) {
...;
} # si el mensaje de error es el que pusimos arriba, es que se pasó de tiempo
elsif ($@) {...} # ¡Ops! Ocurrió otra cosa
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
El manual sigue con una explicación de por qué se usan dos eval anidados. Luego pone otro ejemplo más, pero recomiendo el uso del módulo
Sys::SigAction.
También existe el módulo
Time::Out, con una sintaxis mucho más sencilla.
De todos los módulos indicados, el que tiene el manual más completo, y una versión publicada más moderna, es Sys::SigAction.