title: Segnale (informatica)
text: # Segnale (informatica)
  
  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"). |
  | SIGCHLD | Processo figlio terminato o fermato (oppure ripartito). |
  | SIGCONT | Il processo può continuare, se era stato fermato. |
  | SIGFPE | Eccezione in un numero in virgola mobile: "operazione aritmetica erronea" ("erroneous arithmetic operation"). |
  | 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. |
  | 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. |
  | SIGSYS | Chiamata di sistema errata. |
  | SIGTRAP | L'esecuzione del processo ha raggiunto un breakpoint (trap), il debugger può informare di questo lo sviluppatore. |
  | 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 ("virtual timer expired"). |
  | SIGXCPU | Esaurito il tempo di CPU disponibile per il processo. |
  | SIGXFSZ | Superata la dimensione massima consentita per i file per il processo. |
  
  ## 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.
  
  