Un segnale, in informatica, è un impulso asincrono trasmesso da un processo ad un altro, ed è uno degli strumenti di comunicazione tra processi. Tipicamente nessun dato viene trasmesso assieme al segnale, contrariamente a quanto accade, in generale, per gli eventi nella programmazione ad eventi.
Nei sistemi operativi Unix, Unix-like ed in genere quelli che seguono le specifiche POSIX, esiste una metodologia uniforme di utilizzare i segnali, come l'utilizzo della chiamata di sistema kill()
per mandare segnali, oppure l'uso di signal()
e sigaction()
per la definizione delle funzioni per la gestione dei segnali. In tali sistemi, oltre che da altri processi, i segnali sono inviati anche direttamente dal kernel per notificare il verificarsi di condizioni anomale (ad es. SIGSEGV, SIGBUS o anche SIGURG)
La Single UNIX Specification specifica i seguenti segnali per <signal.h>
:
Nome |
Significato
|
SIGABRT |
Interruzione anormale (abort) del processo.
|
SIGALRM |
Segnale sollevato da alarm() .
|
SIGBUS |
Errore di bus: "tentato accesso ad una porzione indefinita di memoria" ("access to undefined portion of memory object"[1]).
|
SIGCHLD |
Processo figlio terminato o fermato (oppure ripartito[2]).
|
SIGCONT |
Il processo può continuare, se era stato fermato.
|
SIGFPE |
Eccezione in un numero in virgola mobile: "operazione aritmetica erronea" ("erroneous arithmetic operation"[1]).
|
SIGHUP |
Hangup: generalmente viene sollevato quando un terminale viene chiuso.
|
SIGILL |
Istruzione illegale.
|
SIGINT |
Interruzione del processo.
|
SIGKILL |
Terminazione immediata (kill) del processo. Questo segnale non può essere ignorato ed il processo che lo riceve non può eseguire delle operazioni di chiusura "morbida".
|
SIGPIPE |
Se un processo che dovrebbe leggere da una pipe termina inaspettatamente, questo segnale viene inviato al programma che dovrebbe scrivere sulla pipe in questione.
|
SIGQUIT |
Interruzione del processo.
|
SIGSEGV |
Il programma ha generato un errore di segmentazione.
|
SIGSTOP |
Ferma temporaneamente l'esecuzione del processo: questo segnale non può essere ignorato.
|
SIGTERM |
Terminazione del programma; il comando kill invia questo segnale se non diversamente specificato.
|
SIGTSTP |
Ferma temporaneamente l'esecuzione del processo.
|
SIGTTIN |
Un processo in esecuzione in background tenta di leggere da terminale (in).
|
SIGTTOU |
Un processo in esecuzione in background tenta di scrivere sul terminale (out).
|
SIGUSR1 |
Definito dall'utente.
|
SIGUSR2 |
Definito dall'utente.
|
SIGPOLL |
Si è resa possibile un'operazione di input/output, permette il polling[2].
|
SIGPROF |
Un conto alla rovescia impostato per il processo è terminato: misura il tempo di CPU usato dal processo e dal sistema per eseguire azioni istruite dal processo stesso[2].
|
SIGSYS |
Chiamata di sistema errata[2].
|
SIGTRAP |
L'esecuzione del processo ha raggiunto un breakpoint (trap), il debugger può informare di questo lo sviluppatore[2].
|
SIGURG |
Sono disponibili dei dati urgenti per il processo su un socket.
|
SIGVTALRM |
Un conto alla rovescia impostato per il processo è terminato: misura il tempo "virtuale" consumato dal solo processo[2] ("virtual timer expired"[1]).
|
SIGXCPU |
Esaurito il tempo di CPU disponibile per il processo[2].
|
SIGXFSZ |
Superata la dimensione massima consentita per i file per il processo[2].
|
Condizioni
Le seguenti condizioni possono generare un segnale:
- Quando un utente digita in un terminale delle particolari combinazioni di tasti, viene generato un segnale. Per esempio, quando viene forzata l'interruzione di un processo con CTRL + C (SIGINT in genere).
- Alcune eccezioni hardware possono generare segnali: divisione per zero, accesso non valido alla memoria e così via. I programmatori alle prime armi spesso subiscono le conseguenze del segnale SIGSEGV a causa di puntatori non inizializzati oppure dereferenziati quando puntano a NULL.
- I processi possono inviare segnali a se stessi usando la chiamata di sistema
kill()
, se le autorizzazioni lo permettono.
- Il kernel può generare segnali per informare i processi quando succede qualcosa di particolare. Per esempio, verrebbe sollevato un SIGPIPE se un processo tentasse di scrivere su una pipe chiusa dal processo che dovrebbe leggerla.
I segnali potrebbero, a volte, causare l'interruzione di una chiamata di sistema in corso.
Note
Voci correlate
Collegamenti esterni
- Mario Salerno, SEGNALE, in Enciclopedia Italiana, V Appendice, Istituto dell'Enciclopedia Italiana, 1994.
- Segnale, su Vocabolario Treccani, Istituto dell'Enciclopedia Italiana.
- segnale, su sapere.it, De Agostini.
- (EN) Baris Simsek, Signals (PDF), su enderunix.org, 2005. URL consultato il 02-06-2008. – UNIX ed i segnali POSIX affidabili