2010-10-01 4 views
7

Est-il possible en Perl d'installer un seul gestionnaire de signal pour tous les signaux qu'il reçoit? La raison derrière ceci est, je ne suis pas au courant du signal que mon code Perl obtiendra à l'exécution. Une façon que je peux voir est ce point tous les signaux disponibles à mon gestionnaire de signal personnalisé, mais je ne veux pas aller de cette façon. Y a-t-il un moyen facile de faire cela? quelque chose comme:Puis-je définir un seul gestionnaire de signal pour tous les signaux en Perl?

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

Répondre

12

Vous vraiment ne veulent pas le faire. Installez uniquement des gestionnaires de signaux pour les signaux que vous devez gérer différemment de ceux par défaut (ce que nous ne pouvons pas vous aider car vous ne mentionnez pas le type d'application que vous écrivez).

Dans la plupart des cas, vous n'avez pas du tout à écrire des gestionnaires de signaux - les paramètres par défaut sont configurés pour faire exactement ce dont vous avez besoin. Vous devriez lire perldoc perlipcmaintenant afin que vous sachiez quels cas vous avez qui diffèrent de la normalité.

Vous pouvez modifier plus d'un signal à la fois avec le sigtrap pragma: il est utile pour ajouter des gestionnaires pour des signaux normalement non décomprimés, ou pour rendre la gestion des erreurs normales plus stricte.

# 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

Ceci est certainement un exercice utile pour tester/déboguer et apprendre sur la gestion des signaux. Par exemple, vous pouvez enregistrer le signal, désactiver le gestionnaire de signal et relancer le signal (à gérer par défaut). Mais certainement pas une bonne pratique pour le code de production. – mob

3

Du haut de ma tête,

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

Ceci est probablement une mauvaise idée bien. Vous devriez seulement attraper tous les signaux que vous savez que vous pouvez manipuler. Des signaux différents ne doivent pas tous être traités de la même manière. Voulez-vous vraiment que SIGINT soit traité de la même manière que SIGCHILD par exemple? SIGHUP? SIGUSR1?

+0

'$ SIG {key} = & sighandler' est ** pas ** la même chose que' $ SIG {key} = \ & sighandler' – mob

+0

@morbule: Merci. Mon perl-fu est un peu rouillé. – Daenyth

+0

Vous ne pouvez pas compter sur% SIG pour avoir des clés pour tous les signaux disponibles sur le système, donc ce n'est probablement pas une bonne option pour "tous" les signaux. Cela devrait fonctionner correctement si votre objectif est de définir/effacer les gestionnaires de signaux que vous avez installés plus tôt dans votre programme. –

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

Si vous voulez traiter __WARN__ et __DIE__ différemment,

use Config; 
$SIG{$_} = 'sigHandler' for split ' ', $Config{sig_name}; 
Questions connexes