Indicizzazione e ulterirore revisione dei segnali
[gapil.git] / signal.tex
index ef80f9532b5630d8bb1ddc553e42c95a06eb0ca3..94fb886a9f7f7b20d3788236b7b8c71b82210215 100644 (file)
@@ -55,24 +55,21 @@ il seguente:
 \item la scadenza di un timer o di un allarme;
 \item il tentativo di effettuare un'operazione di input/output che non può
   essere eseguita;
-\item una richiesta dell'utente di terminare o fermare il programma. In genere
-  si realizza attraverso un segnale mandato dalla shell in corrispondenza
-  della pressione di tasti del terminale come \code{C-c} o
-  \code{C-z};\footnote{indichiamo con \code{C-x} la pressione simultanea al
-    tasto \code{x} del tasto control (ctrl in molte tastiere).}
-\item l'esecuzione di una \func{kill} o di una \func{raise} da parte del
-  processo stesso o di un altro (solo nel caso della \func{kill}).
+\item una richiesta dell'utente dal terminale di terminare o fermare il
+  programma.
+\item l'invio esplicito da parte del processo stesso o di un altro.
 \end{itemize*}
 
-Ciascuno di questi eventi (compresi gli ultimi due che pure sono controllati
-dall'utente o da un altro processo) comporta l'intervento diretto da parte del
+Ciascuno di questi eventicompresi gli ultimi due che pure sono controllati
+dall'utente o da un altro processo, comporta l'intervento diretto da parte del
 kernel che causa la generazione di un particolare tipo di segnale.
 
 Quando un processo riceve un segnale, invece del normale corso del programma,
-viene eseguita una azione predefinita o una apposita funzione di gestione
-(quello che da qui in avanti chiameremo il \textsl{gestore} del segnale,
-dall'inglese \textit{signal handler}) che può essere stata specificata
-dall'utente (nel qual caso si dice che si \textsl{intercetta} il segnale).
+viene eseguita una azione predefinita o una apposita funzione di gestione che
+può essere stata specificata dall'utente, nel qual caso si dice che si
+\textsl{intercetta} il segnale. Riprendendo la terminologia originale da qui
+in avanti faremo riferimento a questa funzione come al \textsl{gestore} del
+segnale, traduzione approssimata dell'inglese \textit{signal handler}.
 
 
 \subsection{Le \textsl{semantiche} del funzionamento dei segnali}
@@ -85,23 +82,12 @@ individuare due tipologie fondamentali di comportamento dei segnali (dette
   affidabile} (o \textit{reliable}) e \textsl{semantica inaffidabile} (o
 \textit{unreliable}).
 
-Nella \textsl{semantica inaffidabile} (quella implementata dalle prime
-versioni di Unix) la funzione di gestione del segnale specificata dall'utente
-non resta attiva una volta che è stata eseguita; è perciò compito dell'utente
-stesso ripetere l'installazione all'interno del \textsl{gestore} del segnale,
-in tutti quei casi in cui si vuole che esso resti attivo.
-
-In questo caso è possibile una situazione in cui i segnali possono essere
-perduti. Si consideri il segmento di codice riportato in
-fig.~\ref{fig:sig_old_handler}, nel programma principale viene installato un
-gestore (\texttt{\small 5}), ed in quest'ultimo la prima operazione
-(\texttt{\small 11}) è quella di reinstallare se stesso. Se nell'esecuzione
-del gestore un secondo segnale arriva prima che esso abbia potuto eseguire la
-reinstallazione, verrà eseguito il comportamento predefinito assegnato al
-segnale stesso, il che può comportare, a seconda dei casi, che il segnale
-viene perso (se l'impostazione predefinita era quello di ignorarlo) o la
-terminazione immediata del processo; in entrambi i casi l'azione prevista non
-verrà eseguita.
+Nella \textsl{semantica inaffidabile}, che veniva implementata dalle prime
+versioni di Unix, la funzione di gestione del segnale specificata dall'utente
+non restava attiva una volta che era stata eseguita; era perciò compito
+dell'utente ripetere l'installazione dello stesso all'interno del
+\textsl{gestore} del segnale in tutti quei casi in cui si voleva che esso
+restasse attivo.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -114,22 +100,33 @@ verrà eseguita.
   \label{fig:sig_old_handler}
 \end{figure}
 
+In questo caso però è possibile una situazione in cui i segnali possono essere
+perduti. Si consideri il segmento di codice riportato in
+fig.~\ref{fig:sig_old_handler}: nel programma principale viene installato un
+gestore (\texttt{\small 5}), la cui prima operazione (\texttt{\small 11}) è
+quella di reinstallare se stesso. Se nell'esecuzione del gestore fosse
+arrivato un secondo segnale prima che esso abbia potuto eseguire la
+reinstallazione di se stesso per questo secondo segnale verrebbe eseguito il
+comportamento predefinito, il che può comportare, a seconda dei casi, la
+perdita del segnale (se l'impostazione predefinita è quella di ignorarlo) o la
+terminazione immediata del processo; in entrambi i casi l'azione prevista dal
+gestore non verrebbe eseguita.
+
 Questa è la ragione per cui l'implementazione dei segnali secondo questa
-semantica viene chiamata \textsl{inaffidabile}; infatti la ricezione del
+semantica viene chiamata \textsl{inaffidabile}: infatti la ricezione del
 segnale e la reinstallazione del suo gestore non sono operazioni atomiche, e
 sono sempre possibili delle \itindex{race~condition} \textit{race condition}
-(sull'argomento vedi quanto detto in sez.~\ref{sec:proc_multi_prog}).
-
-Un altro problema è che in questa semantica non esiste un modo per bloccare i
-segnali quando non si vuole che arrivino; i processi possono ignorare il
-segnale, ma non è possibile istruire il sistema a non fare nulla in occasione
-di un segnale, pur mantenendo memoria del fatto che è avvenuto.
+(si ricordi sez.~\ref{sec:proc_multi_prog}).  Un altro problema è che in
+questa semantica non esiste un modo per bloccare i segnali quando non si vuole
+che arrivino; i processi possono ignorare il segnale, ma non è possibile
+istruire il sistema a non fare nulla in occasione di un segnale, pur
+mantenendo memoria del fatto che è avvenuto.
 
 Nella semantica \textsl{affidabile} (quella utilizzata da Linux e da ogni Unix
 moderno) il gestore una volta installato resta attivo e non si hanno tutti i
 problemi precedenti. In questa semantica i segnali vengono \textsl{generati}
 dal kernel per un processo all'occorrenza dell'evento che causa il segnale. In
-genere questo viene fatto dal kernel impostando l'apposito campo della
+genere questo viene fatto dal kernel impostando un apposito campo della
 \struct{task\_struct} del processo nella \itindex{process~table}
 \textit{process table} (si veda fig.~\ref{fig:proc_task_struct}).
 
@@ -153,34 +150,45 @@ consente di cambiare l'azione per il segnale prima che esso venga consegnato,
 e si può usare la funzione \func{sigpending} (vedi sez.~\ref{sec:sig_sigmask})
 per determinare quali segnali sono bloccati e quali sono pendenti.
 
+Infine occorre precisare che i segnali predatano il supporto per i
+\textit{thread} e vengono sempre inviati al processo come insieme, cosa che
+può creare incertezza nel caso questo sia multi-\textit{thread}. In tal caso
+quando è possibile determinare quale è il \textit{thread} specifico che deve
+ricevere il segnale, come avviene per i segnali di errore, questo sarà inviato
+solo a lui, altrimenti sarà inviato a discrezione del kernel ad uno qualunque
+dei \textit{thread} del processo che possa riceverlo (che cioè non blocchi il
+segnale), torneremo sull'argomento in sez.~\ref{sec:thread_signal}.
 
 \subsection{Tipi di segnali}
 \label{sec:sig_types}
 
-In generale gli eventi che generano segnali si possono dividere in tre
-categorie principali: errori, eventi esterni e richieste esplicite.
+In generale si tende a classificare gli eventi che possono generare dei
+segnali in tre categorie principali: errori, eventi esterni e richieste
+esplicite.
 
 Un errore significa che un programma ha fatto qualcosa di sbagliato e non può
 continuare ad essere eseguito. Non tutti gli errori causano dei segnali, in
 genere le condizioni di errore più comuni comportano la restituzione di un
-codice di errore da parte di una funzione di libreria; sono gli errori che
-possono avvenire nella esecuzione delle istruzioni di un programma che causano
-l'emissione di un segnale, come le divisioni per zero o l'uso di indirizzi di
-memoria non validi.
-
-Un evento esterno ha in genere a che fare con l'I/O o con altri processi;
-esempi di segnali di questo tipo sono quelli legati all'arrivo di dati di
-input, scadenze di un timer, terminazione di processi figli.
-
-Una richiesta esplicita significa l'uso di una chiamata di sistema (come
-\func{kill} o \func{raise}) per la generazione di un segnale, cosa che
-viene fatta usualmente dalla shell quando l'utente invoca la sequenza di tasti
-di stop o di suspend, ma può essere pure inserita all'interno di un programma.
+codice di errore da parte di una funzione di libreria. Sono gli errori che
+possono avvenire nell'esecuzione delle istruzioni di un programma, come le
+divisioni per zero o l'uso di indirizzi di memoria non validi, che causano
+l'emissione di un segnale.
+
+Un evento esterno ha in genere a che fare con le operazioni di lettura e
+scrittura su file, o con l'interazione con dispositivi o con altri processi;
+esempi di segnali di questo tipo sono quelli legati all'arrivo di dati in
+ingresso, scadenze di un timer, terminazione di processi figli, la pressione
+dei tasti di stop o di suspend su un terminale.
+
+Una richiesta esplicita significa l'uso da parte di un programma delle
+apposite funzioni di sistema, come \func{kill} ed affini (vedi
+sez.~\ref{sec:sig_kill_raise}) per la generazione ``\textsl{manuale}'' di un
+segnale.
 
 Si dice poi che i segnali possono essere \textsl{asincroni} o
 \textsl{sincroni}. Un segnale \textsl{sincrono} è legato ad una azione
 specifica di un programma ed è inviato (a meno che non sia bloccato) durante
-tale azione; molti errori generano segnali \textsl{sincroni}, così come la
+tale azione. Molti errori generano segnali \textsl{sincroni}, così come la
 richiesta esplicita da parte del processo tramite le chiamate al sistema.
 Alcuni errori come la divisione per zero non sono completamente sincroni e
 possono arrivare dopo qualche istruzione.
@@ -205,126 +213,200 @@ Come accennato quando un segnale viene generato, se la sua azione predefinita
 non è quella di essere ignorato, il kernel prende nota del fatto nella
 \struct{task\_struct} del processo; si dice così che il segnale diventa
 \textsl{pendente} (o \textit{pending}), e rimane tale fino al momento in cui
-verrà notificato al processo (o verrà specificata come azione quella di
-ignorarlo).
+verrà notificato al processo o verrà specificata come azione quella di
+ignorarlo.
 
 Normalmente l'invio al processo che deve ricevere il segnale è immediato ed
 avviene non appena questo viene rimesso in esecuzione dallo
 \itindex{scheduler} scheduler che esegue l'azione specificata. Questo a meno
 che il segnale in questione non sia stato bloccato prima della notifica, nel
 qual caso l'invio non avviene ed il segnale resta \textsl{pendente}
-indefinitamente. Quando lo si sblocca il segnale \textsl{pendente} sarà subito
-notificato. Si tenga presente però che i segnali \textsl{pendenti} non si
+indefinitamente. 
+
+Quando lo si sblocca un segnale \textsl{pendente} sarà subito notificato. Si
+tenga presente però che tradizionalmente i segnali \textsl{pendenti} non si
 accodano, alla generazione infatti il kernel marca un flag nella
 \struct{task\_struct} del processo, per cui se prima della notifica ne vengono
 generati altri il flag è comunque marcato, ed il gestore viene eseguito sempre
-una sola volta.
-
-Si ricordi però che se l'azione specificata per un segnale è quella di essere
-ignorato questo sarà scartato immediatamente al momento della sua generazione,
-e questo anche se in quel momento il segnale è bloccato (perché bloccare su un
-segnale significa bloccarne la notifica). Per questo motivo un segnale,
-fintanto che viene ignorato, non sarà mai notificato, anche se prima è stato
-bloccato ed in seguito si è specificata una azione diversa (nel qual caso solo
-i segnali successivi alla nuova specificazione saranno notificati).
-
-Una volta che un segnale viene notificato (che questo avvenga subito o dopo
-una attesa più o meno lunga) viene eseguita l'azione specificata per il
-segnale. Per alcuni segnali (\signal{SIGKILL} e \signal{SIGSTOP}) questa azione
-è fissa e non può essere cambiata, ma per tutti gli altri si può selezionare
-una  delle tre possibilità seguenti:
+una sola volta. In realtà questo non vale nel caso dei cosiddetti segnali
+\textit{real-time}, che vedremo in sez.~\ref{sec:sig_real_time}, ma questa è
+una funzionalità avanzata che per ora tralasceremo.
+
+Si ricordi inoltre che se l'azione specificata per un segnale è quella di
+essere ignorato questo sarà scartato immediatamente al momento della sua
+generazione, e questo anche se in quel momento il segnale è bloccato, perché
+bloccare su un segnale significa bloccarne la notifica. Per questo motivo un
+segnale, fintanto che viene ignorato, non sarà mai notificato, anche se prima
+è stato bloccato ed in seguito si è specificata una azione diversa, nel qual
+caso solo i segnali successivi alla nuova specificazione saranno notificati.
+
+Una volta che un segnale viene notificato, che questo avvenga subito o dopo
+una attesa più o meno lunga, viene eseguita l'azione specificata per il
+segnale. Per alcuni segnali (per la precisione \signal{SIGKILL} e
+\signal{SIGSTOP}) questa azione è predeterminata dal kernel e non può essere
+mai modificata, ma per tutti gli altri si può selezionare una delle tre
+possibilità seguenti:
 
 \begin{itemize*}
 \item ignorare il segnale;
-\item catturare il segnale, ed utilizzare il gestore specificato;
+\item intercettare il segnale, ed utilizzare il gestore specificato;
 \item accettare l'azione predefinita per quel segnale.
 \end{itemize*}
 
 Un programma può specificare queste scelte usando le due funzioni
-\func{signal} e \func{sigaction} (vedi sez.~\ref{sec:sig_signal} e
-sez.~\ref{sec:sig_sigaction}). Se si è installato un gestore sarà quest'ultimo
-ad essere eseguito alla notifica del segnale.  Inoltre il sistema farà si che
-mentre viene eseguito il gestore di un segnale, quest'ultimo venga
-automaticamente bloccato (così si possono evitare \itindex{race~condition}
-\textit{race condition}).
-
-Nel caso non sia stata specificata un'azione, viene utilizzata l'azione
-standard che (come vedremo in sez.~\ref{sec:sig_standard}) è propria di ciascun
-segnale; nella maggior parte dei casi essa porta alla terminazione del
-processo, ma alcuni segnali che rappresentano eventi innocui vengono ignorati.
-
-Quando un segnale termina un processo, il padre può determinare la causa della
-terminazione esaminando il codice di stato riportato dalle funzioni
-\func{wait} e \func{waitpid} (vedi sez.~\ref{sec:proc_wait}); questo è il modo
-in cui la shell determina i motivi della terminazione di un programma e scrive
-un eventuale messaggio di errore.
+\func{signal} e \func{sigaction}, che tratteremo rispettivamente in
+sez.~\ref{sec:sig_signal} e sez.~\ref{sec:sig_sigaction}. Se si è installato
+un gestore sarà quest'ultimo ad essere eseguito alla notifica del segnale.
+Inoltre il sistema farà si che mentre viene eseguito il gestore di un segnale,
+quest'ultimo venga automaticamente bloccato, così si possono evitare alla
+radice possibili \itindex{race~condition} \textit{race condition}.
+
+Nel caso non sia stata specificata un'azione, viene utilizzata la cosiddetta
+azione predefinita che, come vedremo in sez.~\ref{sec:sig_standard}, è propria
+di ciascun segnale. Nella maggior parte dei casi questa azione comporta la
+terminazione immediata del processo, ma per alcuni segnali che rappresentano
+eventi innocui l'azione predefinita è di essere ignorati. Inoltre esistono
+alcuni segnali la cui azione è semplicemente quella di fermare l'esecuzione
+del programma, vale a dire portarlo nello stato di \textit{stopped} (lo stato
+\texttt{T}, si ricordi tab.~\ref{tab:proc_proc_states} e quanto illustrato in
+sez.~\ref{sec:proc_sched}).
+
+Quando un segnale termina un processo il padre può determinare la causa della
+terminazione esaminandone lo stato di uscita così come viene riportato dalle
+funzioni \func{wait} e \func{waitpid} (vedi sez.~\ref{sec:proc_wait}). Questo
+ad esempio è il modo in cui la shell determina i motivi della terminazione di
+un programma e scrive un eventuale messaggio di errore.
+
+\itindbeg{core~dump}
 
 I segnali che rappresentano errori del programma (divisione per zero o
-violazioni di accesso) hanno anche la caratteristica di scrivere un file di
-\itindex{core~dump} \textit{core dump} che registra lo stato del processo (ed
-in particolare della memoria e dello \itindex{stack} \textit{stack}) prima
-della terminazione.  Questo può essere esaminato in seguito con un debugger
-per investigare sulla causa dell'errore.  Lo stesso avviene se i suddetti
-segnali vengono generati con una \func{kill}.
+violazioni di accesso) hanno come ulteriore caratteristica della loro azione
+predefinita, oltre a terminare il processo, quella di scrivere nella directory
+di lavoro corrente del processo di un file \file{core} su cui viene salvata
+l'immagine della memoria del processo.
+
+Questo file costituisce il cosiddetto \textit{core dump}, e contenendo
+l'immagine della memoria del processo, consente di risalire allo stato dello
+\itindex{stack} \textit{stack} (vedi sez.~\ref{sec:proc_mem_layout}) prima
+della terminazione. Questo permette di esaminare il contenuto del file un
+secondo tempo con un apposito programma (un \textit{debugger} come \cmd{gdb})
+per investigare sulla causa dell'errore, ed in particolare, grazie appunto ai
+dati dello \itindex{stack} \textit{stack}, consente di identificare quale
+funzione ha causato l'errore.
+
+Si tenga presente che il \textit{core dump} viene creato non solo in caso di
+errore effettivo, ma anche se il segnale per cui la sua creazione è prevista
+nell'azione dell'azione predefinita viene inviato al programma con una delle
+funzioni \func{kill}, \func{raise}, ecc.
+
+\itindend{core~dump}
 
 
 \section{La classificazione dei segnali}
 \label{sec:sig_classification}
 
 Esamineremo in questa sezione quali sono i vari segnali definiti nel sistema,
-le loro caratteristiche e tipologia, le varie macro e costanti che permettono
-di identificarli, e le funzioni che ne stampano la descrizione.
+quali sono le loro caratteristiche e la loro tipologia, tratteremo le varie
+macro e costanti che permettono di identificarli, e illustreremo le funzioni
+che ne stampano la descrizione.
 
 
 \subsection{I segnali standard}
 \label{sec:sig_standard}
 
-Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso
-diretto di questo numero da parte dei programmi è da evitare, in quanto esso
-può variare a seconda dell'implementazione del sistema, e nel caso di Linux,
-anche a seconda dell'architettura hardware. 
-Per questo motivo ad ogni segnale viene associato un nome, definendo con una
-macro di preprocessore una costante uguale al suddetto numero. Sono questi
-nomi, che sono standardizzati e sostanzialmente uniformi rispetto alle varie
-implementazioni, che si devono usare nei programmi. Tutti i nomi e le funzioni
-che concernono i segnali sono definiti nell'header di sistema \file{signal.h}.
-
-Il numero totale di segnali presenti è dato dalla macro \const{NSIG}, e dato
-che i numeri dei segnali sono allocati progressivamente, essa corrisponde
-anche al successivo del valore numerico assegnato all'ultimo segnale definito.
-In tab.~\ref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali
-definiti in Linux (estratto dalle pagine di manuale), comparati con quelli
-definiti in vari standard.
+Ciascun segnale è identificato dal kernel con un numero, ma benché per alcuni
+segnali questi numeri siano sempre gli stessi, tanto da essere usati come
+sinonimi, l'uso diretto degli identificativi numerici da parte dei programmi è
+comunque da evitare, in quanto essi non sono mai stati standardizzati e
+possono variare a seconda dell'implementazione del sistema, e nel caso di
+Linux anche a seconda della architettura hardware e della versione del kernel.
 
-\begin{table}[htb]
+Quelli che invece sono stati, almeno a grandi linee, standardizzati, sono i
+nomi dei segnali e le costanti di preprocessore che li identificano, che sono
+tutte nella forma \texttt{SIGnome}, e sono queste che devono essere usate nei
+programmi. Come tutti gli altri nomi e le funzioni che concernono i segnali,
+esse sono definite nell'header di sistema \headfile{signal.h}.
+
+\begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|c|p{8cm}|}
+  \begin{tabular}[c]{|l|c|c|l|}
     \hline
-    \textbf{Sigla} & \textbf{Significato} \\
+    \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
     \hline
     \hline
-    A & L'azione predefinita è terminare il processo.\\
-    B & L'azione predefinita è ignorare il segnale.\\
-    C & L'azione predefinita è terminare il processo e scrivere un 
-        \itindex{core~dump} \textit{core dump}.\\
-    D & L'azione predefinita è fermare il processo.\\
-    E & Il segnale non può essere intercettato.\\
-    F & Il segnale non può essere ignorato.\\
+    \signal{SIGHUP}  &P & T & Hangup o terminazione del processo di 
+                              controllo.\\
+    \signal{SIGINT}  &PA& T & Interrupt da tastiera (\cmd{C-c}).\\
+    \signal{SIGQUIT} &P & C & Quit da tastiera (\cmd{C-y}).\\
+    \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}.\\
+    \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{SIGUSR1} &P & T & Segnale utente numero 1.\\
+    \signal{SIGSEGV} &AP& C & Errore di accesso in memoria.\\
+    \signal{SIGUSR2} &P & T & Segnale utente numero 2.\\
+    \signal{SIGPIPE} &P & T & Pipe spezzata.\\
+    \signal{SIGALRM} &P & T & Segnale del timer da \func{alarm}.\\
+    \signal{SIGTERM} &AP& T & Segnale di terminazione (\texttt{C-\bslash}).\\
+    \signal{SIGCHLD} &P & I & Figlio terminato o fermato.\\
+    \signal{SIGCONT} &P &-- & Continua se fermato.\\
+    \signal{SIGSTOP} &P & S & Ferma il processo.\\
+    \signal{SIGTSTP} &P & S & Pressione del tasto di stop sul terminale.\\
+    \signal{SIGTTIN} &P & S & Input sul terminale per un processo 
+                              in background.\\
+    \signal{SIGTTOU} &P & S & Output sul terminale per un processo          
+                              in background.\\
+    \signal{SIGURG}  &BS& I & Ricezione di una \textit{urgent condition} su 
+                              un socket.\\
+    \signal{SIGXCPU} &BS& C & Ecceduto il limite sul tempo di CPU.\\
+    \signal{SIGXFSZ} &BS& C & Ecceduto il limite sulla dimensione dei file.\\
+    \signal{SIGVTALRM}&BS& T& Timer di esecuzione scaduto.\\
+    \signal{SIGPROF} &BS& T & Timer del \textit{profiling} scaduto.\\
+    \signal{SIGWINCH}&B & I & Finestra ridimensionata (4.3BSD, Sun).\\
+    \signal{SIGIO}   &B & T & L'I/O è possibile.\\
+    \signal{SIGPOLL} &VS& T & \textit{Pollable event}, sinonimo di
+                              \signal{SIGIO}.\\
+    \signal{SIGPWR}  &V & T & Fallimento dell'alimentazione.\\
+    \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
+                               \signal{SIGSYS}).\\
+    \hline
+    \signal{SIGCLD}  &V & I & Sinonimo di \signal{SIGCHLD}.\\
+    \signal{SIGEMT}  &V & C & Trappola di emulatore.\\
+    \signal{SIGINFO} &B & T & Sinonimo di \signal{SIGPWR}.\\
+    \signal{SIGLOST} &? & T & Perso un lock sul file, sinonimo
+                              di \signal{SIGIO} (inusato).\\
     \hline
   \end{tabular}
