|
|
|
La libreria di riferimento di Python |
|
|
|
Questo modulo fornisce meccanismi atti ad usare gestori di segnali in
Python. Alcune regole generali per lavorare con i segnali e i loro
gestori:
- Un gestore per un segnale particolare, una volta impostato, rimane
installato fino a che non venga esplicitamente resettato (Python emula
lo stile delle interfacce BSD indipendentemente dall'implementazione
sottostante), con l'eccezione per il gestore di SIGCHLD,
che segue l'implementazione sottostante.
- Non c'è modo per ``bloccare'' segnali temporaneamente da sezioni
critiche (visto che non è supportato da tutti gli Unix).
- Benché i gestori dei segnali di Python vengano chiamati in modo
asincrono finché l'utente ne è interessato, essi possono trovarsi solo
fra istruzioni ``atomiche'' dell'interprete Python. Ciò significa che
i segnali arrivando durante lunghi calcoli implementati puramente in C
(come corrispondenze di espressioni regolari su grandi parti di testo)
possono essere ritardati per un lasso di tempo arbitrario.
- Quando un segnale arriva durante un'operazione di I/O, è possibile che
l'operazione di I/O sollevi un'eccezione dopo il ritorno del gestore
del segnale. Questo dipende dalla semantica dell'implementazione del
sistema Unix sottostante in riferimento alle chiamate di sistema
interrotte.
- Visto che i gestori di segnali C ritornano sempre, ha poco senso
catturare errori sincroni come SIGFPE o
SIGSEGV.
- Python installa un piccolo numero di gestori di segnali di
norma: SIGPIPE è ignorato (perciò errori di
scrittura su pipe e socket possono essere riportati come normali
eccezioni Python) mentre SIGINT viene tradotto in
un'eccezione KeyboardInterrupt. Tutte quante possono
essere sovrascritte.
- Alcune attenzioni devono essere prese se sia segnali che thread
vengono utilizzati dallo stesso programma. La cosa fondamentale da
ricordare nell'usare segnali e thread simultaneamente è: effettuare
sempre operazioni di signal() nel thread principale di
esecuzione. Qualunque thread può eseguire un alarm(),
getsignal(), o pause(); solo il thread principale
può impostare nuovi gestori di segnale, e il thread principale sarà
l'unico a ricevere segnali (questo viene forzato dal modulo Python
signal, anche se l'implementazione dei thread sottostante
supporta l'invio di segnali ai singoli thread). Ciò significa che i
segnali non possono essere usati come un mezzo di comunicazione
inter-thread. Usare al contrario i lock.
Le variabili definite nel modulo signal sono:
- SIG_DFL
-
Questa è una delle due opzioni standard di gestione dei segnali;
effettuerà semplicemente la funzione predefinita per il segnale. Per
esempio, su molti sistemi l'azione predefinita per
SIGQUIT è fare un core dump ed uscire, mentre l'azione
predefinita per SIGCLD è semplicemente ignorarlo.
- SIG_IGN
-
Questo è un altro gestore di segnale standard, che semplicemente
ignorerà il segnale dato.
- SIG*
-
Tutti i numeri di segnale sono definiti simbolicamente. Per esempio,
il segnale di hangup è definito come signal.SIGHUP; i
nomi di variabile sono identici ai nomi usati nei programmi C, come
li si trova in
<signal.h>
. La pagina del manuale Unix per
`signal()' elenca i segnali esistenti (su alcuni sistemi
si trova in signal(2), su altri l'elenco si trova in
signal(7)). Attenzione al fatto che non tutti i sistemi
definiscono lo stesso insieme di nomi di segnali; solo questi nomi
definiti dal sistema sono definiti in questo modulo.
- NSIG
-
Uno in più del più alto numero di segnale.
Il modulo signal definisce le seguenti funzioni:
-
Se time è diverso da zero, questa funzione richiede che un
segnale SIGALRM sia trasmesso al processo in time
secondi. Ogni precedente allarme schedulato viene cancellato (solo
un'allarme può essere schedulato in ogni momento). Il valore
restituito è il numero di secondi rimanenti prima di ogni precedente
allarme impostato che deve essere trasmesso. Se time è zero,
nessun allarme è attualmente schedulato ed ogni allarme schedulato è
cancellato. Il valore restituito è il numero di secondi rimanente
prima di un precedente allarme schedulato. (Leggere la pagina di
manuale Unix alarm(2).)
Disponibilità: Unix.
-
Restituisce il gestore di segnale corrente per il segnale
signalnum. Il valore restituito può essere un oggetto Python
chiamabile, o uno dei valori speciali signal.SIG_IGN,
signal.SIG_DFL o None. Qui,
signal.SIG_IGN significa che il signale è stato in
precedenza ignorato, signal.SIG_DFL significa che era in
uso la maniera predefinita per gestire il segnale, e
None
significa che il gestore di segnale precedente non è stato
installato da Python.
-
Impone al processo di dormire fino a che un segnale venga ricevuto;
il gestore appropriato verrà quindi chiamato. Non ritorna nulla. Non
disponibile su Windows. (leggere la pagina di manuale Unix
signal(2).)
signal( |
signalnum, handler) |
-
Imposta la gestione per il segnale signalnum alla funzione
handler. handler può essere un oggetto Python chiamabile
che prende due argomenti (vedere sotto), o uno dei valori speciali
signal.SIG_IGN o signal.SIG_DFL. Sarà
restituito il precedente gestore di segnale. (leggere sopra la
descrizione getsignal()). (Leggere la pagina di manuale
Unix signal(2).)
Quando i thread sono abilitati, questa funzione può essere chiamata
unicamente dal thread principale; chiamandola da altri thread verrà
sollevata un'eccezione ValueError.
L'handler viene chiamato con due argomenti: il numero di
segnale e lo stack frame corrente (None
od un oggetto frame;
leggere il manuale di riferimento per una descrizione degli oggetti
frame).
|
|
|
La libreria di riferimento di Python |
|
|
|
Release 2.3.4, documentation updated on 21. maggio 2005.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.