\signal{SIGILL} &PA& C & Istruzione illecita.\\
\signal{SIGTRAP} &S & C & Trappole per un Trace/breakpoint.\\
\signal{SIGABRT} &PA& C & Segnale di abort da \func{abort}.\\
- \signal{SIGIOT} &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\
+ \signald{SIGIOT} &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\
\signal{SIGBUS} &BS& C & Errore sul bus (bad memory access).\\
\signal{SIGFPE} &AP& C & Errore aritmetico.\\
\signal{SIGKILL} &P & T& Segnale di terminazione forzata.\\
\signal{SIGSYS} &VS& C & \textit{system call} sbagliata.\\
\hline
\signal{SIGSTKFLT}&?& T & Errore sullo stack del coprocessore (inusato).\\
- \signal{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di
+ \signald{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di
\signal{SIGSYS}).\\
\hline
\signal{SIGCLD} &V & I & Sinonimo di \signal{SIGCHLD}.\\
può usare per ricostruire lo stato del programma al momento della
terminazione. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
+\item[\signald{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
derivi da \textit{floating point exception} si applica a tutti gli errori
aritmetici compresa la divisione per zero e l'overflow. Se il gestore
ritorna il comportamento del processo è indefinito, ed ignorare questo
% aritmetiche e richiede che esse siano notificate.
% TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni
-\item[\signal{SIGILL}] Il nome deriva da \textit{illegal instruction},
+\item[\signald{SIGILL}] Il nome deriva da \textit{illegal instruction},
significa che il programma sta cercando di eseguire una istruzione
privilegiata o inesistente, in generale del codice illecito. Poiché il
compilatore del C genera del codice valido si ottiene questo segnale se il
problemi nell'esecuzione di un gestore. Se il gestore ritorna il
comportamento del processo è indefinito.
-\item[\signal{SIGSEGV}] Il nome deriva da \itindex{segment~violation}
- \textit{segment violation}, e significa che il programma sta cercando di
- leggere o scrivere in una zona di memoria protetta al di fuori di quella che
- gli è stata riservata dal sistema. In genere è il meccanismo della
- protezione della memoria che si accorge dell'errore ed il kernel genera il
- segnale. È tipico ottenere questo segnale dereferenziando un puntatore
- nullo o non inizializzato leggendo al di là della fine di un vettore. Se il
- gestore ritorna il comportamento del processo è indefinito.
+\item[\signald{SIGSEGV}] Il nome deriva da \textit{segment violation}, e
+ significa che il programma sta cercando di leggere o scrivere in una zona di
+ memoria protetta al di fuori di quella che gli è stata riservata dal
+ sistema. In genere è il meccanismo della protezione della memoria che si
+ accorge dell'errore ed il kernel genera il segnale. È tipico ottenere
+ questo segnale dereferenziando un puntatore nullo o non inizializzato
+ leggendo al di là della fine di un vettore. Se il gestore ritorna il
+ comportamento del processo è indefinito.
-\item[\signal{SIGBUS}] Il nome deriva da \textit{bus error}. Come
+\item[\signald{SIGBUS}] Il nome deriva da \textit{bus error}. Come
\signal{SIGSEGV} questo è un segnale che viene generato di solito quando si
dereferenzia un puntatore non inizializzato, la differenza è che
\signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
\signal{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso
di un puntatore non allineato.
-\item[\signal{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica
+\item[\signald{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica
che il programma stesso ha rilevato un errore che viene riportato chiamando
la funzione \func{abort}, che genera questo segnale.
-\item[\signal{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
+\item[\signald{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
dall'attivazione del tracciamento per il processo. È usato dai programmi per
il debugging e un programma normale non dovrebbe ricevere questo segnale.
-\item[\signal{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
+\item[\signald{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
richiede l'esecuzione di una \textit{system call}, ma si è fornito un codice
sbagliato per quest'ultima.
-\item[\signal{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non
+\item[\signald{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non
è previsto da nessuno standard ed è definito solo su alcune architetture che
come il vecchio PDP11 prevedono questo tipo di interruzione, non è presente
sui normali PC.
periferica). L'azione predefinita di questi segnali è di terminare il
processo, questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
+\item[\signald{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
generico usato per causare la conclusione di un programma. È quello che
viene generato di default dal comando \cmd{kill}. Al contrario di
\signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo
si usa per chiedere in maniera ``\textsl{educata}'' ad un processo di
concludersi.
-\item[\signal{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
+\item[\signald{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
interruzione per il programma. È quello che viene generato di default dal
dall'invio sul terminale del carattere di controllo ``\textit{INTR}'',
\textit{interrupt} appunto, che viene generato normalmente dalla sequenza
\cmd{C-c} sulla tastiera.
-\item[\signal{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
+\item[\signald{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
controllato da un altro carattere di controllo, ``\textit{QUIT}'',
corrispondente alla sequenza \texttt{C-\bslash} sulla tastiera. A differenza
del precedente l'azione predefinita, oltre alla terminazione del processo,
(tipo la cancellazione di file temporanei), dato che in certi casi esse
possono eliminare informazioni utili nell'esame dei \textit{core dump}.
-\item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
+\item[\signald{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
qualunque programma. Questo segnale non può essere né intercettato, né
ignorato, né bloccato, per cui causa comunque la terminazione del processo.
In genere esso viene generato solo per richiesta esplicita dell'utente dal
per condizioni particolari il processo non può più essere eseguito neanche
per eseguire un gestore.
-\item[\signal{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
+\item[\signald{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
terminale dell'utente si è disconnesso, ad esempio perché si è interrotta la
rete. Viene usato anche per riportare la terminazione del processo di
controllo di un terminale a tutti i processi della sessione (vedi
predefinita è irrilevante, in quanto il loro uso presuppone sempre la
necessità di un gestore. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
+\item[\signald{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
usato dalla funzione \func{alarm}.
-\item[\const{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
+\item[\signald{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
processo.
-\item[\signal{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
+\item[\signald{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
di un timer che misura sia il tempo di CPU speso direttamente dal processo
che quello che il sistema ha speso per conto di quest'ultimo. In genere
viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
generare questi segnali. L'azione predefinita è di essere ignorati. Questi
segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGIO}] Questo segnale viene inviato quando un file descriptor è
+\item[\signald{SIGIO}] Questo segnale viene inviato quando un file descriptor è
pronto per eseguire dell'input/output. In molti sistemi solo i socket e i
terminali possono generare questo segnale, in Linux questo può essere usato
anche per i file, posto che la chiamata a \func{fcntl} che lo attiva abbia
avuto successo.
-\item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati
+\item[\signald{SIGURG}] Questo segnale è inviato quando arrivano dei dati
urgenti o \itindex{out-of-band} \textit{out-of-band} su di un
socket; per maggiori dettagli al proposito si veda
sez.~\ref{sec:TCP_urgent_data}.
-\item[\signal{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001,
+\item[\signald{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001,
ed è equivalente a \signal{SIGIO} che invece deriva da BSD. Su Linux è
definito per compatibilità con i sistemi System V.
\end{basedescript}
loro uso è specializzato e viene trattato in maniera specifica nelle sezioni
in cui si trattano gli argomenti relativi. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
+\item[\signald{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
figlio termina o viene fermato. L'azione predefinita è di ignorare il
segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
-\item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al
+\item[\signald{SIGCLD}] Per Linux questo è solo un segnale identico al
precedente e definito come sinonimo. Il nome è obsoleto, deriva dalla
definizione del segnale su System V, ed oggi deve essere evitato.
-\item[\signal{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
+\item[\signald{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
usato per fare ripartire un programma precedentemente fermato da
\signal{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
ripartire il processo prima della sua consegna. Il comportamento predefinito
se viene fermato e riavviato, come per esempio riscrivere un prompt, o
inviare un avviso.
-\item[\signal{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta
+\item[\signald{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta
cioè nello stato \textit{stopped} (vedi sez.~\ref{sec:proc_sched}). Il
segnale non può essere né intercettato, né ignorato, né bloccato.
-\item[\signal{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
+\item[\signald{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
ferma il processo interattivamente, ed è generato dal carattere
``\textit{SUSP}'', prodotto dalla combinazione di tasti \cmd{C-z}, ed al
contrario di \signal{SIGSTOP} può essere intercettato e ignorato. In genere
esempio un programma ha disabilitato l'eco sul terminale può installare un
gestore per riabilitarlo prima di fermarsi.
-\item[\signal{SIGTTIN}] Un processo non può leggere dal terminale se esegue
+\item[\signald{SIGTTIN}] Un processo non può leggere dal terminale se esegue
una sessione di lavoro in \textit{background}. Quando un processo in
\textit{background} tenta di leggere da un terminale viene inviato questo
segnale a tutti i processi della sessione di lavoro. L'azione predefinita è
di fermare il processo. L'argomento è trattato in
sez.~\ref{sec:sess_job_control_overview}.
-\item[\signal{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
+\item[\signald{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
generato quando si tenta di scrivere sul terminale o modificarne uno dei
modi con un processo in \textit{background}. L'azione predefinita è di
fermare il processo, l'argomento è trattato in
resto del sistema. L'azione predefinita di questi segnali è normalmente
quella di terminare il processo, questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle
+\item[\signald{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle
\textit{pipe}, (o delle FIFO o dei socket) è necessario, prima che un
processo inizi a scrivere su una di esse, che un altro l'abbia aperta in
lettura (si veda sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è
ignorato la chiamata che lo ha causato fallisce, restituendo l'errore
\errcode{EPIPE}.
-\item[\signal{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
+\item[\signald{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
segnale è generato quando un processo eccede il limite impostato per il
tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}. Fino al
kernel 2.2 terminava semplicemente il processo, a partire dal kernel 2.4,
seguendo le indicazioni dello standard POSIX.1-2001 viene anche generato un
\textit{core dump}.
-\item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
+\item[\signald{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
segnale è generato quando un processo tenta di estendere un file oltre le
dimensioni specificate dal limite impostato per le dimensioni massime di un
file, vedi sez.~\ref{sec:sys_resource_limit}. Fino al kernel 2.2 terminava
semplicemente il processo, a partire dal kernel 2.4, seguendo le indicazioni
dello standard POSIX.1-2001 viene anche generato un \textit{core dump}.
-\item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
+\item[\signald{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
segnale che viene generato quando si perde un advisory lock su un file su
NFS perché il server NFS è stato riavviato. Il progetto GNU lo utilizza per
indicare ad un client il crollo inaspettato di un server. In Linux è
Raccogliamo qui infine una serie di segnali che hanno scopi differenti non
classificabili in maniera omogenea. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
+\item[\signald{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
dell'utente che lo può usare per quello che vuole. Viene generato solo
attraverso l'invocazione della funzione \func{kill}. Entrambi i segnali
possono essere utili per implementare una comunicazione elementare fra
processi diversi, o per eseguire a richiesta una operazione utilizzando un
gestore. L'azione predefinita è di terminare il processo.
-\item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per
+\item[\signald{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per
il suo utilizzo vale esattamente quanto appena detto per \signal{SIGUSR1}.
-\item[\signal{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
+\item[\signald{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
programmi testuali per riformattare l'uscita su schermo quando si cambia
dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
-\item[\signal{SIGINFO}] Il segnale indica una richiesta di informazioni. È
+\item[\signald{SIGINFO}] Il segnale indica una richiesta di informazioni. È
usato con il controllo di sessione, causa la stampa di informazioni da parte
del processo leader del gruppo associato al terminale di controllo, gli
altri processi lo ignorano. Su Linux però viene utilizzato come sinonimo di
\signal{SIGPWR} e l'azione predefinita è di terminare il processo.
-\item[\signal{SIGPWR}] Il segnale indica un cambio nello stato di
+\item[\signald{SIGPWR}] Il segnale indica un cambio nello stato di
alimentazione di un eventuale gruppo di continuità e viene usato
principalmente per segnalare l'assenza ed il ritorno della corrente. Viene
usato principalmente con \cmd{init} per attivare o fermare le procedure di
spegnimento automatico all'esaurimento delle batterie. L'azione predefinita
è di terminare il processo.
-\item[\signal{SIGSTKFLT}] Indica un errore nello stack del coprocessore
+\item[\signald{SIGSTKFLT}] Indica un errore nello stack del coprocessore
matematico, è definito solo per le architetture PC, ma è completamente
inusato. L'azione predefinita è di terminare il processo.
\end{basedescript}
più dettagliate dal sistema, attraverso la struttura \struct{siginfo\_t},
riportata in fig.~\ref{fig:sig_siginfo_t}. I due campi devono essere usati in
maniera alternativa, in certe implementazioni questi campi vengono addirittura
-definiti come una \direct{union}.
+definiti come una \direct{union}.\footnote{la direttiva \direct{union} del
+ linguaggio C definisce una variabile complessa, analoga a una stuttura, i
+ cui campi indicano i diversi tipi di valori che possono essere salvati, in
+ maniera alternativa, all'interno della stessa.}
Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile
accedere alle informazioni restituite attraverso il puntatore a questa
\begin{table}[!htb]
\footnotesize
\centering
- \begin{tabular}[c]{|l|p{8cm}|}
+ \begin{tabular}[c]{|l|p{10cm}|}
\hline
\textbf{Valore} & \textbf{Significato} \\
\hline
\const{TRAP\_BRKPT} & Breakpoint sul processo.\\
\const{TRAP\_TRACE} & Trappola di tracciamento del processo.\\
\hline
- \const{CLD\_EXITED} & Il figlio è uscito.\\
- \const{CLD\_KILLED} & Il figlio è stato terminato.\\
- \const{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\
- \const{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
- \const{CLD\_STOPPED} & Il figlio è stato fermato.\\
- \const{CLD\_CONTINUED}& Il figlio è ripartito.\\
+ \constd{CLD\_EXITED} & Il figlio è uscito.\\
+ \constd{CLD\_KILLED} & Il figlio è stato terminato.\\
+ \constd{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\
+ \constd{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
+ \constd{CLD\_STOPPED} & Il figlio è stato fermato.\\
+ \constd{CLD\_CONTINUED}& Il figlio è ripartito.\\
\hline
\const{POLL\_IN} & Disponibili dati in ingresso.\\
\const{POLL\_OUT} & Spazio disponibile sul buffer di uscita.\\
\end{table}
Il resto della struttura \struct{siginfo\_t} è definito come una
-\direct{union} ed i valori eventualmente presenti dipendono dal segnale
+\dirct{union} ed i valori eventualmente presenti dipendono dal segnale
ricevuto, così \signal{SIGCHLD} ed i segnali \textit{real-time} (vedi
sez.~\ref{sec:sig_real_time}) inviati tramite \func{kill} avvalorano
\var{si\_pid} e \var{si\_uid} coi valori corrispondenti al processo che ha
gestore di segnale.
Si noti come, essendo la funzione estremamente semplice, essa è definita come
-\direct{inline}. Questa direttiva viene usata per dire al compilatore di
+\dirct{inline}. Questa direttiva viene usata per dire al compilatore di
trattare la funzione cui essa fa riferimento in maniera speciale inserendo il
codice direttamente nel testo del programma. Anche se i compilatori più
moderni sono in grado di effettuare da soli queste manipolazioni (impostando
di un gestore di segnali la stessa funzione che dal segnale è stata
interrotta.
-\index{funzioni!sicure|(}
+\index{funzioni!\textit{signal safe}|(}
Il concetto è comunque più generale e porta ad una distinzione fra quelle che
POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e
\label{fig:sig_safe_functions}
\end{figure}
-\index{funzioni!sicure|)}
+\index{funzioni!\textit{signal safe}|)}
Lo standard POSIX.1-2004 modifica la lista di
fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e
sez.~\ref{sec:sig_sigaction}, è disponibile anche con i segnali ordinari, si
applicano solo ai nuovi segnali \textit{real-time}; questi ultimi sono
accessibili in un intervallo di valori specificati dalle due costanti
-\const{SIGRTMIN} e \const{SIGRTMAX}, che specificano il numero minimo e
+\constd{SIGRTMIN} e \constd{SIGRTMAX}, che specificano il numero minimo e
massimo associato ad un segnale \textit{real-time}.
Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1},
\end{figure}
Detto campo, identificato con il tipo di dato \type{sigval\_t}, è una
-\direct{union} di tipo \struct{sigval} (la sua definizione è in
+\dirct{union} di tipo \struct{sigval} (la sua definizione è in
fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico,
se usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma
\var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
segnale è stato installato con
\const{SA\_SIGINFO} gli verrà restituito il
valore specificato con \var{sigev\_value} (una
- \direct{union} \texttt{sigval}, la cui definizione
+ \dirct{union} \texttt{sigval}, la cui definizione
è in fig.~\ref{fig:sig_sigval}) come valore del
campo \var{si\_value} di \struct{siginfo\_t}.\\
\const{SIGEV\_THREAD} & La notifica viene effettuata creando un nuovo