Segnale (informatica)

Da Wikipedia, l'enciclopedia libera.

In informatica, un segnale è una notifica asincrona trasmessa 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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

  1. ^ a b c Single UNIX Specification
  2. ^ a b c d e f g h X/Open System Interfaces Extension

Collegamenti esterni[modifica | modifica sorgente]

  • (EN) Baris Simsek, Signals (PDF), 2005. URL consultato il 02-06-2008. – UNIX ed i segnali POSIX affidabili
Informatica Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica