2010-10-01 27 views
7

¿Es posible en Perl instalar solo un manejador de señal para todas las señales que recibe? La razón detrás de esto es que no estoy al tanto de qué señal recibirá mi código Perl en tiempo de ejecución. Una forma en que puedo ver es señalar todas las señales disponibles para mi manejador de señal personalizado, pero no quiero ir por este camino. ¿Hay alguna manera fácil de hacer esto? algo así como:¿Puedo establecer un solo manejador de señal para todas las señales en Perl?

$SIG{'ALL'} = 'sigHandler'; 

Respuesta

12

Usted realmente no quiere hacer esto. Solo instale manejadores de señal para las señales que necesita manejar de forma diferente a la predeterminada (que no podemos ayudarlo, ya que no menciona qué tipo de aplicación está escribiendo).

En la mayoría de los casos normales, no tiene que escribir manejadores de señal: los valores predeterminados están configurados para hacer exactamente lo que necesita. Debería leer perldoc perlipcen este momento, por lo que conoce los casos que tiene que difieren de la normalidad.

Puede modificar más de una señal a la vez con el sigtrap pragma: es útil para agregar controladores para señales normalmente no capturadas, o para hacer un manejo de errores normal más estricto.

# install a trivial handler for all signals, as a learning tool 
use sigtrap 'handler' => \&my_handler, 'signal'; 
sub my_handler 
{ 
    print "Caught signal $_[0]!\n"; 
} 
+6

Este es definitivamente un ejercicio útil para probar/depurar y aprender sobre el manejo de señales. Por ejemplo, puede registrar la señal, desarmar el controlador de señal y volver a generar la señal (para que se maneje de la manera predeterminada). Pero definitivamente no es una mejor práctica para el código de producción. – mob

3

De la parte superior de mi cabeza,

foreach my $key (keys %SIG) { 
    $SIG{$key} = \&sighandler 
} 

Esta es probablemente una mala idea sin embargo. Solo debería captar las señales que sabe que puede manejar. Las diferentes señales no deberían manejarse todas de la misma manera. ¿Realmente desea que SIGINT se maneje de la misma manera que SIGCHILD, por ejemplo? SIGHUP? SIGUSR1?

+0

'$ SIG {clave} = & sighandler' es ** ** No es lo mismo que' $ SIG {clave} = \ & sighandler' – mob

+0

@morbule: Gracias. Mi perl-fu está un poco oxidado. – Daenyth

+0

No puede confiar en que% SIG tenga claves para todas las señales disponibles en el sistema, por lo que probablemente no sea una buena opción para "todas" las señales. Debería funcionar bien si su objetivo es establecer/borrar manejadores de señal que instaló anteriormente en su programa. –

5
 
$SIG{$_} = 'sigHandler' for keys %SIG; 

Si usted quiere tratar __WARN__ y __DIE__ diferente,

use Config; 
$SIG{$_} = 'sigHandler' for split ' ', $Config{sig_name}; 
Cuestiones relacionadas