2010-10-01 10 views
7

E 'possibile in Perl installare solo un gestore di segnale per tutti i segnali che riceve? La ragione di questo è, non sono a conoscenza di quale segnale il mio codice Perl otterrà in fase di esecuzione. Un modo in cui posso vedere è quel punto tutti i segnali disponibili al mio gestore di segnale personalizzato, ma non voglio andare in questo modo. C'è un modo semplice per farlo? qualcosa di simile:Posso impostare un singolo gestore di segnale per tutti i segnali in Perl?

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

risposta

12

È davvero non vogliono farlo. Installa solo gestori di segnale per i segnali che devi gestire in modo diverso da quello predefinito (che non possiamo aiutarti, dal momento che non menzioni il tipo di applicazione che stai scrivendo).

Nella maggior parte dei casi normali, non è necessario scrivere gestori del segnale - i valori predefiniti sono impostati per fare esattamente ciò che è necessario. Dovresti leggere perldoc perlipcin questo momento in modo che tu sappia quali casi hai che differiscono dalla normalità.

È possibile modificare più di un segnale alla volta con sigtrap pragma: è utile per aggiungere gestori per segnali normalmente non intrappolati o per rendere più rigorosa la normale gestione degli errori.

# 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

Questo è sicuramente un esercizio utile per test/debug e apprendimento sulla gestione del segnale. Ad esempio, è possibile registrare il segnale, disinserire il gestore del segnale e sollevare nuovamente il segnale (da gestire nel modo predefinito). Ma sicuramente non è una buona pratica per il codice di produzione. – mob

3

Fuori della parte superiore della mia testa,

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

Questa è probabilmente una cattiva idea però. Dovresti solo prendere tutti i segnali che sai che puoi gestire. Segnali diversi non dovrebbero essere gestiti allo stesso modo. Vuoi veramente che SIGINT sia gestito allo stesso modo di SIGCHILD? SIGHUP? SIGUSR1?

+0

'$ SIG {key} = & sighandler' è ** non ** la stessa cosa che' $ SIG {key} = \ & sighandler' – mob

+0

@morbule: Grazie. Il mio perl-fu è un po 'arrugginito. – Daenyth

+0

Non si può fare affidamento su% SIG per avere le chiavi per tutti i segnali disponibili sul sistema, quindi questa probabilmente non è una buona opzione per i segnali "tutti". Dovrebbe funzionare correttamente se il tuo obiettivo è quello di impostare/cancellare i gestori di segnale installati in precedenza nel tuo programma. –

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

Se si vuole trattare __WARN__ e __DIE__ modo diverso,

use Config; 
$SIG{$_} = 'sigHandler' for split ' ', $Config{sig_name}; 
Problemi correlati