-  \caption{Legenda delle azioni predefinite dei segnali riportate in 
-    tab.~\ref{tab:sig_signal_list}.}
-  \label{tab:sig_action_leg}
+  \caption{Lista dei segnali ordinari in Linux.}
+  \label{tab:sig_signal_list}
 \end{table}
 
-In tab.~\ref{tab:sig_signal_list} si sono anche riportate le azioni predefinite
-di ciascun segnale (riassunte con delle lettere, la cui legenda completa è in
-tab.~\ref{tab:sig_action_leg}), quando nessun gestore è installato un
-segnale può essere ignorato o causare la terminazione del processo. Nella
-colonna standard sono stati indicati anche gli standard in cui ciascun segnale
-è definito, secondo lo schema di tab.~\ref{tab:sig_standard_leg}.
-
+In tab.~\ref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali
+ordinari definiti su Linux per tutte le possibili architetture (tratteremo
+quelli \textit{real-time} in sez.~\ref{sec:sig_real_time}). Ma si tenga
+presente che solo quelli elencati nella prima sezione della tabella sono
+presenti su tutte le architetture. Nelle sezioni successive si sono riportati
+rispettivamente quelli che esistono solo sull'architettura PC e quelli che non
+esistono sull'architettura PC, ma sono definiti sulle architetture
+\textit{alpha} o \textit{mips}.
+
+Alcuni segnali erano previsti fin dallo standard ANSI C, ed i segnali sono
+presenti in tutti i sistemi unix-like, ma l'elenco di quelli disponibili non è
+uniforme, ed alcuni di essi sono presenti solo su alcune implementazioni o
+architetture hardware, ed anche il loro significato può variare. Per questo si
+sono riportati nella seconda colonna della tabella riporta gli standard in cui
+ciascun segnale è stato definito, indicati con altrettante lettere da
+interpretare secondo la legenda di tab.~\ref{tab:sig_standard_leg}. Si tenga
+presente che il significato dei segnali è abbastanza indipendente dalle
+implementazioni solo per quelli definiti negli standard POSIX.1-1990 e
+POSIX.1-2001. 
 
 \begin{table}[htb]
   \footnotesize
@@ -334,96 +416,74 @@ colonna standard sono stati indicati anche gli standard in cui ciascun segnale
     \textbf{Sigla} & \textbf{Standard} \\
     \hline
     \hline
-    P & POSIX \\
-    B & BSD \\
-    L & Linux \\
-    S & SUSv2 \\
+    P & POSIX.1-1990.\\
+    B & BSD (4.2 BSD e Sun).\\
+    A & ANSI C.\\
+    S & SUSv2 (e POSIX.1-2001).\\
+    V & System V.\\
+    ? & Ignoto.\\
     \hline
   \end{tabular}
-  \caption{Legenda dei valori della colonna \textbf{Standard} di 
-    tab.~\ref{tab:sig_signal_list}.}
+  \caption{Legenda dei valori degli standard riportati nella seconda colonna
+    di tab.~\ref{tab:sig_signal_list}.} 
   \label{tab:sig_standard_leg}
 \end{table}
 
-In alcuni casi alla terminazione del processo è associata la creazione di un
-file (posto nella directory corrente del processo e chiamato \file{core}) su
-cui viene salvata un'immagine della memoria del processo (il cosiddetto
-\itindex{core~dump} \textit{core dump}), che può essere usata da un debugger
-per esaminare lo stato dello \itindex{stack} \textit{stack} e delle variabili
-al momento della ricezione del segnale.
+Come accennato in sez.~\ref{sec:sig_notification} a ciascun segnale è
+associata una specifica azione predefinita che viene eseguita quando nessun
+gestore è installato. Le azioni predefinite possibili, che abbiamo già
+descritto in sez.~\ref{sec:sig_notification}, sono state riportate in
+tab.~\ref{tab:sig_signal_list} nella terza colonna, e di nuovo sono state
+indicate con delle lettere la cui legenda completa è illustrata in
+tab.~\ref{tab:sig_action_leg}).
 
-\begin{table}[!htb]
+\begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|c|l|}
+  \begin{tabular}[c]{|c|l|}
     \hline
-    \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
+    \textbf{Sigla} & \textbf{Significato} \\
     \hline
     \hline
-    \signal{SIGHUP}  &PL & A & Hangup o terminazione del processo di 
-                               controllo.                                    \\
-    \signal{SIGINT}  &PL & A & Interrupt da tastiera (\cmd{C-c}).            \\
-    \signal{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}).                 \\
-    \signal{SIGILL}  &PL & C & Istruzione illecita.                          \\
-    \signal{SIGABRT} &PL & C & Segnale di abort da \func{abort}.             \\
-    \signal{SIGFPE}  &PL & C & Errore aritmetico.                            \\
-    \signal{SIGKILL} &PL &AEF& Segnale di terminazione forzata.              \\
-    \signal{SIGSEGV} &PL & C & Errore di accesso in memoria.                 \\
-    \signal{SIGPIPE} &PL & A & Pipe spezzata.                                \\
-    \signal{SIGALRM} &PL & A & Segnale del timer da \func{alarm}.            \\
-    \signal{SIGTERM} &PL & A & Segnale di terminazione \texttt{C-\bslash}.   \\
-    \signal{SIGUSR1} &PL & A & Segnale utente numero 1.                      \\
-    \signal{SIGUSR2} &PL & A & Segnale utente numero 2.                      \\
-    \signal{SIGCHLD} &PL & B & Figlio terminato o fermato.                   \\
-    \signal{SIGCONT} &PL &   & Continua se fermato.                          \\
-    \signal{SIGSTOP} &PL &DEF& Ferma il processo.                            \\
-    \signal{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale.    \\
-    \signal{SIGTTIN} &PL & D & Input sul terminale per un processo 
-                               in background.                                \\
-    \signal{SIGTTOU} &PL & D & Output sul terminale per un processo          
-                               in background.                                \\
-    \signal{SIGBUS}  &SL & C & Errore sul bus (bad memory access).           \\
-    \signal{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V);  
-                               Sinonimo di \signal{SIGIO}.                   \\
-    \signal{SIGPROF} &SL & A & Timer del profiling scaduto.                  \\
-    \signal{SIGSYS}  &SL & C & Argomento sbagliato per una subroutine (SVID).\\
-    \signal{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint.             \\
-    \signal{SIGURG}  &SLB& B & Ricezione di una \textit{urgent condition} su 
-                               un socket. \\
-    \signal{SIGVTALRM}&SLB& A & Timer di esecuzione scaduto.                 \\
-    \signal{SIGXCPU}  &SLB& C & Ecceduto il limite sul tempo di CPU.         \\
-    \signal{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file.\\
-    \signal{SIGIOT}   &L  & C & IOT trap. Sinonimo di \signal{SIGABRT}.      \\
-    \signal{SIGEMT}   &L  &   &                                              \\
-% TODO che roba e` SIGEMT
-    \signal{SIGSTKFLT}&L  & A & Errore sullo stack del coprocessore.         \\
-    \signal{SIGIO}    &LB & A & L'I/O è possibile (4.2 BSD).                 \\
-    \signal{SIGCLD}   &L  &   & Sinonimo di \signal{SIGCHLD}.                \\
-    \signal{SIGPWR}   &L  & A & Fallimento dell'alimentazione.               \\
-    \signal{SIGINFO}  &L  &   & Sinonimo di \signal{SIGPWR}.                 \\
-    \signal{SIGLOST}  &L  & A & Perso un lock sul file (per NFS).            \\
-    \signal{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun).      \\
-    \signal{SIGUNUSED}&L  & A & Segnale inutilizzato (diventerà 
-                               \signal{SIGSYS}).                             \\
+    T & L'azione predefinita è terminare il processo.\\
+    C & L'azione predefinita è terminare il processo e scrivere un 
+        \itindex{core~dump} \textit{core dump}.\\
+    I & L'azione predefinita è ignorare il segnale.\\
+    S & L'azione predefinita è fermare il processo.\\
     \hline
   \end{tabular}
-  \caption{Lista dei segnali in Linux.}
-  \label{tab:sig_signal_list}
+  \caption{Legenda delle azioni predefinite dei segnali riportate nella terza
+    colonna di tab.~\ref{tab:sig_signal_list}.}
+  \label{tab:sig_action_leg}
 \end{table}
 
-La descrizione dettagliata del significato dei vari segnali, raggruppati per
-tipologia, verrà affrontata nei paragrafi successivi.
 
+Si inoltre noti come \const{SIGCONT} sia l'unico segnale a non avere
+l'indicazione di una azione predefinita nella terza colonna di
+tab.~\ref{tab:sig_signal_list}, questo perché il suo effetto è sempre quello
+di far ripartire un programma in stato \texttt{T} fermato da un segnale di
+stop. Inoltre i segnali \const{SIGSTOP} e \const{SIGKILL} si distinguono da
+tutti gli altri per la specifica caratteristica di non potere essere né
+intercettati, né bloccati, né ignorati.
+
+Il numero totale di segnali presenti è dato dalla macro \const{NSIG} (e tiene
+conto anche di quelli \textit{real-time}) e dato che i numeri dei segnali sono
+allocati progressivamente, essa corrisponde anche al successivo del valore
+numerico assegnato all'ultimo segnale definito.  La descrizione dettagliata
+del significato dei precedenti segnali, raggruppati per tipologia, verrà
+affrontata nei paragrafi successivi.
 
-\subsection{Segnali di errore di programma}
+
+\subsection{I segnali di errore}
 \label{sec:sig_prog_error}
 
 Questi segnali sono generati quando il sistema, o in certi casi direttamente
-l'hardware (come per i \itindex{page~fault} \textit{page fault} non validi)
-rileva un qualche errore insanabile nel programma in esecuzione. In generale
-la generazione di questi segnali significa che il programma ha dei gravi
-problemi (ad esempio ha dereferenziato un puntatore non valido o ha eseguito
-una operazione aritmetica proibita) e l'esecuzione non può essere proseguita.
+l'hardware (come per i \itindex{page~fault} \textit{page fault} non validi o
+le eccezioni del processore) rileva un qualche errore insanabile nel programma
+in esecuzione. In generale la generazione di questi segnali significa che il
+programma ha dei gravi problemi (ad esempio ha dereferenziato un puntatore non
+valido o ha eseguito una operazione aritmetica proibita) e l'esecuzione non
+può essere proseguita.
 
 In genere si intercettano questi segnali per permettere al programma di
 terminare in maniera pulita, ad esempio per ripristinare le impostazioni della
@@ -435,10 +495,9 @@ gestore non ci fosse stato.
 
 L'azione predefinita per tutti questi segnali è causare la terminazione del
 processo che li ha causati. In genere oltre a questo il segnale provoca pure
-la registrazione su disco di un file di \itindex{core~dump} \textit{core dump}
-che viene scritto in un file \file{core} nella directory corrente del processo
-al momento dell'errore, che il debugger può usare per ricostruire lo stato del
-programma al momento della terminazione.  Questi segnali sono:
+la registrazione su disco di un file di \itindex{core~dump} \textit{core
+  dump}, che un debugger 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
   derivi da \textit{floating point exception} si applica a tutti gli errori
@@ -447,7 +506,7 @@ programma al momento della terminazione.  Questi segnali sono:
   segnale può condurre ad un ciclo infinito.
 
 %   Per questo segnale le cose sono complicate dal fatto che possono esserci
-%   molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo
+%   molte diverse eccezioni che \signal{SIGFPE} non distingue, mentre lo
 %   standard IEEE per le operazioni in virgola mobile definisce varie eccezioni
 %   aritmetiche e richiede che esse siano notificate.
 % TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni 
@@ -463,31 +522,40 @@ programma al momento della terminazione.  Questi segnali sono:
   \textit{stack}. Lo stesso segnale viene generato in caso di overflow dello
   \itindex{stack} \textit{stack} o di 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.  Se il gestore ritorna il comportamento del processo è indefinito.
+  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.
 
-  È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
-  inizializzato leggendo al di là della fine di un vettore. 
 \item[\signal{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
-  (tipo fuori dallo heap o dallo \itindex{stack} \textit{stack}), mentre
-  \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 che
-  il programma stesso ha rilevato un errore che viene riportato chiamando la
-  funzione \func{abort} che genera questo segnale.
+  (al di fuori dallo \itindex{heap} \textit{heap} o dallo \itindex{stack}
+  \textit{stack}), mentre \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
+  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
   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
-  richiede l'esecuzione di una system call, ma si è fornito un codice
-  sbagliato per quest'ultima.
+  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
+  è 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.
 \end{basedescript}
 
 
@@ -498,40 +566,38 @@ Questo tipo di segnali sono usati per terminare un processo; hanno vari nomi a
 causa del differente uso che se ne può fare, ed i programmi possono
 trattarli in maniera differente. 
 
-La ragione per cui può essere necessario trattare questi segnali è che il
+La ragione per cui può essere necessario intercettare questi segnali è che il
 programma può dover eseguire una serie di azioni di pulizia prima di
 terminare, come salvare informazioni sullo stato in cui si trova, cancellare
 file temporanei, o ripristinare delle condizioni alterate durante il
 funzionamento (come il modo del terminale o le impostazioni di una qualche
-periferica).
-
-L'azione predefinita di questi segnali è di terminare il processo, questi
-segnali sono:
+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
-  generico usato per causare la conclusione di un programma. 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
+  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
   interruzione per il programma. È quello che viene generato di default dal
-  comando \cmd{kill} o dall'invio sul terminale del carattere di controllo
-  INTR (interrupt, generato dalla sequenza \cmd{C-c}).
+  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 è
-  controllato da un altro carattere di controllo, QUIT, corrispondente alla
-  sequenza \texttt{C-\bslash}. A differenza del precedente l'azione
-  predefinita, oltre alla terminazione del processo, comporta anche la
-  creazione di un \itindex{core~dump} \textit{core dump}.
-
+  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,
+  comporta anche la creazione di un \itindex{core~dump} \textit{core dump}.
   In genere lo si può pensare come corrispondente ad una condizione di errore
   del programma rilevata dall'utente. Per questo motivo non è opportuno fare
   eseguire al gestore di questo segnale le operazioni di pulizia normalmente
   previste (tipo la cancellazione di file temporanei), dato che in certi casi
   esse possono eliminare informazioni utili nell'esame dei \itindex{core~dump}
   \textit{core dump}.
-  
 
 \item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
   qualunque programma. Questo segnale non può essere né intercettato, né
@@ -549,14 +615,15 @@ segnali sono:
   per eseguire un gestore.
 
 \item[\signal{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, in modo che
-  essi possano disconnettersi dal relativo terminale. 
-  
-  Viene inoltre usato in genere per segnalare ai demoni (che non hanno un
-  terminale di controllo) la necessità di reinizializzarsi e rileggere il/i
-  file di configurazione.
+  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
+  sez.~\ref{sec:sess_job_control}), in modo che essi possano disconnettersi
+  dal relativo terminale.  Viene inoltre usato in genere per segnalare ai
+  programmi di servizio (i cosiddetti \textsl{demoni}, vedi
+  sez.~\ref{sec:sess_daemon}), che non hanno un terminale di controllo, la
+  necessità di reinizializzarsi e rileggere il file (o i file) di
+  configurazione.
 \end{basedescript}
 
 
@@ -594,9 +661,9 @@ 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 è
-  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 \func{fcntl} abbia
+  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
@@ -604,8 +671,9 @@ segnali sono:
   socket; per maggiori dettagli al proposito si veda
   sez.~\ref{sec:TCP_urgent_data}.
 
-\item[\signal{SIGPOLL}] Questo segnale è equivalente a \signal{SIGIO}, è
-  definito solo per compatibilità con i sistemi System V.
+\item[\signal{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}
 
 
@@ -621,7 +689,8 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
   segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
 
 \item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al
-  precedente, il nome è obsoleto e andrebbe evitato. 
+  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
   usato per fare ripartire un programma precedentemente fermato da
@@ -637,30 +706,32 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
   gestori per far si che un programma produca una qualche azione speciale
   se viene fermato e riavviato, come per esempio riscrivere un prompt, o
   inviare un avviso. 
-\item[\signal{SIGSTOP}] Il segnale ferma un processo (lo porta cioè in uno
-  stato di sleep, vedi sez.~\ref{sec:proc_sched}); il segnale non può essere né
-  intercettato, né ignorato, né bloccato.
+
+\item[\signal{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
-  ferma il processo interattivamente, ed è generato dal carattere SUSP
-  (prodotto dalla combinazione \cmd{C-z}), ed al contrario di
-  \signal{SIGSTOP} può essere intercettato e ignorato. In genere un programma
-  installa un gestore per questo segnale quando vuole lasciare il sistema
-  o il terminale in uno stato definito prima di fermarsi; se per 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 una
-  sessione di lavoro in \textit{background}. Quando un processo in 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
+  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
+  un programma installa un gestore per questo segnale quando vuole lasciare il
+  sistema o il terminale in uno stato definito prima di fermarsi; se per
+  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
+  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
-  generato quando si tenta di scrivere o modificare uno dei modi del
-  terminale. L'azione predefinita è di fermare il processo, l'argomento è
-  trattato in sez.~\ref{sec:sess_job_control_overview}.
+  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
+  sez.~\ref{sec:sess_job_control_overview}.
 \end{basedescript}
 
 
@@ -670,8 +741,8 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
 Questi segnali sono usati per riportare al programma errori generati da
 operazioni da lui eseguite; non indicano errori del programma quanto errori
 che impediscono il completamento dell'esecuzione dovute all'interazione con il
-resto del sistema.  L'azione predefinita di questi segnali è di terminare il
-processo, questi segnali sono:
+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 pipe,
   (o delle FIFO o dei socket) è necessario, prima che un processo inizi a
@@ -680,19 +751,27 @@ processo, questi segnali sono:
   terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
   segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
   lo ha causato fallisce, restituendo l'errore \errcode{EPIPE}.
-\item[\signal{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 è
-  definito come sinonimo di \signal{SIGIO}.\footnote{ed è segnalato come BUG
-    nella pagina di manuale.}
+
 \item[\signal{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}. 
+  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
+  \itindex{core~dump} \textit{core dump}.
+
 \item[\signal{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}. 
+  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 \itindex{core~dump}
+  \textit{core dump}.
+
+\item[\signal{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 è
+  definito come sinonimo di \signal{SIGIO} e non viene più usato.
 \end{basedescript}
 
 
@@ -708,8 +787,8 @@ classificabili in maniera omogenea. Questi segnali sono:
   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. Vedi
-  quanto appena detto per \signal{SIGUSR1}.
+\item[\signal{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
   generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
   righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
@@ -718,7 +797,17 @@ classificabili in maniera omogenea. Questi segnali sono:
 \item[\signal{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.
+  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
+  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
+  matematico, è definito solo per le architetture PC, ma è completamente
+  inusato. L'azione predefinita è di terminare il processo.
 \end{basedescript}
 
 
@@ -726,33 +815,56 @@ classificabili in maniera omogenea. Questi segnali sono:
 \label{sec:sig_strsignal}
 
 Per la descrizione dei segnali il sistema mette a disposizione due funzioni
-che stampano un messaggio di descrizione dato il numero. In genere si usano
-quando si vuole notificare all'utente il segnale ricevuto (nel caso di
-terminazione di un processo figlio o di un gestore che gestisce più segnali);
-la prima funzione, \funcd{strsignal}, è una estensione GNU, accessibile avendo
-definito \macro{\_GNU\_SOURCE}, ed è analoga alla funzione \func{strerror} (si
-veda sez.~\ref{sec:sys_strerror}) per gli errori:
-\begin{prototype}{string.h}{char *strsignal(int signum)} 
-  Ritorna il puntatore ad una stringa che contiene la descrizione del segnale
-  \param{signum}.
-\end{prototype}
-\noindent dato che la stringa è allocata staticamente non se ne deve
-modificare il contenuto, che resta valido solo fino alla successiva chiamata
-di \func{strsignal}. Nel caso si debba mantenere traccia del messaggio sarà
-necessario copiarlo.
+che stampano un messaggio di descrizione specificando il numero del segnale
+con una delle costanti di tab.~\ref{tab:sig_signal_list}.  In genere si usano
+quando si vuole notificare all'utente il segnale ricevuto, ad esempio nel caso
+di terminazione di un processo figlio o di un gestore che gestisce più
+segnali.
+
+La prima funzione, \funcd{strsignal}, è una estensione GNU fornita dalla
+\acr{glibc}, ed è accessibile solo avendo definito la macro
+\macro{\_GNU\_SOURCE}, il suo comportamento è analogo a quello della funzione
+\func{strerror} (si veda sez.~\ref{sec:sys_strerror}) usata per notificare gli
+errori:
+
+\begin{funcproto}{
+\fhead{string.h}
+\fdecl{char *strsignal(int signum)} 
+\fdesc{Ottiene la descrizione di un segnale.} 
+}
+
+{La funzione ritorna puntatore ad una stringa che descrive il segnale, non
+  sono previste condizioni di errore ed \var{errno} non viene modificata.}
+\end{funcproto}
+
+
+La funzione ritorna sempre il puntatore ad una stringa che contiene la
+descrizione del segnale indicato dall'argomento \param{signum}, se questo non
+indica un segnale valido viene restituito il puntatore ad una stringa che
+segnale che il valore indicato non è valido.  Dato che la stringa è allocata
+staticamente non se ne deve modificare il contenuto, che resta valido solo
+fino alla successiva chiamata di \func{strsignal}. Nel caso si debba mantenere
+traccia del messaggio sarà necessario copiarlo.
 
 La seconda funzione, \funcd{psignal}, deriva da BSD ed è analoga alla funzione
-\func{perror} descritta sempre in sez.~\ref{sec:sys_strerror}; il suo prototipo
-è:
-\begin{prototype}{signal.h}{void psignal(int sig, const char *s)} 
-  Stampa sullo standard error un messaggio costituito dalla stringa \param{s},
-  seguita da due punti ed una descrizione del segnale indicato da \param{sig}.
-\end{prototype}
+\func{perror} descritta in sez.~\ref{sec:sys_strerror}, il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{void psignal(int sig, const char *s)}
+\fdesc{Stampa un messaggio di descrizione di un segnale.} 
+}
+{La funzione non ritorna nulla e non prevede errori.}  
+\end{funcproto}
+
+La funzione stampa sullo \textit{standard error} un messaggio costituito dalla
+stringa passata nell'argomento \param{s}, seguita dal carattere di due punti
+ed una descrizione del segnale indicato dall'argomento \param{sig}. 
 
 Una modalità alternativa per utilizzare le descrizioni restituite da
-\func{strsignal} e \func{psignal} è quello di usare la variabile
-\var{sys\_siglist}, che è definita in \file{signal.h} e può essere acceduta
-con la dichiarazione:
+\func{strsignal} e \func{psignal} è quello di usare la
+\index{variabili!globali} variabile globale \var{sys\_siglist}, che è definita
+in \headfile{signal.h} e può essere acceduta con la dichiarazione:
 \includecodesnip{listati/siglist.c}
 
 L'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione,
@@ -772,19 +884,20 @@ effettuata all'interno del normale flusso di esecuzione dello stesso, ma è
 delegata appunto agli eventuali gestori che si sono installati.
 
 In questa sezione vedremo come si effettua la gestione dei segnali, a partire
-dalla loro interazione con le system call, passando per le varie funzioni che
-permettono di installare i gestori e controllare le reazioni di un processo
-alla loro occorrenza.
+dalla loro interazione con le \textit{system call}, passando per le varie
+funzioni che permettono di installare i gestori e controllare le reazioni di
+un processo alla loro occorrenza.
 
 
 \subsection{Il comportamento generale del sistema}
 \label{sec:sig_gen_beha}
 
-Abbiamo già trattato in sez.~\ref{sec:sig_intro} le modalità con cui il sistema
-gestisce l'interazione fra segnali e processi, ci resta da esaminare però il
-comportamento delle system call; in particolare due di esse, \func{fork} ed
-\func{exec}, dovranno essere prese esplicitamente in considerazione, data la
-loro stretta relazione con la creazione di nuovi processi.
+Abbiamo già trattato in sez.~\ref{sec:sig_intro} le modalità con cui il
+sistema gestisce l'interazione fra segnali e processi, ci resta da esaminare
+però il comportamento delle \textit{system call}; in particolare due di esse,
+\func{fork} ed \func{exec}, dovranno essere prese esplicitamente in
+considerazione, data la loro stretta relazione con la creazione di nuovi
+processi.
 
 Come accennato in sez.~\ref{sec:proc_fork} quando viene creato un nuovo
 processo esso eredita dal padre sia le azioni che sono state impostate per i
@@ -800,7 +913,7 @@ senso infatti fare riferimento a funzioni definite nel programma originario,
 che non sono presenti nello spazio di indirizzi del nuovo programma.
 
 Si noti che questo vale solo per le azioni per le quali è stato installato un
-gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a
+gestore, viene mantenuto invece ogni eventuale impostazione dell'azione a
 \const{SIG\_IGN}. Questo permette ad esempio alla shell di impostare ad
 \const{SIG\_IGN} le risposte per \signal{SIGINT} e \signal{SIGQUIT} per i
 programmi eseguiti in background, che altrimenti sarebbero interrotti da una
@@ -811,16 +924,17 @@ danno sostanzialmente due casi, a seconda che esse siano
 \index{system~call~lente} \textsl{lente} (\textit{slow}) o \textsl{veloci}
 (\textit{fast}). La gran parte di esse appartiene a quest'ultima categoria,
 che non è influenzata dall'arrivo di un segnale. Esse sono dette
-\textsl{veloci} in quanto la loro esecuzione è sostanzialmente immediata; la
+\textsl{veloci} in quanto la loro esecuzione è sostanzialmente immediata. La
 risposta al segnale viene sempre data dopo che la \textit{system call} è stata
 completata, in quanto attendere per eseguire un gestore non comporta nessun
 inconveniente.
 
-In alcuni casi però alcune system call (che per questo motivo vengono chiamate
-\textsl{lente}) possono bloccarsi indefinitamente. In questo caso non si può
-attendere la conclusione della system call, perché questo renderebbe
-impossibile una risposta pronta al segnale, per cui il gestore viene
-eseguito prima che la system call sia ritornata.  Un elenco dei casi in cui si
+In alcuni casi però alcune \textit{system call} possono bloccarsi
+indefinitamente e per questo motivo vengono chiamate \textsl{lente}
+\index{system~call~lente} o \textsl{bloccanti}. In questo caso non si può
+attendere la conclusione della \textit{system call}, perché questo renderebbe
+impossibile una risposta pronta al segnale, per cui il gestore viene eseguito
+prima che la \textit{system call} sia ritornata.  Un elenco dei casi in cui si
 presenta questa situazione è il seguente:
 \begin{itemize*}
 \item la lettura da file che possono bloccarsi in attesa di dati non ancora
@@ -833,68 +947,104 @@ presenta questa situazione è il seguente:
   essere riavvolto);
 \item le operazioni eseguite con \func{ioctl} che non è detto possano essere
   eseguite immediatamente;
-\item le funzioni di intercomunicazione che si bloccano in attesa di risposte
-  da altri processi;
-\item la funzione \func{pause} (usata appunto per attendere l'arrivo di un
-  segnale);
-\item la funzione \func{wait} (se nessun processo figlio è ancora terminato).
+\item le funzioni di intercomunicazione fra processi (vedi cap.~\ref{cha:IPC})
+  che si bloccano in attesa di risposte da altri processi;
+\item la funzione \func{pause} (vedi sez.~\ref{sec:sig_pause_sleep}) e le
+  analoghe \func{sigsuspend}, \func{sigtimedwait}, e \func{sigwaitinfo} (vedi
+  sez.~\ref{sec:sig_real_time}), usate appunto per attendere l'arrivo di un
+  segnale;
+\item le funzioni associate al \textit{file locking} (vedi
+  sez.~\ref{sec:file_locking})
+\item la funzione \func{wait} e le analoghe funzioni di attesa se nessun
+  processo figlio è ancora terminato.
 \end{itemize*}
 
 In questo caso si pone il problema di cosa fare una volta che il gestore sia
 ritornato. La scelta originaria dei primi Unix era quella di far ritornare
-anche la system call restituendo l'errore di \errcode{EINTR}. Questa è a
-tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
+anche la \textit{system call} restituendo l'errore di \errcode{EINTR}. Questa
+è a tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
 gestori controllino lo stato di uscita delle funzioni che eseguono una system
 call lenta per ripeterne la chiamata qualora l'errore fosse questo.
 
-Dimenticarsi di richiamare una system call interrotta da un segnale è un
-errore comune, tanto che le \acr{glibc} provvedono una macro
+Dimenticarsi di richiamare una \textit{system call} interrotta da un segnale è
+un errore comune, tanto che le \acr{glibc} provvedono una macro
 \code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente,
 ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato
 non è diverso dall'uscita con un errore \errcode{EINTR}.
 
 La soluzione è comunque poco elegante e BSD ha scelto un approccio molto
-diverso, che è quello di fare ripartire automaticamente una system call
-interrotta invece di farla fallire. In questo caso ovviamente non c'è bisogno
-di preoccuparsi di controllare il codice di errore; si perde però la
+diverso, che è quello di fare ripartire automaticamente una \textit{system
+  call} interrotta invece di farla fallire. In questo caso ovviamente non c'è
+bisogno di preoccuparsi di controllare il codice di errore; si perde però la
 possibilità di eseguire azioni specifiche all'occorrenza di questa particolare
 condizione.
 
 Linux e le \acr{glibc} consentono di utilizzare entrambi gli approcci,
 attraverso una opportuna opzione di \func{sigaction} (vedi
 sez.~\ref{sec:sig_sigaction}). È da chiarire comunque che nel caso di
-interruzione nel mezzo di un trasferimento parziale di dati, le system call
-ritornano sempre indicando i byte trasferiti.
+interruzione nel mezzo di un trasferimento parziale di dati, le \textit{system
+  call} ritornano sempre indicando i byte trasferiti.
+
+Si tenga presente però che alcune \textit{system call} vengono comunque
+interrotte con un errore di \errcode{EINTR} indipendentemente dal fatto che ne
+possa essere stato richiesto il riavvio automatico, queste funzioni sono:
+
+\begin{itemize*}
+\item le funzioni di attesa di un segnale, come \func{pause} (vedi
+  sez.~\ref{sec:sig_pause_sleep}), \func{sigsuspend}, \func{sigtimedwait}, e
+  \func{sigwaitinfo} (vedi sez.~\ref{sec:sig_real_time}).
+\item le funzioni di attesa dell'\textit{I/O multiplexing}, come
+  \func{select}, \func{pselect}, \func{poll}, \func{ppoll}, \func{epoll\_wait}
+  e \func{epoll\_pwait} (vedi sez.~\ref{sec:file_multiplexing}).
+\item le funzioni del System V IPC che prevedono attese: \func{msgrcv},
+  \func{msgsnd} (vedi sez.~\ref{sec:ipc_sysv_mq}), \func{semop} e
+  \func{semtimedop} (vedi sez.~\ref{sec:ipc_sysv_sem}).
+\item le funzioni di attesa di un processo: \func{usleep}, \func{nanosleep}
+  (vedi sez.~\ref{sec:sig_pause_sleep}) e \func{clock\_nanosleep} (vedi
+  sez.~\ref{sec:sig_timer_adv}).
+\item le funzioni che operano sui socket quando è stato impostato un
+  \textit{timeout} sugli stessi con \func{setsockopt} (vedi
+  sez.~\ref{sec:sock_generic_options}) ed in particolare \func{accept},
+  \func{recv}, \func{recvfrom}, \func{recvmsg} per un \textit{timeout} in
+  ricezione e \func{connect}, \func{send}, \func{sendto} e \func{sendmsg} per
+  un \textit{timeout} in trasmissione.
+%\item la funzione \func{io\_getevents} per l'I/O asincrono (vedi sez.??)
+\end{itemize*}
 
-% TODO: alcune syscall danno EINTR anche se il segnale è installato con
-% SA_RESTART, vedi signal(7)
 
 
-\subsection{La funzione \func{signal}}
+\subsection{L'installazione di un gestore}
 \label{sec:sig_signal}
 
 L'interfaccia più semplice per la gestione dei segnali è costituita dalla
-funzione \funcd{signal} che è definita fin dallo standard ANSI C.
+funzione di sistema \funcd{signal} che è definita fin dallo standard ANSI C.
 Quest'ultimo però non considera sistemi multitasking, per cui la definizione è
-tanto vaga da essere del tutto inutile in un sistema Unix; è questo il motivo
-per cui ogni implementazione successiva ne ha modificato e ridefinito il
+tanto vaga da essere del tutto inutile in un sistema Unix. Per questo motivo
+ogni implementazione successiva ne ha modificato e ridefinito il
 comportamento, pur mantenendone immutato il prototipo\footnote{in realtà in
   alcune vecchie implementazioni (SVr4 e 4.3+BSD in particolare) vengono usati
   alcuni argomenti aggiuntivi per definire il comportamento della funzione,
   vedremo in sez.~\ref{sec:sig_sigaction} che questo è possibile usando la
   funzione \func{sigaction}.}  che è:
-\begin{prototype}{signal.h}
-  {sighandler\_t signal(int signum, sighandler\_t handler)} 
-  
-  Installa la funzione di gestione \param{handler} (il gestore) per il
-  segnale \param{signum}.
-  
-  \bodydesc{La funzione ritorna il precedente gestore in caso di successo
-    o \const{SIG\_ERR} in caso di errore.}
-\end{prototype}
 
-In questa definizione si è usato un tipo di dato, \type{sighandler\_t}, che è
-una estensione GNU, definita dalle \acr{glibc}, che permette di riscrivere il
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{sighandler\_t signal(int signum, sighandler\_t handler)}
+\fdesc{Installa un gestore di segnale (\textit{signal handler}).} 
+}
+
+{La funzione ritorna il precedente gestore in caso di successo in caso di
+  successo e \const{SIG\_ERR} per un errore, nel qual caso \var{errno}
+  assumerà il valore:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] il numero di segnale \param{signum} non è valido.
+  \end{errlist}
+}  
+\end{funcproto}
+
+In questa definizione per l'argomento \param{handler} che indica il gestore da
+installare si è usato un tipo di dato, \type{sighandler\_t}, che è una
+estensione GNU, definita dalle \acr{glibc}, che permette di riscrivere il
 prototipo di \func{signal} nella forma appena vista, molto più leggibile di
 quanto non sia la versione originaria, che di norma è definita come:
 \includecodesnip{listati/signal.c}
@@ -904,41 +1054,42 @@ con il precedente prototipo si può dedurre la definizione di
 \type{sighandler\_t} che è:
 \includecodesnip{listati/sighandler_t.c}
 e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
-e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le
-  parentesi intorno al nome della funzione per via delle precedenze degli
-  operatori del C, senza di esse si sarebbe definita una funzione che ritorna
-  un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.}
+e che prende un argomento di tipo \ctyp{int}. Si noti come si devono usare le
+parentesi intorno al nome della funzione per via delle precedenze degli
+operatori del C, senza di esse si sarebbe definita una funzione che ritorna un
+puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.
+
 La funzione \func{signal} quindi restituisce e prende come secondo argomento
 un puntatore a una funzione di questo tipo, che è appunto la funzione che
-verrà usata come gestore del segnale.
+verrà usata come gestore del segnale.  Il numero di segnale passato
+nell'argomento \param{signum} può essere indicato direttamente con una delle
+costanti definite in sez.~\ref{sec:sig_standard}.  
 
-Il numero di segnale passato nell'argomento \param{signum} può essere indicato
-direttamente con una delle costanti definite in sez.~\ref{sec:sig_standard}.
 L'argomento \param{handler} che indica il gestore invece, oltre all'indirizzo
 della funzione da chiamare all'occorrenza del segnale, può assumere anche i
-due valori costanti \const{SIG\_IGN} e \const{SIG\_DFL}; il primo indica che
-il segnale deve essere ignorato,\footnote{si ricordi però che i due segnali
-  \signal{SIGKILL} e \signal{SIGSTOP} non possono essere né ignorati né
-  intercettati; l'uso di \const{SIG\_IGN} per questi segnali non ha alcun
-  effetto.} mentre il secondo ripristina l'azione predefinita.\footnote{e
-  serve a tornare al comportamento di default quando non si intende più
-  gestire direttamente un segnale.}
+due valori costanti \const{SIG\_IGN} e \const{SIG\_DFL}. Il primo indica che
+il segnale deve essere ignorato. Il secondo ripristina l'azione predefinita, e
+serve a tornare al comportamento di default quando non si intende più gestire
+direttamente un segnale. Si ricordi però che i due segnali \signal{SIGKILL} e
+\signal{SIGSTOP} non possono essere né ignorati né intercettati e per loro
+l'uso di \func{signal} non ha alcun effetto, qualunque cosa si specifichi
+per \param{handler}.
 
 La funzione restituisce l'indirizzo dell'azione precedente, che può essere
 salvato per poterlo ripristinare (con un'altra chiamata a \func{signal}) in un
-secondo tempo. Si ricordi che se si imposta come azione \const{SIG\_IGN} (o si
-imposta un \const{SIG\_DFL} per un segnale la cui azione predefinita è di
-essere ignorato), tutti i segnali pendenti saranno scartati, e non verranno
-mai notificati.
+secondo tempo. Si ricordi che se si imposta come azione \const{SIG\_IGN} o si
+imposta \const{SIG\_DFL} per un segnale la cui azione predefinita è di essere
+ignorato, tutti i segnali pendenti saranno scartati, e non verranno mai
+notificati.
 
 L'uso di \func{signal} è soggetto a problemi di compatibilità, dato che essa
 si comporta in maniera diversa per sistemi derivati da BSD o da System V. In
 questi ultimi infatti la funzione è conforme al comportamento originale dei
 primi Unix in cui il gestore viene disinstallato alla sua chiamata, secondo la
 semantica inaffidabile; anche Linux seguiva questa convenzione con le vecchie
-librerie del C come le \acr{libc4} e le \acr{libc5}.\footnote{nelle
+librerie del C come la \acr{libc4} e la \acr{libc5}.\footnote{nelle
   \acr{libc5} esiste però la possibilità di includere \file{bsd/signal.h} al
-  posto di \file{signal.h}, nel qual caso la funzione \func{signal} viene
+  posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} viene
   ridefinita per seguire la semantica affidabile usata da BSD.}
 
 Al contrario BSD segue la semantica affidabile, non disinstallando il gestore
@@ -946,117 +1097,105 @@ e bloccando il segnale durante l'esecuzione dello stesso. Con l'utilizzo delle
 \acr{glibc} dalla versione 2 anche Linux è passato a questo comportamento.  Il
 comportamento della versione originale della funzione, il cui uso è deprecato
 per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto
-chiamando \func{sysv\_signal}, una volta che si sia definita la macro
+chiamando \funcm{sysv\_signal}, una volta che si sia definita la macro
 \macro{\_XOPEN\_SOURCE}.  In generale, per evitare questi problemi, l'uso di
 \func{signal}, che tra l'altro ha un comportamento indefinito in caso di
-processo \itindex{thread} multi-\textit{thread}, è da evitare; tutti i nuovi
-programmi dovrebbero usare \func{sigaction}.
+processo \itindex{thread} multi-\textit{thread}, è da evitare: tutti i nuovi
+programmi devono usare \func{sigaction}.
 
 È da tenere presente che, seguendo lo standard POSIX, il comportamento di un
 processo che ignora i segnali \signal{SIGFPE}, \signal{SIGILL}, o
-\signal{SIGSEGV} (qualora questi non originino da una chiamata ad una
-\func{kill} o ad una \func{raise}) è indefinito. Un gestore che ritorna da
+\signal{SIGSEGV}qualora questi non originino da una chiamata ad una
+\func{kill} o altra funzione affine, è indefinito. Un gestore che ritorna da
 questi segnali può dare luogo ad un ciclo infinito.
 
 
-\subsection{Le funzioni \func{kill} e \func{raise}}
+\subsection{Le funzioni per l'invio di segnali}
 \label{sec:sig_kill_raise}
 
-Come precedentemente accennato in sez.~\ref{sec:sig_types}, un segnale può
-anche essere generato direttamente nell'esecuzione di un programma, attraverso
-la chiamata ad una opportuna system call. Le funzioni che si utilizzano di
-solito per inviare un segnale generico ad un processo sono due: \func{raise} e
+Come accennato in sez.~\ref{sec:sig_types} un segnale può anche essere
+generato direttamente nell'esecuzione di un programma, attraverso la chiamata
+ad una opportuna \textit{system call}. Le funzioni che si utilizzano di solito
+per inviare un segnale generico ad un processo sono \func{raise} e
 \func{kill}.
 
-La prima funzione è \funcd{raise}, che è definita dallo standard ANSI C, e
-serve per inviare un segnale al processo corrente,\footnote{non prevedendo la
-  presenza di un sistema multiutente lo standard ANSI C non poteva che
-  definire una funzione che invia il segnale al programma in esecuzione. Nel
-  caso di Linux questa viene implementata come funzione di compatibilità.}  il
-suo prototipo è:
-\begin{prototype}{signal.h}{int raise(int sig)}
-  Invia il segnale \param{sig} al processo corrente.
+La funzione \funcd{raise}, definita dallo standard ANSI C, serve per inviare
+un segnale al processo corrente,\footnote{non prevedendo la presenza di un
+  sistema multiutente lo standard ANSI C non poteva che definire una funzione
+  che invia il segnale al programma in esecuzione, nel caso di Linux questa
+  viene implementata come funzione di compatibilità.}  il suo prototipo è:
 
-  \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
-    errore, il solo errore restituito è \errval{EINVAL} qualora si sia
-    specificato un numero di segnale invalido.}
-\end{prototype}
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int raise(int sig)}
+\fdesc{Invia un segnale al processo corrente.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà il valore: 
+  \begin{errlist}
+  \item[\errcode{EINVAL}] il segnale \param{sig} non è valido.
+  \end{errlist}
+}
+\end{funcproto}
 
 Il valore di \param{sig} specifica il segnale che si vuole inviare e può
-essere specificato con una delle macro definite in
-sez.~\ref{sec:sig_classification}.  In genere questa funzione viene usata per
+essere specificato con una delle costanti illustrate in
+tab.~\ref{tab:sig_signal_list}.  In genere questa funzione viene usata per
 riprodurre il comportamento predefinito di un segnale che sia stato
 intercettato. In questo caso, una volta eseguite le operazioni volute, il
 gestore dovrà prima reinstallare l'azione predefinita, per poi attivarla
 chiamando \func{raise}.
 
-Mentre \func{raise} è una funzione di libreria, quando si vuole inviare un
-segnale generico ad un processo occorre utilizzare la apposita system call,
-questa può essere chiamata attraverso la funzione \funcd{kill}, il cui
-prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \headdecl{signal.h}
-  \funcdecl{int kill(pid\_t pid, int sig)} Invia il segnale \param{sig} al
-  processo specificato con \param{pid}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore nel qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
+In realtà \func{raise} è una funzione di libreria, che per i processi ordinari
+viene implementata attraverso la funzione di sistema \funcd{kill} che è quella
+che consente effettivamente di inviare un segnale generico ad un processo, il
+ suo prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{signal.h}
+\fdecl{int kill(pid\_t pid, int sig)}
+\fdesc{Invia un segnale ad uno o più processi.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
     \item[\errcode{EINVAL}] il segnale specificato non esiste.
-    \item[\errcode{ESRCH}] il processo selezionato non esiste.
+    \item[\errcode{ESRCH}] il processo o il gruppo di processi indicato non
+      esiste.
     \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il
       segnale.
-    \end{errlist}}
-\end{functions}
-
-Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
-specificare il segnale nullo.  Se la funzione viene chiamata con questo valore
-non viene inviato nessun segnale, ma viene eseguito il controllo degli errori,
-in tal caso si otterrà un errore \errcode{EPERM} se non si hanno i permessi
-necessari ed un errore \errcode{ESRCH} se il processo specificato non esiste.
-Si tenga conto però che il sistema ricicla i \ids{PID} (come accennato in
-sez.~\ref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
-esso sia realmente quello a cui si intendeva mandare il segnale.
-
-Il valore dell'argomento \param{pid} specifica il processo (o i processi) di
-destinazione a cui il segnale deve essere inviato e può assumere i valori
-riportati in tab.~\ref{tab:sig_kill_values}.
-
-Si noti pertanto che la funzione \code{raise(sig)} può essere definita in
-termini di \func{kill}, ed è sostanzialmente equivalente ad una
-\code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello
-standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale
-l'uso di \func{kill} finisce per essere più portabile.
-
-Una seconda funzione che può essere definita in termini di \func{kill} è
-\funcd{killpg}, che è sostanzialmente equivalente a
-\code{kill(-pidgrp, signal)}; il suo prototipo è:
-\begin{prototype}{signal.h}{int killpg(pid\_t pidgrp, int signal)} 
-  
-  Invia il segnale \param{signal} al \itindex{process~group} \textit{process
-    group} \param{pidgrp}.
+  \end{errlist}
+}
+\end{funcproto}
 
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, gli errori sono gli stessi di \func{kill}.}
-\end{prototype}
-\noindent e permette di inviare un segnale a tutto un \itindex{process~group}
-\textit{process group} (vedi sez.~\ref{sec:sess_proc_group}).
+La funzione invia il segnale specificato dall'argomento \param{sig} al
+processo o ai processi specificati con l'argomento \param{pid}.  Lo standard
+POSIX prevede che il valore 0 per \param{sig} sia usato per specificare il
+segnale nullo.  Se la funzione viene chiamata con questo valore non viene
+inviato nessun segnale, ma viene eseguito il controllo degli errori, in tal
+caso si otterrà un errore \errcode{EPERM} se non si hanno i permessi necessari
+ed un errore \errcode{ESRCH} se il processo o i processi specificati
+con \param{pid} non esistono.
 
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|r|l|}
+  \begin{tabular}[c]{|r|p{8cm}|}
     \hline
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    $>0$ & Il segnale è mandato al processo con il \ids{PID} indicato.\\
+    $>0$ & Il segnale è mandato al processo con \ids{PID} uguale
+           a \param{pid}.\\ 
     0    & Il segnale è mandato ad ogni processo del \itindex{process~group}
            \textit{process group} del chiamante.\\ 
     $-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
-    $<-1$ & Il segnale è mandato ad ogni processo del \textit{process group} 
-            \itindex{process~group} $|\code{pid}|$.\\
+    $<-1$& Il segnale è mandato ad ogni processo del \textit{process group} 
+           \itindex{process~group} con \ids{PGID} uguale
+           a $|\param{pid}|$.\\
     \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{pid} per la funzione
@@ -1064,48 +1203,123 @@ Una seconda funzione che può essere definita in termini di \func{kill} è
   \label{tab:sig_kill_values}
 \end{table}
 
-Solo l'amministratore può inviare un segnale ad un processo qualunque, in
-tutti gli altri casi l'\ids{UID} reale o l'\ids{UID} effettivo del processo
-chiamante devono corrispondere all'\ids{UID} reale o all'\ids{UID} salvato
-della destinazione. Fa eccezione il caso in cui il segnale inviato sia
-\signal{SIGCONT}, nel quale occorre che entrambi i processi appartengano alla
-stessa sessione. Inoltre, dato il ruolo fondamentale che riveste nel sistema
-(si ricordi quanto visto in sez.~\ref{sec:sig_termination}), non è possibile
-inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso non abbia
-un gestore installato.
-
-Infine, seguendo le specifiche POSIX 1003.1-2001, l'uso della chiamata
-\code{kill(-1, sig)} comporta che il segnale sia inviato (con la solita
-eccezione di \cmd{init}) a tutti i processi per i quali i permessi lo
-consentano. Lo standard permette comunque alle varie implementazioni di
-escludere alcuni processi specifici: nel caso in questione Linux non invia il
-segnale al processo che ha effettuato la chiamata.
-
-
-\subsection{Le funzioni \func{alarm}, \func{abort} ed i \textit{timer}}
+A seconda del valore dell'argomento \param{pid} si può inviare il segnale ad
+uno specifico processo, ad un \textit{process group} (vedi
+sez.~\ref{sec:sess_proc_group}) o a tutti i processi, secondo quanto
+illustrato in tab.~\ref{tab:sig_kill_values} che riporta i valori possibili
+per questo argomento. Si tenga conto però che il sistema ricicla i \ids{PID}
+(come accennato in sez.~\ref{sec:proc_pid}) per cui l'esistenza di un processo
+non significa che esso sia realmente quello a cui si intendeva mandare il
+segnale.
+
+Indipendentemente dalla funzione specifica che viene usata solo
+l'amministratore può inviare un segnale ad un processo qualunque, in tutti gli
+altri casi l'\ids{UID} reale o l'\ids{UID} effettivo del processo chiamante
+devono corrispondere all'\ids{UID} reale o all'\ids{UID} salvato della
+destinazione. Fa eccezione il caso in cui il segnale inviato sia
+\signal{SIGCONT}, nel quale occorre anche che entrambi i processi appartengano
+alla stessa sessione.
+
+Si tenga presente che, per il ruolo fondamentale che riveste nel sistema, non
+è possibile inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso
+non abbia un gestore installato.  Infine, seguendo le specifiche POSIX
+1003.1-2001, l'uso della chiamata \code{kill(-1, sig)} comporta che il segnale
+sia inviato (con la solita eccezione di \cmd{init}) a tutti i processi per i
+quali i permessi lo consentano. Lo standard permette comunque alle varie
+implementazioni di escludere alcuni processi specifici: nel caso in questione
+Linux non invia il segnale al processo che ha effettuato la chiamata.
+
+Si noti pertanto che la funzione \code{raise(sig)} può essere definita in
+termini di \func{kill}, ed è sostanzialmente equivalente ad una
+\code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello
+standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale
+l'uso di \func{kill} finisce per essere più portabile.  Una seconda funzione
+che può essere definita in termini di \func{kill} è \funcd{killpg}, il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int killpg(pid\_t pidgrp, int signal)}
+\fdesc{Invia un segnale ad un \itindex{process~group} \textit{process group}.} 
+}
+
+{ La funzione ritorna $0$ in caso di successo e $-1$ per un errore, e gli
+  errori sono gli stessi di \func{kill}.
+}
+\end{funcproto}
+
+
+La funzione invia il segnale \param{signal} al \itindex{process~group}
+\textit{process group} il cui \acr{PGID} (vedi sez.~\ref{sec:sess_proc_group})
+è indicato dall'argomento \param{pidgrp}, che deve essere un intero
+positivo. Il suo utilizzo è sostanzialmente equivalente all'esecuzione di
+\code{kill(-pidgrp, signal)}.
+
+Oltre alle precedenti funzioni di base, vedremo più avanti che esistono altre
+funzioni per inviare segnali generici, come \func{sigqueue} per i segnali
+\textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) e le specifiche
+funzioni per i \textit{thread} che tratteremo in sez.~\ref{sec:thread_signal}.
+
+Esiste però un'ultima funzione che permette l'invio diretto di un segnale che
+vale la pena di trattare a parte per le sue peculiarità. La funzione in
+questione è \funcd{abort} che, come accennato in
+sez.~\ref{sec:proc_termination}, permette di abortire l'esecuzione di un
+programma tramite l'invio del segnale \signal{SIGABRT}. Il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{stdlib.h}
+\fdecl{void abort(void)}
+\fdesc{Abortisce il processo corrente.} 
+}
+
+{La funzione non ritorna, il processo viene terminato.}
+\end{funcproto}
+
+La differenza fra questa funzione e l'uso di \func{raise} o di un'altra
+funzione per l'invio di \signal{SIGABRT} è che anche se il segnale è bloccato
+o ignorato, la funzione ha effetto lo stesso. Il segnale può però essere
+intercettato per effettuare eventuali operazioni di chiusura prima della
+terminazione del processo.
+
+Lo standard ANSI C richiede inoltre che anche se il gestore ritorna, la
+funzione non ritorni comunque. Lo standard POSIX.1 va oltre e richiede che se
+il processo non viene terminato direttamente dal gestore sia la stessa
+\func{abort} a farlo al ritorno dello stesso. Inoltre, sempre seguendo lo
+standard POSIX, prima della terminazione tutti i file aperti e gli stream
+saranno chiusi ed i buffer scaricati su disco. Non verranno invece eseguite le
+eventuali funzioni registrate con \func{atexit} e \func{on\_exit}.
+
+
+
+
+\subsection{Le funzioni di allarme ed i \textit{timer}}
 \label{sec:sig_alarm_abort}
 
 Un caso particolare di segnali generati a richiesta è quello che riguarda i
-vari segnali di temporizzazione e \signal{SIGABRT}, per ciascuno di questi
-segnali sono previste funzioni specifiche che ne effettuino l'invio. La più
-comune delle funzioni usate per la temporizzazione è \funcd{alarm} il cui
-prototipo è:
-\begin{prototype}{unistd.h}{unsigned int alarm(unsigned int seconds)}
-  Predispone l'invio di \signal{SIGALRM} dopo \param{seconds} secondi.
-  
-  \bodydesc{La funzione restituisce il numero di secondi rimanenti ad un
-    precedente allarme, o zero se non c'erano allarmi pendenti.}
-\end{prototype}
+vari segnali usati per la temporizzazione, per ciascuno di essi infatti sono
+previste delle funzioni specifiche che ne effettuino l'invio. La più comune, e
+la più semplice, delle funzioni usate per la temporizzazione è la funzione di
+sistema \funcd{alarm}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{unsigned int alarm(unsigned int seconds)}
+\fdesc{Predispone l'invio di un allarme.} 
+}
 
-La funzione fornisce un meccanismo che consente ad un processo di predisporre
-un'interruzione nel futuro, (ad esempio per effettuare una qualche operazione
-dopo un certo periodo di tempo), programmando l'emissione di un segnale (nel
-caso in questione \signal{SIGALRM}) dopo il numero di secondi specificato da
-\param{seconds}.
+{La funzione ritorna il numero di secondi rimanenti ad un precedente allarme,
+  o $0$ se non c'erano allarmi pendenti, non sono previste condizioni di
+  errore.}
+\end{funcproto}
 
-Se si specifica per \param{seconds} un valore nullo non verrà inviato nessun
-segnale; siccome alla chiamata viene cancellato ogni precedente allarme,
-questo può essere usato per cancellare una programmazione precedente. 
+La funzione fornisce un meccanismo che consente ad un processo di predisporre
+un'interruzione nel futuro, ad esempio per effettuare una qualche operazione
+dopo un certo periodo di tempo, programmando l'emissione di un segnale (nel
+caso in questione \signal{SIGALRM}) dopo il numero di secondi specificato
+dall'argomento \param{seconds}. Se si specifica per \param{seconds} un valore
+nullo non verrà inviato nessun segnale. Siccome alla chiamata viene cancellato
+ogni precedente allarme, questo valore può essere usato per cancellare una
+programmazione precedente.
 
 La funzione inoltre ritorna il numero di secondi rimanenti all'invio
 dell'allarme programmato in precedenza. In questo modo è possibile controllare
@@ -1125,9 +1339,9 @@ processo tre diversi timer:
   di questo timer provoca l'emissione di \signal{SIGVTALRM};
 \item un \textit{profiling timer} che calcola la somma dei tempi di processore
   utilizzati direttamente dal processo in user space, e dal kernel nelle
-  system call ad esso relative (che corrisponde a quello che in
-  sez.~\ref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La scadenza
-  di questo timer provoca l'emissione di \signal{SIGPROF}.
+  \textit{system call} ad esso relative (che corrisponde a quello che in
+  sez.~\ref{sec:sys_unix_time} abbiamo chiamato \textit{processor time}). La
+  scadenza di questo timer provoca l'emissione di \signal{SIGPROF}.
 \end{itemize*}
 
 Il timer usato da \func{alarm} è il \textit{clock time}, e corrisponde cioè al
@@ -1140,18 +1354,24 @@ Per ovviare a questi limiti Linux deriva da BSD la funzione \funcd{setitimer}
 che permette di usare un timer qualunque e l'invio di segnali periodici, al
 costo però di una maggiore complessità d'uso e di una minore portabilità. Il
 suo prototipo è:
-\begin{prototype}{sys/time.h}{int setitimer(int which, const struct
-    itimerval *value, struct itimerval *ovalue)} 
-  
-  Predispone l'invio di un segnale di allarme alla scadenza dell'intervallo
-  \param{value} sul timer specificato da \param{which}.
+
+\begin{funcproto}{
+\fhead{sys/time.h}
+\fdecl{int setitimer(int which, const struct itimerval *value, struct
+  itimerval *ovalue)}
   
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori \errval{EINVAL} o
-    \errval{EFAULT}.}
-\end{prototype}
+\fdesc{Predispone l'invio di un segnale di allarme.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori \errval{EINVAL} o \errval{EFAULT}
+  nel loro significato generico.}
+\end{funcproto}
+
 
-Il valore di \param{which} permette di specificare quale dei tre timer
+La funzione predispone l'invio di un segnale di allarme alla scadenza
+dell'intervallo indicato dall'argomento \param{value}.  Il valore
+dell'argomento \param{which} permette di specificare quale dei tre timer
 illustrati in precedenza usare; i possibili valori sono riportati in
 tab.~\ref{tab:sig_setitimer_values}.
 \begin{table}[htb]
@@ -1189,7 +1409,7 @@ questo modo il ciclo verrà ripetuto; se invece il valore di \var{it\_interval}
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/itimerval.h}
   \end{minipage} 
   \normalsize 
@@ -1202,13 +1422,13 @@ L'uso di \func{setitimer} consente dunque un controllo completo di tutte le
 caratteristiche dei timer, ed in effetti la stessa \func{alarm}, benché
 definita direttamente nello standard POSIX.1, può a sua volta essere espressa
 in termini di \func{setitimer}, come evidenziato dal manuale delle \acr{glibc}
-\cite{glibc} che ne riporta la definizione mostrata in
+\cite{GlibcMan} che ne riporta la definizione mostrata in
 fig.~\ref{fig:sig_alarm_def}.\footnote{questo comporta anche che non è il caso
   di mescolare chiamate ad \func{abort} e a \func{setitimer}.}
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/alarm_def.c}
   \end{minipage} 
   \normalsize 
@@ -1217,20 +1437,21 @@ fig.~\ref{fig:sig_alarm_def}.\footnote{questo comporta anche che non è il caso
 \end{figure}
 
 Si deve comunque tenere presente che fino al kernel 2.6.16 la precisione di
-queste funzioni era limitata dalla frequenza del timer di sistema,\footnote{il
-  valore della costante \texttt{HZ}, di cui abbiamo già parlato in
-  sez.~\ref{sec:proc_hierarchy}.} in quanto le temporizzazioni erano calcolate
-in numero di interruzioni del timer (i cosiddetti \itindex{jiffies}
-''\textit{jiffies}''), ed era assicurato soltanto che il segnale non sarebbe
+queste funzioni era limitata dalla frequenza del timer di sistema, determinato
+dal valore della costante \texttt{HZ} di cui abbiamo già parlato in
+sez.~\ref{sec:proc_hierarchy}, in quanto le temporizzazioni erano calcolate in
+numero di interruzioni del timer (i cosiddetti \itindex{jiffies}
+``\textit{jiffies}''), ed era assicurato soltanto che il segnale non sarebbe
 stato mai generato prima della scadenza programmata (l'arrotondamento cioè era
 effettuato per eccesso).\footnote{questo in realtà non è del tutto vero a
   causa di un bug, presente fino al kernel 2.6.12, che in certe circostanze
-  causava l'emissione del segnale con un arrotondamento per difetto.} L'uso
-del contatore dei \itindex{jiffies} \textit{jiffies}, un intero a 32 bit,
-comportava inoltre l'impossibilità di specificare tempi molto
-lunghi.\footnote{superiori al valore della costante
-  \const{MAX\_SEC\_IN\_JIFFIES}, pari, nel caso di default di un valore di
-  \const{HZ} di 250, a circa 99 giorni e mezzo.} Con il cambiamento della
+  causava l'emissione del segnale con un arrotondamento per difetto.} 
+
+L'uso del contatore dei \itindex{jiffies} \textit{jiffies}, un intero a 32 bit
+nella maggior parte dei casi, comportava inoltre l'impossibilità di
+specificare tempi molto lunghi. superiori al valore della costante
+\const{MAX\_SEC\_IN\_JIFFIES}, pari, nel caso di default di un valore di
+\const{HZ} di 250, a circa 99 giorni e mezzo. Con il cambiamento della
 rappresentazione effettuato nel kernel 2.6.16 questo problema è scomparso e
 con l'introduzione dei timer ad alta risoluzione (vedi
 sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la precisione è diventata
@@ -1245,50 +1466,30 @@ seconda del carico del sistema.
 Questo ha una conseguenza che può indurre ad errori molto subdoli, si tenga
 conto poi che in caso di sistema molto carico, si può avere il caso patologico
 in cui un timer scade prima che il segnale di una precedente scadenza sia
-stato consegnato; in questo caso, per il comportamento dei segnali descritto
+stato consegnato. In questo caso, per il comportamento dei segnali descritto
 in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo
-oggi l'uso di questa funzione è deprecato a favore dei \textit{POSIX timer}
-che tratteremo in sez.~\ref{sec:sig_timer_adv}.
+oggi l'uso di questa funzione è deprecato a favore degli
+\index{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della
+cosiddetta \itindex{POSIX~Timer~API} \textit{POSIX Timer API}, che tratteremo
+in sez.~\ref{sec:sig_timer_adv}.
 
 Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il
 valore corrente di un timer senza modificarlo, è possibile usare la funzione
 \funcd{getitimer}, il cui prototipo è:
-\begin{prototype}{sys/time.h}{int getitimer(int which, struct
-    itimerval *value)}
-  
-  Legge in \param{value} il valore del timer specificato da \param{which}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore e restituisce gli stessi errori di \func{getitimer}.}
-\end{prototype}
-\noindent i cui argomenti hanno lo stesso significato e formato di quelli di
-\func{setitimer}. 
 
+\begin{funcproto}{
+\fhead{sys/time.h}
+\fdecl{int getitimer(int which, struct itimerval *value)}
+\fdesc{Legge il valore di un timer.} 
+}
 
-L'ultima funzione che permette l'invio diretto di un segnale è \funcd{abort},
-che, come accennato in sez.~\ref{sec:proc_termination}, permette di abortire
-l'esecuzione di un programma tramite l'invio di \signal{SIGABRT}. Il suo
-prototipo è:
-\begin{prototype}{stdlib.h}{void abort(void)}
-  
-  Abortisce il processo corrente.
-  
-  \bodydesc{La funzione non ritorna, il processo è terminato inviando il
-  segnale di \signal{SIGABRT}.}
-\end{prototype}
-
-La differenza fra questa funzione e l'uso di \func{raise} è che anche se il
-segnale è bloccato o ignorato, la funzione ha effetto lo stesso. Il segnale
-può però essere intercettato per effettuare eventuali operazioni di chiusura
-prima della terminazione del processo.
+{ La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà gli stessi valori di \func{getitimer}.  }
+\end{funcproto}
 
-Lo standard ANSI C richiede inoltre che anche se il gestore ritorna, la
-funzione non ritorni comunque. Lo standard POSIX.1 va oltre e richiede che se
-il processo non viene terminato direttamente dal gestore sia la stessa
-\func{abort} a farlo al ritorno dello stesso. Inoltre, sempre seguendo lo
-standard POSIX, prima della terminazione tutti i file aperti e gli stream
-saranno chiusi ed i buffer scaricati su disco. Non verranno invece eseguite le
-eventuali funzioni registrate con \func{atexit} e \func{on\_exit}.
+La funzione legge nella struttura \struct{itimerval} puntata da \param{value}
+il valore del timer specificato da \param{which} ed i suoi argomenti hanno lo
+stesso significato e formato di quelli di \func{setitimer}.
 
 
 \subsection{Le funzioni di pausa e attesa}
@@ -1296,102 +1497,137 @@ eventuali funzioni registrate con \func{atexit} e \func{on\_exit}.
 
 Sono parecchie le occasioni in cui si può avere necessità di sospendere
 temporaneamente l'esecuzione di un processo. Nei sistemi più elementari in
-genere questo veniva fatto con un opportuno loop di attesa, ma in un sistema
-multitasking un loop di attesa è solo un inutile spreco di CPU, per questo ci
-sono apposite funzioni che permettono di mettere un processo in stato di
-attesa.\footnote{si tratta in sostanza di funzioni che permettono di portare
-  esplicitamente il processo in stato di \textit{sleep}, vedi
-  sez.~\ref{sec:proc_sched}.}
-
-Il metodo tradizionale per fare attendere ad un processo fino all'arrivo di un
-segnale è quello di usare la funzione \funcd{pause}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int pause(void)}
-  
-  Pone il processo in stato di sleep fino al ritorno di un gestore.
-  
-  \bodydesc{La funzione ritorna solo dopo che un segnale è stato ricevuto ed
-    il relativo gestore è ritornato, nel qual caso restituisce $-1$ e
-    \var{errno} assumerà il valore \errval{EINTR}.}
-\end{prototype}
+genere questo veniva fatto con un ciclo di attesa in cui il programma ripete
+una operazione un numero sufficiente di volte per far passare il tempo
+richiesto.
+
+Ma in un sistema multitasking un ciclo di attesa è solo un inutile spreco di
+tempo di processore, dato che altri programmi possono essere eseguiti nel
+frattempo, per questo ci sono delle apposite funzioni che permettono di
+mantenere un processo in attesa per il tempo voluto, senza impegnare il
+processore. In pratica si tratta di funzioni che permettono di portare
+esplicitamente il processo nello stato di \textit{sleep} (si ricordi quanto
+illustrato in tab.~\ref{tab:proc_proc_states}) per un certo periodo di tempo.
+
+La prima di queste è la funzione di sistema \funcd{pause}, che viene usata per
+mettere un processo in attesa per un periodo di tempo indefinito, fino
+all'arrivo di un segnale, il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int pause(void)}
+\fdesc{Pone il processo in pausa fino al ricevimento di un segnale.} 
+}
 
-La funzione segnala sempre una condizione di errore (il successo sarebbe
-quello di aspettare indefinitamente). In genere si usa questa funzione quando
-si vuole mettere un processo in attesa di un qualche evento specifico che non
-è sotto il suo diretto controllo (ad esempio la si può usare per interrompere
-l'esecuzione del processo fino all'arrivo di un segnale inviato da un altro
-processo).
+{La funzione ritorna solo dopo che un segnale è stato ricevuto ed il relativo
+  gestore è ritornato, nel qual caso restituisce $-1$ e \var{errno} assume il
+  valore \errval{EINTR}.}
+\end{funcproto}
+
+La funzione ritorna sempre con una condizione di errore, dato che il successo
+sarebbe quello di continuare ad aspettare indefinitamente. In genere si usa
+questa funzione quando si vuole mettere un processo in attesa di un qualche
+evento specifico che non è sotto il suo diretto controllo, ad esempio la si
+può usare per interrompere l'esecuzione del processo fino all'arrivo di un
+segnale inviato da un altro processo.
 
 Quando invece si vuole fare attendere un processo per un intervallo di tempo
-già noto nello standard POSIX.1 viene definita la funzione \funcd{sleep}, il
-cui prototipo è:
-\begin{prototype}{unistd.h}{unsigned int sleep(unsigned int seconds)}
-  
-  Pone il processo in stato di sleep per \param{seconds} secondi.
-  
-  \bodydesc{La funzione restituisce zero se l'attesa viene completata, o il
-  numero di secondi restanti se viene interrotta da un segnale.}
-\end{prototype}
+già noto in partenza, lo standard POSIX.1 prevede una funzione di attesa
+specifica, \funcd{sleep}, il cui prototipo è:
 
-La funzione attende per il tempo specificato, a meno di non essere interrotta
-da un segnale. In questo caso non è una buona idea ripetere la chiamata per il
-tempo rimanente, in quanto la riattivazione del processo può avvenire in un
-qualunque momento, ma il valore restituito sarà sempre arrotondato al secondo,
-con la conseguenza che, se la successione dei segnali è particolarmente
-sfortunata e le differenze si accumulano, si potranno avere ritardi anche di
-parecchi secondi. In genere la scelta più sicura è quella di stabilire un
-termine per l'attesa, e ricalcolare tutte le volte il numero di secondi da
-aspettare.
-
-In alcune implementazioni inoltre l'uso di \func{sleep} può avere conflitti
-con quello di \signal{SIGALRM}, dato che la funzione può essere realizzata con
-l'uso di \func{pause} e \func{alarm} (in maniera analoga all'esempio che
-vedremo in sez.~\ref{sec:sig_example}). In tal caso mescolare chiamata di
-\func{alarm} e \func{sleep} o modificare l'azione di \signal{SIGALRM}, può
-causare risultati indefiniti. Nel caso delle \acr{glibc} è stata usata una
-implementazione completamente indipendente e questi problemi non ci sono.
+\begin{funcproto}{
+
+\fhead{unistd.h}
+\fdecl{unsigned int sleep(unsigned int seconds)}
+\fdesc{Pone il processo in pausa per un tempo in secondi.} 
+}
+
+{La funzione ritorna $0$ se l'attesa viene completata  o il
+  numero di secondi restanti se viene interrotta da un segnale, non sono
+  previsti codici di errore.}
+\end{funcproto}
+
+La funzione pone il processo in stato di \textit{sleep} per il numero di
+secondi specificato dall'argomento \param{seconds}, a meno di non essere
+interrotta da un segnale. Alla terminazione del periodo di tempo indicato la
+funzione ritorna riportando il processo in stato \textit{runnable} così che
+questo possa riprendere l'esecuzione.
+
+In caso di interruzione della funzione non è una buona idea ripetere la
+chiamata per il tempo rimanente restituito dalla stessa, in quanto la
+riattivazione del processo può avvenire in un qualunque momento, ma il valore
+restituito sarà sempre arrotondato al secondo. Questo può avere la conseguenza
+che se la successione dei segnali è particolarmente sfortunata e le differenze
+si accumulano, si possono avere ritardi anche di parecchi secondi rispetto a
+quanto programmato inizialmente. In genere la scelta più sicura in questo caso
+è quella di stabilire un termine per l'attesa, e ricalcolare tutte le volte il
+numero di secondi che restano da aspettare.
+
+Si tenga presente che alcune implementazioni l'uso di \func{sleep} può avere
+conflitti con quello di \signal{SIGALRM}, dato che la funzione può essere
+realizzata con l'uso di \func{pause} e \func{alarm}, in una maniera analoga a
+quella dell'esempio che vedremo in sez.~\ref{sec:sig_example}. In tal caso
+mescolare chiamate di \func{alarm} e \func{sleep} o modificare l'azione
+associata \signal{SIGALRM}, può portare a dei risultati indefiniti. Nel caso
+delle \acr{glibc} è stata usata una implementazione completamente indipendente
+e questi problemi non ci sono, ma un programma portabile non può fare questa
+assunzione.
 
 La granularità di \func{sleep} permette di specificare attese soltanto in
-secondi, per questo sia sotto BSD4.3 che in SUSv2 è stata definita la funzione
-\funcd{usleep} (dove la \texttt{u} è intesa come sostituzione di $\mu$); i due
-standard hanno delle definizioni diverse, ma le \acr{glibc}
-seguono\footnote{secondo la pagina di manuale almeno dalla versione 2.2.2.}
-seguono quella di SUSv2 che prevede il seguente prototipo:
-\begin{prototype}{unistd.h}{int usleep(unsigned long usec)}
-  
-  Pone il processo in stato di sleep per \param{usec} microsecondi.
-  
-  \bodydesc{La funzione restituisce zero se l'attesa viene completata, o $-1$
-    in caso di errore, nel qual caso \var{errno} assumerà il valore
-    \errval{EINTR}.}
+secondi, per questo sia sotto BSD4.3 che in SUSv2 è stata definita un'altra
+funzione con una precisione teorica del microsecondo. I due standard hanno
+delle definizioni diverse, ma le \acr{glibc} seguono (secondo la pagina di
+manuale almeno dalla versione 2.2.2) seguono quella di SUSv2 per cui la
+funzione \funcd{usleep} (dove la \texttt{u} è intesa come sostituzione di
+$\mu$), ha il seguente prototipo:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int usleep(unsigned long usec)}
+\fdesc{Pone il processo in pausa per un tempo in microsecondi.} 
+}
 
-\end{prototype}
+{La funzione ritorna $0$ se l'attesa viene completata e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+  \item[\errcode{EINVAL}] si è indicato un valore di \param{usec} maggiore di
+    1000000.
+  \end{errlist}
+}
+\end{funcproto}
 
 Anche questa funzione, a seconda delle implementazioni, può presentare
-problemi nell'interazione con \func{alarm} e \signal{SIGALRM}. È pertanto
-deprecata in favore della funzione \funcd{nanosleep}, definita dallo standard
-POSIX1.b, il cui prototipo è:
-\begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct
-    timespec *rem)}
-  
-  Pone il processo in stato di sleep per il tempo specificato da \param{req}.
-  In caso di interruzione restituisce il tempo restante in \param{rem}.
-  
-  \bodydesc{La funzione restituisce zero se l'attesa viene completata, o $-1$
-    in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
+problemi nell'interazione con \func{alarm} e \signal{SIGALRM}, per questo
+motivo, pur essendovi citata, nello standard POSIX.1-2001 viene deprecata in
+favore della nuova funzione di sistema \funcd{nanosleep}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int nanosleep(const struct timespec *req, struct timespec *rem)}
+\fdesc{Pone il processo in pausa per un periodo di tempo.} 
+}
+
+{La funzione ritorna $0$ se l'attesa viene completata e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
     \item[\errcode{EINVAL}] si è specificato un numero di secondi negativo o un
       numero di nanosecondi maggiore di 999.999.999.
     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
-    \end{errlist}}
-\end{prototype}
-
-Lo standard richiede che la funzione sia implementata in maniera del tutto
-indipendente da \func{alarm}\footnote{nel caso di Linux questo è fatto
-  utilizzando direttamente il timer del kernel.} e sia utilizzabile senza
-interferenze con l'uso di \signal{SIGALRM}. La funzione prende come argomenti
-delle strutture di tipo \struct{timespec}, la cui definizione è riportata in
-fig.~\ref{fig:sys_timespec_struct}, che permette di specificare un tempo con
-una precisione fino al nanosecondo.
+  \end{errlist}
+}
+\end{funcproto}
+
+La funzione pone il processo in pausa portandolo nello stato di \textit{sleep}
+per il tempo specificato dall'argomento \param{req}, ed in caso di
+interruzione restituisce il tempo restante nell'argomento \param{rem}.  Lo
+standard richiede che la funzione sia implementata in maniera del tutto
+indipendente da \func{alarm}, e nel caso di Linux questo è fatto utilizzando
+direttamente il timer del kernel. Lo standard richiede inoltre che la funzione
+sia utilizzabile senza interferenze con l'uso di \signal{SIGALRM}. La funzione
+prende come argomenti delle strutture di tipo \struct{timespec}, la cui
+definizione è riportata in fig.~\ref{fig:sys_timespec_struct}, il che permette
+di specificare un tempo con una precisione teorica fino al nanosecondo.
 
 La funzione risolve anche il problema di proseguire l'attesa dopo
 l'interruzione dovuta ad un segnale; infatti in tal caso in \param{rem} viene
@@ -1400,12 +1636,13 @@ inizialmente,\footnote{con l'eccezione, valida solo nei kernel della serie
   2.4, in cui, per i processi riavviati dopo essere stati fermati da un
   segnale, il tempo passato in stato \texttt{T} non viene considerato nel
   calcolo della rimanenza.} e basta richiamare la funzione per completare
-l'attesa.\footnote{anche qui però occorre tenere presente che i tempi sono
-  arrotondati, per cui la precisione, per quanto migliore di quella ottenibile
-  con \func{sleep}, è relativa e in caso di molte interruzioni si può avere
-  una deriva, per questo esiste la funzione \func{clock\_nanosleep} (vedi
-  sez.~\ref{sec:sig_timer_adv}) che permette di specificare un tempo assoluto
-  anziché un tempo relativo.}
+l'attesa.
+
+Anche qui però occorre tenere presente che i tempi sono arrotondati, per cui
+la precisione, per quanto migliore di quella ottenibile con \func{sleep}, è
+relativa e in caso di molte interruzioni si può avere una deriva, per questo
+esiste la funzione \func{clock\_nanosleep} (vedi sez.~\ref{sec:sig_timer_adv})
+che permette di specificare un tempo assoluto anziché un tempo relativo.
 
 Chiaramente, anche se il tempo può essere specificato con risoluzioni fino al
 nanosecondo, la precisione di \func{nanosleep} è determinata dalla risoluzione
@@ -1435,21 +1672,18 @@ precisione disponibile sull'hardware della propria macchina.
 Un semplice esempio per illustrare il funzionamento di un gestore di segnale è
 quello della gestione di \signal{SIGCHLD}. Abbiamo visto in
 sez.~\ref{sec:proc_termination} che una delle azioni eseguite dal kernel alla
-conclusione di un processo è quella di inviare questo segnale al
-padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il
-  segnale si chiama \signal{SIGCLD} e viene trattato in maniera speciale; in
-  System V infatti se si imposta esplicitamente l'azione a \const{SIG\_IGN} il
-  segnale non viene generato ed il sistema non genera \itindex{zombie}
-  \textit{zombie} (lo stato di terminazione viene scartato senza dover
-  chiamare una \func{wait}).  L'azione predefinita è sempre quella di ignorare
-  il segnale, ma non attiva questo comportamento. Linux, come BSD e POSIX, non
-  supporta questa semantica ed usa il nome di \signal{SIGCLD} come sinonimo di
-  \signal{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo
-stato di uscita di un processo, si può completare la gestione della
-terminazione installando un gestore per \signal{SIGCHLD} il cui unico compito
-sia quello di chiamare \func{waitpid} per completare la procedura di
-terminazione in modo da evitare la formazione di \itindex{zombie}
-\textit{zombie}.
+conclusione di un processo è quella di inviare questo segnale al padre. In
+generale dunque, quando non interessa elaborare lo stato di uscita di un
+processo, si può completare la gestione della terminazione installando un
+gestore per \signal{SIGCHLD} il cui unico compito sia quello di chiamare
+\func{waitpid} per completare la procedura di terminazione in modo da evitare
+la formazione di \itindex{zombie} \textit{zombie}.\footnote{si ricordi
+  comunque che dal kernel 2.6 seguendo lo standard POSIX.1-2001 per evitare di
+  dover ricevere gli stati di uscita che non interessano basta impostare come
+  azione predefinita quella di ignorare \signal{SIGCHLD}, nel qual caso viene
+  assunta la semantica di System V, in cui il segnale non viene inviato, il
+  sistema non genera \itindex{zombie} \textit{zombie} e lo stato di
+  terminazione viene scartato senza dover chiamare una \func{wait}.}
 
 In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una
 implementazione generica di una funzione di gestione per \signal{SIGCHLD},
@@ -1470,13 +1704,14 @@ più la creazione di \itindex{zombie} \textit{zombie}.
   \label{fig:sig_sigchld_handl}
 \end{figure}
 
-Il codice del gestore è di lettura immediata; come buona norma di
+Il codice del gestore è di lettura immediata, come buona norma di
 programmazione (si ricordi quanto accennato sez.~\ref{sec:sys_errno}) si
 comincia (\texttt{\small 6--7}) con il salvare lo stato corrente di
 \var{errno}, in modo da poterlo ripristinare prima del ritorno del gestore
 (\texttt{\small 16--17}). In questo modo si preserva il valore della variabile
 visto dal corso di esecuzione principale del processo, che altrimenti sarebbe
-sovrascritto dal valore restituito nella successiva chiamata di \func{waitpid}.
+sovrascritto dal valore restituito nella successiva chiamata di
+\func{waitpid}.
 
 Il compito principale del gestore è quello di ricevere lo stato di
 terminazione del processo, cosa che viene eseguita nel ciclo in
@@ -1534,7 +1769,7 @@ questo può sembrare di implementazione immediata; ad esempio una semplice
 versione di \func{sleep} potrebbe essere quella illustrata in
 fig.~\ref{fig:sig_sleep_wrong}.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/sleep_danger.c}
@@ -1567,11 +1802,11 @@ non verrebbe mai più interrotta (se non in caso di un altro segnale).
 
 Questo problema può essere risolto (ed è la modalità con cui veniva fatto in
 SVr2) usando la funzione \func{longjmp} (vedi sez.~\ref{sec:proc_longjmp}) per
-uscire dal gestore; in questo modo, con una condizione sullo stato di
+uscire dal gestore. In questo modo, con una condizione sullo stato di
 uscita di quest'ultima, si può evitare la chiamata a \func{pause}, usando un
 codice del tipo di quello riportato in fig.~\ref{fig:sig_sleep_incomplete}.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/sleep_defect.c}
@@ -1582,29 +1817,32 @@ codice del tipo di quello riportato in fig.~\ref{fig:sig_sleep_incomplete}.
 \end{figure}
 
 In questo caso il gestore (\texttt{\small 18-27}) non ritorna come in
-fig.~\ref{fig:sig_sleep_wrong}, ma usa \func{longjmp} (\texttt{\small 25}) per
-rientrare nel corpo principale del programma; dato che in questo caso il
-valore di uscita di \func{setjmp} è 1, grazie alla condizione in
-(\texttt{\small 9-12}) si evita comunque che \func{pause} sia chiamata a
-vuoto.
-
-Ma anche questa implementazione comporta dei problemi; in questo caso infatti
-non viene gestita correttamente l'interazione con gli altri segnali; se
+fig.~\ref{fig:sig_sleep_wrong}, ma usa la funzione \func{longjmp}
+(\texttt{\small 25}) per rientrare direttamente nel corpo principale del
+programma. Dato che in questo caso il valore di uscita che verrà restituito da
+\func{setjmp} è 1, grazie alla condizione impostata in (\texttt{\small 9-12})
+si potrà evitare comunque che \func{pause} sia chiamata a vuoto.
+
+Ma anche questa implementazione comporta dei problemi, in questo caso infatti
+non viene gestita correttamente l'interazione con gli altri segnali. Se
 infatti il segnale di allarme interrompe un altro gestore, l'esecuzione non
 riprenderà nel gestore in questione, ma nel ciclo principale, interrompendone
 inopportunamente l'esecuzione.  Lo stesso tipo di problemi si presenterebbero
-se si volesse usare \func{alarm} per stabilire un timeout su una qualunque
-system call bloccante.
-
-Un secondo esempio è quello in cui si usa il segnale per notificare una
-qualche forma di evento; in genere quello che si fa in questo caso è impostare
-nel gestore un opportuno flag da controllare nel corpo principale del
-programma (con un codice del tipo di quello riportato in
-fig.~\ref{fig:sig_event_wrong}). La logica è quella di far impostare al
-gestore (\texttt{\small 14-19}) una \index{variabili!globali} variabile
-globale preventivamente inizializzata nel programma principale, il quale potrà
-determinare, osservandone il contenuto, l'occorrenza o meno del segnale, e
-prendere le relative azioni conseguenti (\texttt{\small 6-11}).
+se si volesse usare questa implementazione di \func{alarm} per stabilire un
+timeout su una qualunque \textit{system call} bloccante.
+
+Un secondo esempio dei problemi a cui si può andare incontro è quello in cui
+si usa un segnale per notificare una qualche forma di evento. In genere quello
+che si fa in questo caso è impostare all'interno del gestore un opportuno flag
+da controllare nel corpo principale del programma, con un codice del tipo di
+quello riportato in fig.~\ref{fig:sig_event_wrong}.
+
+La logica del programma è quella di far impostare al gestore (\texttt{\small
+  14-19}) una \index{variabili!globali} variabile globale, preventivamente
+inizializzata nel programma principale, ad un diverso valore. In questo modo
+dal corpo principale del programma si potrà determinare, osservandone il
+contenuto di detta variabile, l'occorrenza o meno del segnale, ed eseguire le
+azioni conseguenti (\texttt{\small 6-11}) relative.
 
 \begin{figure}[!htbp]
   \footnotesize\centering
@@ -1619,16 +1857,19 @@ prendere le relative azioni conseguenti (\texttt{\small 6-11}).
 
 Questo è il tipico esempio di caso, già citato in
 sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition}
-\textit{race condition}; infatti, in una situazione in cui un segnale è già
-arrivato (e \var{flag} è già ad 1) se un altro segnale arriva immediatamente
-dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima della
-cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà perduta.
+\textit{race condition}. Infatti, in una situazione in cui un segnale è già
+arrivato (e quindi \var{flag} è già stata impostata ad 1 nel gestre) se un
+altro segnale arriva immediatamente dopo l'esecuzione del controllo
+(\texttt{\small 6}) ma prima della cancellazione di \var{flag} fatta subito
+dopo (\texttt{\small 7}), la sua occorrenza sarà perduta.
 
-Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono
-delle funzioni più sofisticate di quelle finora illustrate, queste hanno la
-loro origine nella semplice interfaccia dei primi sistemi Unix, ma con esse
-non è possibile gestire in maniera adeguata di tutti i possibili aspetti con
-cui un processo deve reagire alla ricezione di un segnale.
+Questi esempi ci mostrano come per poter eseguire una gestione effettiva dei
+segnali occorrono delle funzioni più sofisticate di quelle finora
+illustrate. La fuzione \func{signal} infatti ha la sua origine nella
+interfaccia alquanto primitiva che venne adottata nei primi sistemi Unix, ma
+con questa funzione è sostanzilmente impossibile gestire in maniera adeguata
+di tutti i possibili aspetti con cui un processo deve reagire alla ricezione
+di un segnale.
 
 
 
@@ -1641,6 +1882,7 @@ Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali
 originarie, nate con la semantica inaffidabile, hanno dei limiti non
 superabili; in particolare non è prevista nessuna funzione che permetta di
 gestire il blocco dei segnali o di verificare lo stato dei segnali pendenti.
+
 Per questo motivo lo standard POSIX.1, insieme alla nuova semantica dei
 segnali ha introdotto una interfaccia di gestione completamente nuova, che
 permette di ottenere un controllo molto più dettagliato. In particolare lo
@@ -1649,55 +1891,108 @@ rappresentare un \textsl{insieme di segnali} (un \textit{signal set}, come
 viene usualmente chiamato), tale tipo di dato viene usato per gestire il
 blocco dei segnali.
 
-In genere un \textsl{insieme di segnali} è rappresentato da un intero di
-dimensione opportuna, di solito pari al numero di bit dell'architettura della
-macchina,\footnote{nel caso dei PC questo comporta un massimo di 32 segnali
-  distinti: dato che in Linux questi sono sufficienti non c'è necessità di
-  nessuna struttura più complicata.} ciascun bit del quale è associato ad uno
-specifico segnale; in questo modo è di solito possibile implementare le
-operazioni direttamente con istruzioni elementari del processore. Lo standard
-POSIX.1 definisce cinque funzioni per la manipolazione degli insiemi di
-segnali: \funcd{sigemptyset}, \funcd{sigfillset}, \funcd{sigaddset},
-\funcd{sigdelset} e \funcd{sigismember}, i cui prototipi sono:
-\begin{functions}
-  \headdecl{signal.h} 
-  
-  \funcdecl{int sigemptyset(sigset\_t *set)} Inizializza un insieme di segnali
-  vuoto (in cui non c'è nessun segnale).
-  \funcdecl{int sigfillset(sigset\_t *set)} Inizializza un insieme di segnali
-  pieno (in cui ci sono tutti i segnali).
-  
-  \funcdecl{int sigaddset(sigset\_t *set, int signum)} Aggiunge il segnale
-  \param{signum} all'insieme di segnali \param{set}.
+Inizialmente un \textsl{insieme di segnali} veniva rappresentato da un intero
+di dimensione opportuna, di solito pari al numero di bit dell'architettura
+della macchina, ciascun bit del quale era associato ad uno specifico
+segnale. Nel caso di architetture a 32 bit questo comporta un massimo di 32
+segnali distinti e dato che a lungo questi sono stati sufficienti non c'era
+necessità di nessuna struttura più complicata, in questo modo era possibile
+implementare le operazioni direttamente con istruzioni elementari del
+processore. 
+
+Oggi questo non è più vero, in particolare con l'introduzione dei segnali
+\textit{real-rime} (che vedremo in sez.~\ref{sec:sig_real_time}).  Dato che in
+generale non si può fare conto sulle caratteristiche di una implementazione,
+perché non è detto che si disponga di un numero di bit sufficienti per mettere
+tutti i segnali in un intero, o perché in \type{sigset\_t} possono essere
+immagazzinate ulteriori informazioni, tutte le operazioni devono essere
+effettuate tramite le opportune funzioni di libreria che si curano di
+mascherare i dettagli di basso livello.
+
+Lo standard POSIX.1 definisce cinque funzioni per la manipolazione degli
+insiemi di segnali. Le prime quattro, che consentono di manipolare i contenuti
+di un \textit{signal set}, sono \funcd{sigemptyset}, \funcd{sigfillset},
+\funcd{sigaddset} e \funcd{sigdelset}; i rispettivi prototipi sono:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigemptyset(sigset\_t *set)}
+\fdesc{Inizializza un insieme di segnali vuoto.}
+\fdecl{int sigfillset(sigset\_t *set)}
+\fdesc{Inizializza un insieme di segnali pieno.}
+\fdecl{int sigaddset(sigset\_t *set, int signum)}
+\fdesc{Aggiunge un segnale ad un insieme di segnali.}
+\fdecl{int sigdelset(sigset\_t *set, int signum)}
+\fdesc{Rimuove un segnale da un insieme di segnali.}
+}
 
-  \funcdecl{int sigdelset(sigset\_t *set, int signum)} Toglie il segnale
-  \param{signum} dall'insieme di segnali \param{set}.
-  
-  \funcdecl{int sigismember(const sigset\_t *set, int signum)} Controlla se il
-  segnale \param{signum} è nell'insieme di segnali \param{set}.
-  
-  \bodydesc{Le prime quattro funzioni ritornano 0 in caso di successo, mentre
-    \func{sigismember} ritorna 1 se \param{signum} è in \param{set} e 0
-    altrimenti. In caso di errore tutte ritornano $-1$, con \var{errno}
-    impostata a \errval{EINVAL} (il solo errore possibile è che \param{signum}
-    non sia un segnale valido).}
-\end{functions}
+{Le funzioni ritornano $0$ in caso di successo, e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà il valore:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{signum} non è un segnale valido.
+  \end{errlist}
+}
+\end{funcproto}
+
+Le prime due funzioni inizializzano l'insieme di segnali indicato
+dall'argomento \param{set} rispettivamente ad un contenuto vuoto (in cui cioè
+non c'è nessun segnale) e pieno (in cui cioè ci sono tutti i segnali). Le
+altre due funzioni consentono di inserire o rimuovere uno specifico segnale
+indicato con l'argomento \param{signum} in un insieme. 
+
+A queste funzioni si aggiunge l'ulteriore \funcd{sigismember}, che consente di
+verificare la presenza di un segnale in un insieme, il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigismember(const sigset\_t *set, int signum)}
+\fdesc{Controlla se un segnale è in un insieme di segnali.}
+}
+
+{La funzione ritorna $1$ il segnale è nell'insieme e $0$ altrimenti, e $-1$
+  per un errore, nel qual caso \var{errno} assumerà il valore \errval{EINVAL}
+  se si è specificato un puntatore \var{NULL}.}
+\end{funcproto}
+
+La \acr{glibc} prevede inoltre altre funzioni non standardizzate, accessibili
+definendo la macro \macro{\_GNU\_SOURCE}. La prima di queste è
+\funcd{sigisemptyset}, che consente di verificare un insieme è vuoto, il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigisemptyset(sigset\_t *set)}
+\fdesc{Controlla se un insieme di segnali è vuoto.}
+}
+
+{La funzione ritorna $1$ l'insieme è vuoto e $0$ altrimenti, non sono previste
+  condizioni di errore.}
+\end{funcproto}
+
+Alla precedente si aggiungono altre due funzioni consentono di effettuare
+delle operazioni logiche con gli insiemi di segnali, esse sono
+\funcd{sigorset} e \funcd{sigandset}, ed i rispettivi prototipi sono:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{sigorset(sigset\_t *dest, sigset\_t *left, sigset\_t *right)}
+\fdesc{Crea l'unione di due insieme di segnali.}
+\fdecl{sigandset(sigset\_t *dest, sigset\_t *left, sigset\_t *right)}
+\fdesc{Crea l'intersezione di due insieme di segnali.} 
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà il valore \errcode{EINVAL}.}
+\end{funcproto}
 
-Dato che in generale non si può fare conto sulle caratteristiche di una
-implementazione (non è detto che si disponga di un numero di bit sufficienti
-per mettere tutti i segnali in un intero, o in \type{sigset\_t} possono essere
-immagazzinate ulteriori informazioni) tutte le operazioni devono essere
-comunque eseguite attraverso queste funzioni.
 
 In genere si usa un insieme di segnali per specificare quali segnali si vuole
 bloccare, o per riottenere dalle varie funzioni di gestione la maschera dei
-segnali attivi (vedi sez.~\ref{sec:sig_sigmask}). Essi possono essere definiti
-in due diverse maniere, aggiungendo i segnali voluti ad un insieme vuoto
-ottenuto con \func{sigemptyset} o togliendo quelli che non servono da un
-insieme completo ottenuto con \func{sigfillset}. Infine \func{sigismember}
-permette di verificare la presenza di uno specifico segnale in un
-insieme.
+segnali attivi (vedi sez.~\ref{sec:sig_sigmask}). La modalità più comune, che
+è anche quella più portabile, prevede che possano essere definiti aggiungendo
+i segnali voluti ad un insieme vuoto ottenuto con \func{sigemptyset} o
+togliendo quelli che non servono da un insieme completo ottenuto con
+\func{sigfillset}.
 
 \itindend{signal~set} 
 
@@ -1710,40 +2005,49 @@ relativi all'uso di \func{signal}. Per ovviare a tutto questo lo standard
 POSIX.1 ha ridefinito completamente l'interfaccia per la gestione dei segnali,
 rendendola molto più flessibile e robusta, anche se leggermente più complessa.
 
-La funzione principale dell'interfaccia POSIX.1 per i segnali è
-\funcd{sigaction}. Essa ha sostanzialmente lo stesso uso di \func{signal},
-permette cioè di specificare le modalità con cui un segnale può essere gestito
-da un processo. Il suo prototipo è:
-\begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
-    *act, struct sigaction *oldact)} 
-  
-  Installa una nuova azione per il segnale \param{signum}.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+La funzione di sistema principale prevista dall'interfaccia POSIX.1 per i
+segnali è \funcd{sigaction}. Essa ha sostanzialmente lo stesso uso di
+\func{signal}, permette cioè di specificare le modalità con cui un segnale può
+essere gestito da un processo. Il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigaction(int signum, const struct sigaction *act, struct sigaction
+  *oldact)}  
+\fdesc{Installa una nuova azione pr un segnale.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è
     cercato di installare il gestore per \signal{SIGKILL} o
     \signal{SIGSTOP}.
   \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
-  \end{errlist}}
-\end{prototype}
+  \end{errlist}
+}
+\end{funcproto}
 
 La funzione serve ad installare una nuova \textsl{azione} per il segnale
-\param{signum}; si parla di \textsl{azione} e non di \textsl{gestore}
-come nel caso di \func{signal}, in quanto la funzione consente di specificare
-le varie caratteristiche della risposta al segnale, non solo la funzione che
-verrà eseguita alla sua occorrenza.  Per questo lo standard raccomanda di
-usare sempre questa funzione al posto di \func{signal} (che in genere viene
-definita tramite essa), in quanto permette un controllo completo su tutti gli
-aspetti della gestione di un segnale, sia pure al prezzo di una maggiore
-complessità d'uso.
+indicato dall'argomento \param{signum}. Si parla di \textsl{azione} e non di
+\textsl{gestore} come nel caso di \func{signal}, in quanto la funzione
+consente di specificare le varie caratteristiche della risposta al segnale,
+non solo la funzione che verrà eseguita alla sua occorrenza.  
+
+Per questo motivo lo standard POSIX.1 raccomanda di usare sempre questa
+funzione al posto della precedente \func{signal}, che in genere viene
+ridefinita in termini di \func{sigaction}, in quanto la nuova interfaccia
+permette un controllo completo su tutti gli aspetti della gestione di un
+segnale, sia pure al prezzo di una maggiore complessità d'uso.
 
 Se il puntatore \param{act} non è nullo, la funzione installa la nuova azione
 da esso specificata, se \param{oldact} non è nullo il valore dell'azione
 corrente viene restituito indietro.  Questo permette (specificando \param{act}
 nullo e \param{oldact} non nullo) di superare uno dei limiti di \func{signal},
-che non consente di ottenere l'azione corrente senza installarne una nuova.
+che non consente di ottenere l'azione corrente senza installarne una nuova. Se
+sia \param{act} che \param{oldact} la funzione può essere utilizzata per
+verificare, se da luogo ad un errore, se il segnale indicato è valido per la
+piattaforma che si sta usando.
 
 Entrambi i puntatori fanno riferimento alla struttura \struct{sigaction},
 tramite la quale si specificano tutte le caratteristiche dell'azione associata
@@ -1754,7 +2058,7 @@ più usato.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/sigaction.h}
   \end{minipage} 
   \normalsize 
@@ -1774,14 +2078,14 @@ L'uso di questo campo permette ad esempio di risolvere il problema residuo
 dell'implementazione di \code{sleep} mostrata in
 fig.~\ref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
 allarme avesse interrotto un altro gestore questo non sarebbe stato eseguito
-correttamente; la cosa poteva essere prevenuta installando gli altri gestori
-usando \var{sa\_mask} per bloccare \signal{SIGALRM} durante la loro esecuzione.
-Il valore di \var{sa\_flag} permette di specificare vari aspetti del
-comportamento di \func{sigaction}, e della reazione del processo ai vari
+correttamente, la cosa poteva essere prevenuta installando gli altri gestori
+usando \var{sa\_mask} per bloccare \signal{SIGALRM} durante la loro
+esecuzione.  Il valore di \var{sa\_flag} permette di specificare vari aspetti
+del comportamento di \func{sigaction}, e della reazione del processo ai vari
 segnali; i valori possibili ed il relativo significato sono riportati in
 tab.~\ref{tab:sig_sa_flag}.
 
-\begin{table}[htb]
+\begin{table}[!htb]
   \footnotesize
   \centering
   \begin{tabular}[c]{|l|p{8cm}|}
@@ -1793,41 +2097,47 @@ tab.~\ref{tab:sig_sa_flag}.
                            essere notificato quando il processo figlio viene
                            fermato da uno dei segnali \signal{SIGSTOP},
                            \signal{SIGTSTP}, \signal{SIGTTIN} o 
-                           \signal{SIGTTOU}.\\
-    \const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore 
-                           predefinito una volta che il gestore è stato
-                           lanciato, riproduce cioè il comportamento della
-                           semantica inaffidabile.\\  
-    \const{SA\_ONESHOT}  & Nome obsoleto, sinonimo non standard di
-                           \const{SA\_RESETHAND}; da evitare.\\ 
+                           \signal{SIGTTOU}, questo flag ha significato solo
+                           quando si imposta un gestore per \signal{SIGCHLD}.\\
+    \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} e si richiede di
+                           ignorare il segnale con \const{SIG\_IGN} allora i
+                           processi figli non diventano \itindex{zombie}
+                           \textit{zombie} quando terminano; questa
+                           funzionalità è stata introdotta nel kernel 2.6 e va
+                           a modificare il comportamento di \func{waitpid}
+                           come illustrato in sez.~\ref{sec:proc_wait}, se si
+                           installa un gestore con questo flag attivo il
+                           segnale \signal{SIGCHLD} viene comunque generato.\\ 
+    \const{SA\_NODEFER}  & Evita che il segnale corrente sia bloccato durante
+                           l'esecuzione del gestore.\\
+    \const{SA\_NOMASK}   & Nome obsoleto e sinonimo non standard di
+                           \const{SA\_NODEFER}, non deve essere più
+                           utilizzato.\\ 
+    \const{SA\_ONESHOT}  & Nome obsoleto e sinonimo non standard di
+                           \const{SA\_RESETHAND}, non deve essere più
+                           utilizzato.\\ 
     \const{SA\_ONSTACK}  & Stabilisce l'uso di uno \itindex{stack} 
                            \textit{stack} alternativo per l'esecuzione del
                            gestore (vedi
                            sez.~\ref{sec:sig_specific_features}).\\  
+    \const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore 
+                           predefinito una volta che il gestore è stato
+                           lanciato, riproduce cioè il comportamento della
+                           semantica inaffidabile.\\  
     \const{SA\_RESTART}  & Riavvia automaticamente le \textit{slow system
                            call} quando vengono interrotte dal suddetto
-                           segnale; riproduce cioè il comportamento standard
+                           segnale, riproduce cioè il comportamento standard
                            di BSD.\index{system~call~lente}\\ 
-    \const{SA\_NODEFER}  & Evita che il segnale corrente sia bloccato durante
-                           l'esecuzione del gestore.\\
-    \const{SA\_NOMASK}   & Nome obsoleto, sinonimo non standard di
-                           \const{SA\_NODEFER}.\\ 
     \const{SA\_SIGINFO}  & Deve essere specificato quando si vuole usare un
                            gestore in forma estesa usando
                            \var{sa\_sigaction} al posto di
                            \var{sa\_handler}.\\
-    \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} allora i processi
-                           figli non diventano \itindex{zombie}
-                           \textit{zombie} quando terminano.\footnotemark \\ 
     \hline
   \end{tabular}
   \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.}
   \label{tab:sig_sa_flag}
 \end{table}
 
-\footnotetext{questa funzionalità è stata introdotta nel kernel 2.6 e va a
-  modificare il comportamento di \func{waitpid}.}
-
 Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette
 di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista
   dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x
@@ -1836,13 +2146,13 @@ di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista
   informazioni addizionali usando \var{sa\_handler} con un secondo parametro
   addizionale di tipo \var{sigcontext}, che adesso è deprecato.}  da
 specificare, a seconda dell'uso o meno del flag \const{SA\_SIGINFO},
-rispettivamente attraverso i campi \var{sa\_sigaction} o
-\var{sa\_handler},\footnote{i due campi devono essere usati in maniera
-  alternativa, in certe implementazioni questi campi vengono addirittura
-  definiti come \direct{union}.}  Quest'ultima è quella classica usata anche con
-\func{signal}, mentre la prima permette di usare un gestore più complesso, in
-grado di ricevere informazioni più dettagliate dal sistema, attraverso la
-struttura \struct{siginfo\_t}, riportata in fig.~\ref{fig:sig_siginfo_t}.
+rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler}.
+Quest'ultima è quella classica usata anche con \func{signal}, mentre la prima
+permette di usare un gestore più complesso, in grado di ricevere informazioni
+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}.
 
 Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile
 accedere alle informazioni restituite attraverso il puntatore a questa
@@ -1854,7 +2164,7 @@ causato l'emissione del segnale.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.9\textwidth}
     \includestruct{listati/siginfo_t.h}
   \end{minipage} 
   \normalsize 
@@ -1887,22 +2197,23 @@ altre informazioni specifiche.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{SI\_USER}   & generato da \func{kill} o \func{raise}.\\
-    \const{SI\_KERNEL} & inviato dal kernel.\\
-    \const{SI\_QUEUE}  & inviato con \func{sigqueue} (vedi
+    \const{SI\_USER}   & Generato da \func{kill} o \func{raise} o affini.\\
+    \const{SI\_KERNEL} & Inviato direttamente dal kernel.\\
+    \const{SI\_QUEUE}  & Inviato con \func{sigqueue} (vedi
                          sez.~\ref{sec:sig_real_time}).\\ 
-    \const{SI\_TIMER}  & scadenza di un POSIX timer 
-                         (vedi sez.~\ref{sec:sig_timer_adv}).\\
-    \const{SI\_MESGQ}  & inviato al cambiamento di stato di una coda di
-                         messaggi POSIX (vedi
-                         sez.~\ref{sec:ipc_posix_mq}).\footnotemark\\ 
-    \const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi
-                         sez.~\ref{sec:file_asyncronous_access}) è stata
+    \const{SI\_TIMER}  & Scadenza di un\itindex{POSIX~Timer~API} \textit{POSIX
+                          timer} (vedi sez.~\ref{sec:sig_timer_adv}).\\
+    \const{SI\_MESGQ}  & Inviato al cambiamento di stato di una coda di
+                         messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}),
+                         introdotto con il kernel 2.6.6.\\ 
+    \const{SI\_ASYNCIO}& Una operazione di I/O asincrono (vedi
+                         sez.~\ref{sec:file_asyncronous_io}) è stata
                          completata.\\
-    \const{SI\_SIGIO}  & segnale di \signal{SIGIO} da una coda (vedi
+    \const{SI\_SIGIO}  & Segnale di \signal{SIGIO} da una coda (vedi
                          sez.~\ref{sec:file_asyncronous_operation}).\\ 
-    \const{SI\_TKILL}  & inviato da \func{tkill} o \func{tgkill} (vedi
-                         sez.~\ref{cha:threads_xxx}).\footnotemark\\ 
+    \const{SI\_TKILL}  & Inviato da \func{tkill} o \func{tgkill} (vedi
+                         sez.~\ref{cha:threads_xxx}), introdotto con il kernel
+                         2.4.19.\\ 
     \hline
   \end{tabular}
   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
@@ -1910,19 +2221,18 @@ altre informazioni specifiche.
   \label{tab:sig_si_code_generic}
 \end{table}
 
-\footnotetext[24]{introdotto con il kernel 2.6.6.}
-\footnotetext{introdotto con il kernel 2.4.19.}
 
 In questo caso il valore del campo \var{si\_code} deve essere verificato nei
-confronti delle diverse costanti previste per ciascuno di detti
-segnali;\footnote{dato che si tratta di una costante, e non di una maschera
-  binaria, i valori numerici vengono riutilizzati e ciascuno di essi avrà un
-  significato diverso a seconda del segnale a cui è associato.} l'elenco
-dettagliato dei nomi di queste costanti è riportato nelle diverse sezioni di
-tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella sequenza in
-cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome
-  indica comunque in maniera diretta il segnale a cui le costanti fanno
-  riferimento.}
+confronti delle diverse costanti previste per ciascuno di detti segnali; dato
+che si tratta di costanti, e non di una maschera binaria, i valori numerici
+vengono riutilizzati e ciascuno di essi avrà un significato diverso a seconda
+del segnale a cui è associato. 
+
+L'elenco dettagliato dei nomi di queste costanti è riportato nelle diverse
+sezioni di tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella
+sequenza in cui si sono appena citati i rispettivi segnali, il prefisso del
+nome indica comunque in maniera diretta il segnale a cui le costanti fanno
+riferimento.
 
 \begin{table}[!htb]
   \footnotesize
@@ -1932,47 +2242,47 @@ cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{ILL\_ILLOPC}  & codice di operazione illegale.\\
-    \const{ILL\_ILLOPN}  & operando illegale.\\
-    \const{ILL\_ILLADR}  & modo di indirizzamento illegale.\\
-    \const{ILL\_ILLTRP}  & trappola di processore illegale.\\
-    \const{ILL\_PRVOPC}  & codice di operazione privilegiato.\\
-    \const{ILL\_PRVREG}  & registro privilegiato.\\
-    \const{ILL\_COPROC}  & errore del coprocessore.\\
-    \const{ILL\_BADSTK}  & errore nello stack interno.\\
+    \const{ILL\_ILLOPC}  & Codice di operazione illegale.\\
+    \const{ILL\_ILLOPN}  & Operando illegale.\\
+    \const{ILL\_ILLADR}  & Modo di indirizzamento illegale.\\
+    \const{ILL\_ILLTRP}  & Trappola di processore illegale.\\
+    \const{ILL\_PRVOPC}  & Codice di operazione privilegiato.\\
+    \const{ILL\_PRVREG}  & Registro privilegiato.\\
+    \const{ILL\_COPROC}  & Errore del coprocessore.\\
+    \const{ILL\_BADSTK}  & Errore nello stack interno.\\
     \hline
-    \const{FPE\_INTDIV}  & divisione per zero intera.\\
-    \const{FPE\_INTOVF}  & overflow intero.\\
-    \const{FPE\_FLTDIV}  & divisione per zero in virgola mobile.\\
-    \const{FPE\_FLTOVF}  & overflow in virgola mobile.\\
-    \const{FPE\_FLTUND}  & underflow in virgola mobile.\\
-    \const{FPE\_FLTRES}  & risultato in virgola mobile non esatto.\\
-    \const{FPE\_FLTINV}  & operazione in virgola mobile non valida.\\
-    \const{FPE\_FLTSUB}  & mantissa? fuori intervallo.\\
+    \const{FPE\_INTDIV}  & Divisione per zero intera.\\
+    \const{FPE\_INTOVF}  & Overflow intero.\\
+    \const{FPE\_FLTDIV}  & Divisione per zero in virgola mobile.\\
+    \const{FPE\_FLTOVF}  & Overflow in virgola mobile.\\
+    \const{FPE\_FLTUND}  & Underflow in virgola mobile.\\
+    \const{FPE\_FLTRES}  & Risultato in virgola mobile non esatto.\\
+    \const{FPE\_FLTINV}  & Operazione in virgola mobile non valida.\\
+    \const{FPE\_FLTSUB}  & Mantissa? fuori intervallo.\\
     \hline
-    \const{SEGV\_MAPERR} & indirizzo non mappato.\\
-    \const{SEGV\_ACCERR} & permessi non validi per l'indirizzo.\\
+    \const{SEGV\_MAPERR} & Indirizzo non mappato.\\
+    \const{SEGV\_ACCERR} & Permessi non validi per l'indirizzo.\\
     \hline
-    \const{BUS\_ADRALN}  & allineamento dell'indirizzo non valido.\\
-    \const{BUS\_ADRERR}  & indirizzo fisico inesistente.\\
-    \const{BUS\_OBJERR}  & errore hardware sull'indirizzo.\\
+    \const{BUS\_ADRALN}  & Allineamento dell'indirizzo non valido.\\
+    \const{BUS\_ADRERR}  & Indirizzo fisico inesistente.\\
+    \const{BUS\_OBJERR}  & Errore hardware sull'indirizzo.\\
     \hline
-    \const{TRAP\_BRKPT}  & breakpoint sul processo.\\
-    \const{TRAP\_TRACE}  & trappola di tracciamento del processo.\\
+    \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.\\
+    \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.\\
     \hline
-    \const{POLL\_IN}   & disponibili dati in ingresso.\\
-    \const{POLL\_OUT}  & spazio disponibile sul buffer di uscita.\\
-    \const{POLL\_MSG}  & disponibili messaggi in ingresso.\\
-    \const{POLL\_ERR}  & errore di I/O.\\
-    \const{POLL\_PRI}  & disponibili dati di alta priorità in ingresso.\\
-    \const{POLL\_HUP}  & il dispositivo è stato disconnesso.\\
+    \const{POLL\_IN}   & Disponibili dati in ingresso.\\
+    \const{POLL\_OUT}  & Spazio disponibile sul buffer di uscita.\\
+    \const{POLL\_MSG}  & Disponibili messaggi in ingresso.\\
+    \const{POLL\_ERR}  & Errore di I/O.\\
+    \const{POLL\_PRI}  & Disponibili dati di alta priorità in ingresso.\\
+    \const{POLL\_HUP}  & Il dispositivo è stato disconnesso.\\
     \hline
   \end{tabular}
   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
@@ -1982,21 +2292,23 @@ cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome
   \label{tab:sig_si_code_special}
 \end{table}
 
-Il resto della struttura \struct{siginfo\_t} è definito come \direct{union} ed i
-valori eventualmente presenti dipendono dal segnale, 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 emesso il segnale, \signal{SIGCHLD} avvalora anche i campi
-\var{si\_status}, \var{si\_utime} e \var{si\_stime} che indicano
-rispettivamente lo stato di uscita, l'\textit{user time} e il \textit{system
-  time} (vedi sez.~\ref{sec:sys_cpu_times}) usati dal processo;
-\signal{SIGILL}, \signal{SIGFPE}, \signal{SIGSEGV} e \signal{SIGBUS} avvalorano
-\var{si\_addr} con l'indirizzo in cui è avvenuto l'errore, \signal{SIGIO} (vedi
+Il resto della struttura \struct{siginfo\_t} è definito come una
+\direct{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
+emesso il segnale, \signal{SIGCHLD} avvalora anche i campi \var{si\_status},
+\var{si\_utime} e \var{si\_stime} che indicano rispettivamente lo stato di
+uscita, l'\textit{user time} e il \textit{system time} (vedi
+sez.~\ref{sec:sys_cpu_times}) usati dal processo; \signal{SIGILL},
+\signal{SIGFPE}, \signal{SIGSEGV} e \signal{SIGBUS} avvalorano \var{si\_addr}
+con l'indirizzo in cui è avvenuto l'errore, \signal{SIGIO} (vedi
 sez.~\ref{sec:file_asyncronous_io}) avvalora \var{si\_fd} con il numero del
 file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti
 (vedi sez.~\ref{sec:TCP_urgent_data}) su un socket, il segnale inviato alla
-scadenza di un timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}) avvalora i
-campi \var{si\_timerid} e \var{si\_overrun}.
+scadenza di un \itindex{POSIX~Timer~API} POSIX timer (vedi
+sez.~\ref{sec:sig_timer_adv}) avvalora i campi \var{si\_timerid} e
+\var{si\_overrun}.
 
 Benché sia possibile usare nello stesso programma sia \func{sigaction} che
 \func{signal} occorre molta attenzione, in quanto le due funzioni possono
@@ -2030,24 +2342,28 @@ Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata
 che abbia le stesse caratteristiche di \func{signal}, a definire attraverso
 \func{sigaction} una funzione equivalente \func{Signal}, il cui codice è
 riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si trova nel
-file \file{SigHand.c} nei sorgenti allegati).  Si noti come, essendo la
-funzione estremamente semplice, essa è definita come
-\direct{inline};\footnote{la direttiva \direct{inline} 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 le opportune ottimizzazioni) questa è una tecnica
-  usata per migliorare le prestazioni per le funzioni piccole ed usate di
-  frequente (in particolare nel kernel, dove in certi casi le ottimizzazioni
-  dal compilatore, tarate per l'uso in user space, non sono sempre adatte). In
-  tal caso infatti le istruzioni per creare un nuovo frame nello
-  \itindex{stack} \textit{stack} per chiamare la funzione costituirebbero una
-  parte rilevante del codice, appesantendo inutilmente il programma.
-  Originariamente questo comportamento veniva ottenuto con delle macro, ma
-  queste hanno tutta una serie di problemi di sintassi nel passaggio degli
-  argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono
-  essere evitati.} per semplificare ulteriormente la definizione si è poi
-definito un apposito tipo \texttt{SigFunc}.
+file \file{SigHand.c} nei sorgenti allegati). Anche in questo caso, per
+semplificare la definizione si è poi definito un apposito tipo
+\texttt{SigFunc} per esprimere in forma più comprensibile la forma di un
+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
+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
+le opportune ottimizzazioni) questa è una tecnica usata per migliorare le
+prestazioni per le funzioni piccole ed usate di frequente (in particolare nel
+kernel, dove in certi casi le ottimizzazioni dal compilatore, tarate per l'uso
+in user space, non sono sempre adatte).
+
+In tal caso infatti le istruzioni per creare un nuovo frame nello
+\itindex{stack} \textit{stack} per chiamare la funzione costituirebbero una
+parte rilevante del codice, appesantendo inutilmente il programma.
+Originariamente questo comportamento veniva ottenuto con delle macro, ma
+queste hanno tutta una serie di problemi di sintassi nel passaggio degli
+argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono essere
+evitati.
 
 
 
@@ -2055,48 +2371,61 @@ definito un apposito tipo \texttt{SigFunc}.
   \textit{signal mask}}
 \label{sec:sig_sigmask}
 
-\itindbeg{signal~mask}
+\index{maschera dei segnali|(}
 Come spiegato in sez.~\ref{sec:sig_semantics} tutti i moderni sistemi unix-like
 permettono di bloccare temporaneamente (o di eliminare completamente,
 impostando \const{SIG\_IGN} come azione) la consegna dei segnali ad un
 processo. Questo è fatto specificando la cosiddetta \textsl{maschera dei
   segnali} (o \textit{signal mask}) del processo\footnote{nel caso di Linux
   essa è mantenuta dal campo \var{blocked} della \struct{task\_struct} del
-  processo.} cioè l'insieme dei segnali la cui consegna è bloccata. Abbiamo
-accennato in sez.~\ref{sec:proc_fork} che la \textit{signal mask} viene
-ereditata dal padre alla creazione di un processo figlio, e abbiamo visto al
-paragrafo precedente che essa può essere modificata, durante l'esecuzione di
-un gestore, attraverso l'uso dal campo \var{sa\_mask} di \struct{sigaction}.
+  processo.} cioè l'insieme dei segnali la cui consegna è bloccata. 
+
+Abbiamo accennato in sez.~\ref{sec:proc_fork} che la maschera dei segnali
+viene ereditata dal padre alla creazione di un processo figlio, e abbiamo
+visto al paragrafo precedente che essa può essere modificata durante
+l'esecuzione di un gestore ed automaticamente ripristinata quando questo
+ritorna, attraverso l'uso dal campo \var{sa\_mask} di \struct{sigaction}.
 
 Uno dei problemi evidenziatisi con l'esempio di fig.~\ref{fig:sig_event_wrong}
-è che in molti casi è necessario proteggere delle sezioni di codice (nel caso
-in questione la sezione fra il controllo e la eventuale cancellazione del flag
-che testimoniava l'avvenuta occorrenza del segnale) in modo da essere sicuri
-che essi siano eseguite senza interruzioni.
-
-Le operazioni più semplici, come l'assegnazione o il controllo di una
-variabile (per essere sicuri si può usare il tipo \type{sig\_atomic\_t}) di
-norma sono atomiche; quando si devono eseguire operazioni più complesse si può
-invece usare la funzione \funcd{sigprocmask} che permette di bloccare uno o
-più segnali; il suo prototipo è:
-\begin{prototype}{signal.h}
-{int sigprocmask(int how, const sigset\_t *set, sigset\_t *oldset)} 
-  
-  Cambia la \textsl{maschera dei segnali} del processo corrente.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+è che in molti casi è necessario proteggere delle sezioni di codice, in modo
+da essere sicuri che essi siano eseguite senza interruzioni da parte di un
+segnale.  Nel caso in questione si trattava della sezione di codice fra il
+controllo e la eventuale cancellazione del flag impostato dal gestore di un
+segnale che testimoniava l'avvenuta occorrenza dello stesso.
+
+Come illustrato in sez.~\ref{sec:proc_atom_oper} le operazioni più semplici,
+come l'assegnazione o il controllo di una variabile, di norma sono atomiche, e
+qualora si voglia essere sicuri si può usare il tipo \type{sig\_atomic\_t}. Ma
+quando si devono eseguire più operazioni su delle variabili (nell'esempio
+citato un controllo ed una assegnazione) o comunque eseguire una serie di
+istruzioni, l'atomicità non è più possibile.
+
+In questo caso, se si vuole essere sicuri di non poter essere interrotti da un
+segnale durante l'esecuzione di una sezione di codice, lo si può bloccare
+esplicitamente modificando la maschera dei segnali del processo con la
+funzione di sistema \funcd{sigprocmask}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigprocmask(int how, const sigset\_t *set, sigset\_t *oldset)}
+\fdesc{Imposta la maschera dei segnali del processo corrente.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
   \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
-  \end{errlist}}
-\end{prototype}
-
-La funzione usa l'insieme di segnali dato all'indirizzo \param{set} per
-modificare la maschera dei segnali del processo corrente. La modifica viene
-effettuata a seconda del valore dell'argomento \param{how}, secondo le modalità
-specificate in tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un valore
-non nullo per \param{oldset} la maschera dei segnali corrente viene salvata a
+  \end{errlist}
+}
+\end{funcproto}
+
+La funzione usa l'insieme di segnali posto all'indirizzo passanto
+nell'argomento \param{set} per modificare la maschera dei segnali del processo
+corrente. La modifica viene effettuata a seconda del valore
+dell'argomento \param{how}, secondo le modalità specificate in
+tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un valore non nullo
+per \param{oldset} la maschera dei segnali corrente viene salvata a
 quell'indirizzo.
 
 \begin{table}[htb]
@@ -2125,35 +2454,37 @@ In questo modo diventa possibile proteggere delle sezioni di codice bloccando
 l'insieme di segnali voluto per poi riabilitarli alla fine della
 \index{sezione~critica} sezione critica. La funzione permette di risolvere
 problemi come quelli mostrati in fig.~\ref{fig:sig_event_wrong}, proteggendo
-la sezione fra il controllo del flag e la sua cancellazione.
-
-La funzione può essere usata anche all'interno di un gestore, ad esempio
-per riabilitare la consegna del segnale che l'ha invocato, in questo caso però
-occorre ricordare che qualunque modifica alla maschera dei segnali viene
-perduta alla conclusione del terminatore. 
+la sezione fra il controllo del flag e la sua cancellazione.  La funzione può
+essere usata anche all'interno di un gestore, ad esempio per riabilitare la
+consegna del segnale che l'ha invocato, in questo caso però occorre ricordare
+che qualunque modifica alla maschera dei segnali viene perduta al ritorno
+dallo stesso.
 
 Benché con l'uso di \func{sigprocmask} si possano risolvere la maggior parte
 dei casi di \itindex{race~condition} \textit{race condition} restano aperte
-alcune possibilità legate all'uso di \func{pause}; il caso è simile a quello
+alcune possibilità legate all'uso di \func{pause}.  Il caso è simile a quello
 del problema illustrato nell'esempio di fig.~\ref{fig:sig_sleep_incomplete}, e
 cioè la possibilità che il processo riceva il segnale che si intende usare per
 uscire dallo stato di attesa invocato con \func{pause} immediatamente prima
 dell'esecuzione di quest'ultima. Per poter effettuare atomicamente la modifica
 della maschera dei segnali (di solito attivandone uno specifico) insieme alla
-sospensione del processo lo standard POSIX ha previsto la funzione
+sospensione del processo lo standard POSIX ha previsto la funzione di sistema
 \funcd{sigsuspend}, il cui prototipo è:
-\begin{prototype}{signal.h}
-{int sigsuspend(const sigset\_t *mask)} 
-  
-  Imposta la \textit{signal mask} specificata, mettendo in attesa il processo.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigsuspend(const sigset\_t *mask)} 
+\fdesc{Imposta la maschera dei segnali mettendo in attesa il processo.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
   \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
-  \end{errlist}}
-\end{prototype}
+  \end{errlist}
+}
+\end{funcproto}
 
 Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta
 l'esempio di implementazione di \code{sleep}. Abbiamo accennato in
@@ -2209,7 +2540,7 @@ riabilitarla immediatamente dopo, in questo modo si evita il
 \itindex{deadlock} deadlock dovuto all'arrivo del segnale prima
 dell'esecuzione di \func{sigsuspend}.
 
-\itindend{signal~mask}
+\index{maschera dei segnali|)}
 
 
 \subsection{Criteri di programmazione per i gestori dei segnali}
@@ -2263,7 +2594,7 @@ lista riportata in fig.~\ref{fig:sig_safe_functions}.
     \func{getsockname}, \func{getsockopt}, \func{getuid}, \func{kill},
     \func{link}, \func{listen}, \func{lseek}, \func{lstat}, \func{mkdir},
     \func{mkfifo}, \func{open}, \func{pathconf}, \func{pause}, \func{pipe},
-    \func{poll}, \func{posix\_trace\_event}, \func{pselect}, \func{raise},
+    \func{poll}, \funcm{posix\_trace\_event}, \func{pselect}, \func{raise},
     \func{read}, \func{readlink}, \func{recv}, \func{recvfrom},
     \func{recvmsg}, \func{rename}, \func{rmdir}, \func{select},
     \func{sem\_post}, \func{send}, \func{sendmsg}, \func{sendto},
@@ -2271,7 +2602,7 @@ lista riportata in fig.~\ref{fig:sig_safe_functions}.
     \func{setuid}, \func{shutdown}, \func{sigaction}, \func{sigaddset},
     \func{sigdelset}, \func{sigemptyset}, \func{sigfillset},
     \func{sigismember}, \func{signal}, \func{sigpause}, \func{sigpending},
-    \func{sigprocmask}, \func{sigqueue}, \func{sigset}, \func{sigsuspend},
+    \func{sigprocmask}, \func{sigqueue}, \funcm{sigset}, \func{sigsuspend},
     \func{sleep}, \func{socket}, \func{socketpair}, \func{stat},
     \func{symlink}, \func{sysconf}, \func{tcdrain}, \func{tcflow},
     \func{tcflush}, \func{tcgetattr}, \func{tcgetgrp}, \func{tcsendbreak},
@@ -2322,7 +2653,6 @@ un segnale.
 \section{Funzionalità avanzate}
 \label{sec:sig_advanced_signal}
 
-
 Tratteremo in questa ultima sezione alcune funzionalità avanzate relativa ai
 segnali ed in generale ai meccanismi di notifica, a partire dalla funzioni
 introdotte per la gestione dei cosiddetti ``\textsl{segnali real-time}'', alla
@@ -2441,14 +2771,15 @@ Questo è una \direct{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 indirizzo, se usata nella forma
 \var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
-vari meccanismi di notifica\footnote{un campo di tipo \struct{sigval\_t} è
+vari meccanismi di notifica\footnote{un campo di tipo \type{sigval\_t} è
   presente anche nella struttura \struct{sigevent} (definita in
   fig.~\ref{fig:struct_sigevent}) che viene usata dai meccanismi di notifica
-  come quelli per i timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}), l'I/O
-  asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi
-  POSIX (vedi sez.~\ref{sec:ipc_posix_mq}).} per restituire dati al gestore
-del segnale; in alcune definizioni essa viene identificata anche con
-l'abbreviazione \type{sigval\_t}.
+  come quelli per \itindex{POSIX~Timer~API} i timer POSIX (vedi
+  sez.~\ref{sec:sig_timer_adv}), l'I/O asincrono (vedi
+  sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi
+  sez.~\ref{sec:ipc_posix_mq}).} per restituire dati al gestore del segnale;
+in alcune definizioni essa viene identificata anche con l'abbreviazione
+\type{sigval\_t}.
 
 A causa delle loro caratteristiche, la funzione \func{kill} non è adatta ad
 inviare segnali \textit{real-time}, poiché non è in grado di fornire alcun
@@ -2600,6 +2931,9 @@ riceverlo fra due chiamate successive.
 \subsection{La gestione avanzata delle temporizzazioni}
 \label{sec:sig_timer_adv}
 
+% TODO: indicizzare i termini \itindex{POSIX~Timer~API} e HRT
+
+
 Sia le funzioni per la gestione dei tempi viste in
 sez.~\ref{sec:sys_cpu_times} che quelle per la gestione dei timer di
 sez.~\ref{sec:sig_alarm_abort} sono state a lungo limitate dalla risoluzione
@@ -2607,7 +2941,7 @@ massima dei tempi dell'orologio interno del kernel, che era quella ottenibile
 dal timer di sistema che governa lo \textit{scheduler},\footnote{e quindi
   limitate dalla frequenza dello stesso che si ricordi, come già illustrato in
   sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante
-  \texttt{HZ}.} i contatori usati per il calcolo dei tempo infatti erano
+  \texttt{HZ}.} i contatori usati per il calcolo dei tempi infatti erano
 basati sul numero di \itindex{jiffies} \textit{jiffies} che vengono
 incrementati ad ogni \textit{clock tick} del timer di sistema.\footnote{il che
   comportava anche, come accennato in sez.~\ref{sec:sig_alarm_abort} per
@@ -2630,11 +2964,11 @@ tempo da esse dedicato all'esecuzione di un processo.
 
 Per usare queste funzionalità ed ottenere risoluzioni temporali più accurate,
 occorre però un opportuno supporto da parte del kernel, ed i cosiddetti
-\textit{high resolution timer} che consentono di fare ciò sono stati
-introdotti nel kernel ufficiale solo a partire dalla versione
-2.6.21.\footnote{deve essere stata abilitata l'opzione di compilazione
-  \texttt{CONFIG\_HIGH\_RES\_TIMERS}, erano però disponibili anche in
-  precedenza come patch facenti parte dello sviluppo delle estensioni
+\itindex{High~Resolution~Timer~(HRT)} \textit{high resolution timer} che
+consentono di fare ciò sono stati introdotti nel kernel ufficiale solo a
+partire dalla versione 2.6.21.\footnote{deve essere stata abilitata l'opzione
+  di compilazione \texttt{CONFIG\_HIGH\_RES\_TIMERS}, erano però disponibili
+  anche in precedenza come patch facenti parte dello sviluppo delle estensioni
   \textit{real-time} del kernel, per cui alcune distribuzioni possono avere
   questo supporto anche con versioni precedenti del kernel.} Le funzioni
 definite dallo standard POSIX per gestire orologi ad alta definizione però
@@ -2708,16 +3042,16 @@ tab.~\ref{tab:sig_timer_clockid_types}.
 Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la
 macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale
 di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i
-programmi che le usano devono essere collegati con la libreria delle estensioni
-\textit{real-time} usando esplicitamente l'opzione \texttt{-lrt}. Si tenga
-presente inoltre che la disponibilità di queste funzionalità avanzate può
-essere controllato dalla definizione della macro \macro{\_POSIX\_TIMERS} ad un
-valore maggiore di 0, e che le ulteriori macro
+programmi che le usano devono essere collegati con la libreria delle
+estensioni \textit{real-time} usando esplicitamente l'opzione
+\texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste
+funzionalità avanzate può essere controllato dalla definizione della macro
+\macro{\_POSIX\_TIMERS} ad un valore maggiore di 0, e che le ulteriori macro
 \macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e
 \macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi
 di tipo \const{CLOCK\_MONOTONIC}, \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
 \const{CLOCK\_PROCESS\_CPUTIME\_ID}.\footnote{tutte queste macro sono definite
-  in \texttt{unistd.h}, che pertanto deve essere incluso per poterle
+  in \headfile{unistd.h}, che pertanto deve essere incluso per poterle
   controllarle.} Infine se il kernel ha il supporto per gli \textit{high
   resolution timer} un elenco degli orologi e dei timer può essere ottenuto
 tramite il file \procfile{/proc/timer\_list}.
@@ -2881,9 +3215,10 @@ l'orologio associato ad un \textit{thread} invece che a un processo, è
 }
 \end{functions}
 
-
 % TODO, dal 2.6.39 aggiunta clock_adjtime 
 
+% TODO manca clock_nanosleep, referenziata in sez.~\ref{sec:sig_gen_beha}
+
 Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile
 ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in
 sez.~\ref{sec:sig_alarm_abort} come l'interfaccia di \func{setitimer} derivata
@@ -2891,7 +3226,7 @@ da BSD presenti delle serie limitazioni,\footnote{in particolare la
   possibilità di perdere un segnale sotto carico.} tanto che nello standard
 POSIX.1-2008 questa viene marcata come obsoleta, e ne viene fortemente
 consigliata la sostituzione con nuova interfaccia definita dallo standard
-POSIX.1-2001 che va sotto il nome di \textit{Posix Timer API}. Questa
+POSIX.1-2001 che va sotto il nome di \textit{POSIX Timer API}. Questa
 interfaccia è stata introdotta a partire dal kernel 2.6, anche se il supporto
 di varie funzionalità è stato aggiunto solo in un secondo tempo.
 
@@ -2947,14 +3282,14 @@ meccanismo di notifica.
   \label{fig:struct_sigevent}
 \end{figure}
 
-La struttura \struct{sigevent} (accessibile includendo \texttt{time.h}) è
+La struttura \struct{sigevent} (accessibile includendo \headfile{time.h}) è
 riportata in fig.~\ref{fig:struct_sigevent};\footnote{la definizione effettiva
   dipende dall'implementazione, quella mostrata è la versione descritta nella
-  pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è il
-più importante essendo quello che indica le modalità della notifica, gli altri
-dipendono dal valore che si è specificato per \var{sigev\_notify}, si sono
-riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del meccanismo di
-notifica viene fatta impostando uno dei valori di
+  pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è
+il più importante essendo quello che indica le modalità della notifica, gli
+altri dipendono dal valore che si è specificato per \var{sigev\_notify}, si
+sono riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del
+meccanismo di notifica viene fatta impostando uno dei valori di
 tab.~\ref{tab:sigevent_sigev_notify} per \var{sigev\_notify}, e fornendo gli
 eventuali ulteriori argomenti necessari a secondo della scelta
 effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione
@@ -3082,28 +3417,28 @@ con una precisione fino al nanosecondo tramite una struttura \struct{timespec}
 (la cui definizione è riportata fig.~\ref{fig:sys_timespec_struct}). Il campo
 \var{it\_value} indica la prima scadenza dell'allarme. Di default, quando il
 valore di \param{flags} è nullo, questo valore viene considerato come un
-intervallo relativo al tempo corrente,\footnote{il primo allarme scatterà cioè
-  dopo il numero di secondi e nanosecondi indicati da questo campo.} se invece
-si usa per \param{flags} il valore \const{TIMER\_ABSTIME},\footnote{al momento
-  questo è l'unico valore valido per \param{flags}.} \var{it\_value} viene
-considerato come un valore assoluto rispetto al valore usato dall'orologio a
-cui è associato il timer.\footnote{quindi a seconda dei casi lo si potrà
-  indicare o come un tempo assoluto, quando si opera rispetto all'orologio di
-  sistema (nel qual caso il valore deve essere in secondi e nanosecondi dalla
-  \textit{epoch}) o come numero di secondi o nanosecondi rispetto alla
-  partenza di un orologio di CPU, quando si opera su uno di questi.}  Infine
-un valore nullo di \var{it\_value}\footnote{per nullo si intende con valori
-  nulli per entrambi i i campi \var{tv\_sec} e \var{tv\_nsec}.} può essere
-utilizzato, indipendentemente dal tipo di orologio utilizzato, per disarmare
-l'allarme.
+intervallo relativo al tempo corrente, il primo allarme scatterà cioè dopo il
+numero di secondi e nanosecondi indicati da questo campo. Se invece si usa
+per \param{flags} il valore \const{TIMER\_ABSTIME}, che al momento è l'unico
+valore valido per \param{flags}, allora \var{it\_value} viene considerato come
+un valore assoluto rispetto al valore usato dall'orologio a cui è associato il
+timer.\footnote{quindi a seconda dei casi lo si potrà indicare o come un tempo
+  assoluto, quando si opera rispetto all'orologio di sistema (nel qual caso il
+  valore deve essere in secondi e nanosecondi dalla \textit{epoch}) o come
+  numero di secondi o nanosecondi rispetto alla partenza di un orologio di
+  CPU, quando si opera su uno di questi.}  Infine un valore nullo di
+\var{it\_value}, dover per nullo si intende con valori nulli per entrambi i
+campi \var{tv\_sec} e \var{tv\_nsec}, può essere utilizzato, indipendentemente
+dal tipo di orologio utilizzato, per disarmare l'allarme.
 
 Il campo \var{it\_interval} di \struct{itimerspec} viene invece utilizzato per
-impostare un allarme periodico.  Se il suo valore è nullo (se cioè sono nulli
-tutti e due i valori di detta struttura \struct{timespec}) l'allarme scatterà
-una sola volta secondo quando indicato con \var{it\_value}, altrimenti il
-valore specificato verrà preso come l'estensione del periodo di ripetizione
-della generazione dell'allarme, che proseguirà indefinitamente fintanto che
-non si disarmi il timer.
+impostare un allarme periodico.  Se il suo valore è nullo, se cioè sono nulli
+tutti e due i due campi \var{tv\_sec} e \var{tv\_nsec} di detta struttura
+\struct{timespec}, l'allarme scatterà una sola volta secondo quando indicato
+con \var{it\_value}, altrimenti il valore specificato nella struttura verrà
+preso come l'estensione del periodo di ripetizione della generazione
+dell'allarme, che proseguirà indefinitamente fintanto che non si disarmi il
+timer.
 
 Se il timer era già stato armato la funzione sovrascrive la precedente
 impostazione, se invece si indica come prima scadenza un tempo già passato,
@@ -3262,7 +3597,7 @@ procedura:
 \end{enumerate*}
 
 In genere il primo passo viene effettuato allocando un'opportuna area di
-memoria con \code{malloc}; in \file{signal.h} sono definite due costanti,
+memoria con \code{malloc}; in \headfile{signal.h} sono definite due costanti,
 \const{SIGSTKSZ} e \const{MINSIGSTKSZ}, che possono essere utilizzate per
 allocare una quantità di spazio opportuna, in modo da evitare overflow. La
 prima delle due è la dimensione canonica per uno \itindex{stack}
@@ -3453,10 +3788,11 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a
 % LocalWords:  tick calendar The Epoch list getcpuclockid capability CAP getres
 % LocalWords:  ENOSYS pthread ENOENT NULL attribute itimerspec new old ABSTIME
 % LocalWords:  epoch multiplexing overrun res lpthread sec nsec curr one shot
-% LocalWords:  delete
+% LocalWords:  delete stopped gdb alpha mips emulation locking ppoll epoll PGID
 
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+% LocalWords:  pwait msgrcv msgsnd semop semtimedop runnable