Storia della domanda:
Perl è stato creato come linguaggio per script di sistema, quindi la gestione dei segnali (SIGTERM, SIGINT, SIGHUP) è sempre stata una funzionalità integrata e potente. Questo sistema consente di intercettare eventi esterni (interruzione dell'utente, riavvio del demone, timeout) e di chiudere o modificare il comportamento degli script in modo appropriato.
Problema:
Una gestione errata dei segnali è una causa frequente di chiusure improprie o di blocchi degli script, di perdita di dati in caso di chiusura anomala, di impossibilità di riavviare i processi senza perdita di stato o risorse.
Soluzione:
I segnali vengono gestiti impostando gestori in una hash speciale %SIG. Una buona prassi è quella di mantenere al minimo le azioni all'interno del gestore dei segnali (ad esempio, impostando un flag e chiudendo in modo sicuro nel thread principale). Per un funzionamento corretto nei thread e durante gestioni multiple dei segnali, si utilizzano moduli specializzati (ad esempio, POSIX::sigaction).
Esempio:
my $term = 0; $SIG{TERM} = sub { $term = 1; }; while (1) { last if $term; # lavoro principale } print "Chiusura gracievole ";
Caratteristiche chiave:
È consentito utilizzare print/IO all'interno del gestore dei segnali?
Risposta: Non è raccomandato — si verificherà un funzionamento errato e potrebbe verificarsi la perdita di dati! Lo standard moderno prevede codice minimo (solo impostazione di flag/pulizia di variabili).
Cosa succede se non si ripristina il gestore del segnale dopo il primo attivazione?
Risposta: Il gestore verrà eseguito più volte, se il segnale arriva nuovamente. Se si desidera una reazione solo al primo evento, il gestore deve ripristinare autonomamente $SIG{...} o inviare segnali a se stesso.
La gestione dei segnali è thread-safe in Perl?
Risposta: No! Nei Perl multithread, i gestori dei segnali vengono chiamati solo nel thread principale (nell'interprete principale); all'interno dei thread, i segnali potrebbero essere completamente ignorati o gestiti in modo errato.
Un processo demone, alla ricezione di SIGTERM, chiude immediatamente tutti i descrittori di file e cancella i file temporanei nel gestore — a volte i file non vengono cancellati, i dati vanno persi.
Vantaggi:
Svantaggi:
Il gestore del segnale SIGTERM imposta solo la variabile $exit, dopo di che il ciclo principale chiude delicatamente, chiude i file e solo dopo rilascia le risorse.
Vantaggi:
Svantaggi: