Merge branch 'master' of ssh://gapil.gnulinux.it/srv/git/gapil
[gapil.git] / signal.tex
index 357526ddfc5762b439717ecf06438ff2b1c7ad95..40e84dc429a1d0d15917cb7b883b28df2f208d29 100644 (file)
@@ -1,6 +1,6 @@
 %% signal.tex
 %%
-%% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -115,28 +115,28 @@ gestore non verrebbe eseguita.
 Questa è la ragione per cui l'implementazione dei segnali secondo questa
 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}
-(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.
+sono sempre possibili delle \textit{race condition} (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 un apposito campo della
-\struct{task\_struct} del processo nella \itindex{process~table}
-\textit{process table} (si veda fig.~\ref{fig:proc_task_struct}).
+\struct{task\_struct} del processo nella \textit{process table} (si veda
+fig.~\ref{fig:proc_task_struct}).
 
 Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
 \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre
 per tutto il tempo che passa fra la generazione del segnale e la sua consegna
 esso è detto \textsl{pendente} (o \textit{pending}). In genere questa
-procedura viene effettuata dallo \itindex{scheduler} scheduler quando,
-riprendendo l'esecuzione del processo in questione, verifica la presenza del
-segnale nella \struct{task\_struct} e mette in esecuzione il gestore.
+procedura viene effettuata dallo \textit{scheduler} quando, riprendendo
+l'esecuzione del processo in questione, verifica la presenza del segnale nella
+\struct{task\_struct} e mette in esecuzione il gestore.
 
 In questa semantica un processo ha la possibilità di bloccare la consegna dei
 segnali, in questo caso, se l'azione per il suddetto segnale non è quella di
@@ -217,11 +217,10 @@ 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. 
+avviene non appena questo viene rimesso in esecuzione dallo \textit{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 un segnale \textsl{pendente} sarà subito notificato. Si
 tenga presente però che tradizionalmente i segnali \textsl{pendenti} non si
@@ -246,7 +245,6 @@ 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 intercettare il segnale, ed utilizzare il gestore specificato;
@@ -259,7 +257,7 @@ 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}.
+radice possibili \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
@@ -287,12 +285,12 @@ 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.
+\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 \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
@@ -323,9 +321,9 @@ Linux anche a seconda della architettura hardware e della versione del kernel.
 
 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}.
+tutte nella forma \texttt{SIG\textsl{nome}}, 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
@@ -342,14 +340,14 @@ esse sono definite nell'header di sistema \headfile{signal.h}.
     \signal{SIGILL}  &PA& C & Istruzione illecita.\\
     \signal{SIGTRAP} &S & C & Trappole per un Trace/breakpoint.\\
     \signal{SIGABRT} &PA& C & Segnale di abort da \func{abort}.\\
-    \signal{SIGIOT}  &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\
+    \signald{SIGIOT}  &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\
     \signal{SIGBUS}  &BS& C & Errore sul bus (bad memory access).\\
     \signal{SIGFPE}  &AP& C & Errore aritmetico.\\
     \signal{SIGKILL} &P & T& Segnale di terminazione forzata.\\
     \signal{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{SIGPIPE} &P & T & \textit{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.\\
@@ -365,7 +363,7 @@ esse sono definite nell'header di sistema \headfile{signal.h}.
     \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 profiling 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
@@ -374,7 +372,7 @@ esse sono definite nell'header di sistema \headfile{signal.h}.
     \signal{SIGSYS}  &VS& C & \textit{system call} sbagliata.\\
     \hline
     \signal{SIGSTKFLT}&?& T & Errore sullo stack del coprocessore (inusato).\\
-    \signal{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di
+    \signald{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di
                                \signal{SIGSYS}).\\
     \hline
     \signal{SIGCLD}  &V & I & Sinonimo di \signal{SIGCHLD}.\\
@@ -394,8 +392,7 @@ 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}.
+esistono sull'architettura PC, ma sono definiti su altre.
 
 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 è
@@ -408,7 +405,14 @@ 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]
+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]
   \footnotesize
   \centering
   \begin{tabular}[c]{|c|l|}
@@ -429,13 +433,13 @@ POSIX.1-2001.
   \label{tab:sig_standard_leg}
 \end{table}
 
-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}).
+Si inoltre noti come \signal{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 \signal{SIGSTOP} e \signal{SIGKILL} si distinguono da
+tutti gli altri per la specifica caratteristica di non potere essere né
+intercettati, né bloccati, né ignorati.
 
 \begin{table}[htb]
   \footnotesize
@@ -447,7 +451,7 @@ tab.~\ref{tab:sig_action_leg}).
     \hline
     T & L'azione predefinita è terminare il processo.\\
     C & L'azione predefinita è terminare il processo e scrivere un 
-        \itindex{core~dump} \textit{core dump}.\\
+        \textit{core dump}.\\
     I & L'azione predefinita è ignorare il segnale.\\
     S & L'azione predefinita è fermare il processo.\\
     \hline
@@ -457,16 +461,7 @@ tab.~\ref{tab:sig_action_leg}).
   \label{tab:sig_action_leg}
 \end{table}
 
-
-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
+Il numero totale di segnali presenti è dato dalla macro \macrod{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
@@ -478,28 +473,28 @@ affrontata nei paragrafi successivi.
 \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 o
-le eccezioni del processore) rileva un qualche errore insanabile nel programma
-in esecuzione. In generale la generazione di questi segnali significa che il
+l'hardware (come per i \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
-console o eliminare i \index{file!di lock} file di lock prima dell'uscita.  In
-questo caso il gestore deve concludersi ripristinando l'azione predefinita e
-rialzando il segnale, in questo modo il programma si concluderà senza effetti
-spiacevoli, ma riportando lo stesso stato di uscita che avrebbe avuto se il
-gestore non ci fosse stato.
+console o eliminare i file di lock prima dell'uscita.  In questo caso il
+gestore deve concludersi ripristinando l'azione predefinita e rialzando il
+segnale, in questo modo il programma si concluderà senza effetti spiacevoli,
+ma riportando lo stesso stato di uscita che avrebbe avuto se il 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 un debugger può usare per ricostruire lo stato del programma al
-momento della terminazione.  Questi segnali sono:
+la registrazione su disco di un file di \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
+\item[\signald{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
   derivi da \textit{floating point exception} si applica a tutti gli errori
   aritmetici compresa la divisione per zero e l'overflow.  Se il gestore
   ritorna il comportamento del processo è indefinito, ed ignorare questo
@@ -511,48 +506,48 @@ momento della terminazione.  Questi segnali sono:
 %   aritmetiche e richiede che esse siano notificate.
 % TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni 
   
-\item[\signal{SIGILL}] Il nome deriva da \textit{illegal instruction},
+\item[\signald{SIGILL}] Il nome deriva da \textit{illegal instruction},
   significa che il programma sta cercando di eseguire una istruzione
   privilegiata o inesistente, in generale del codice illecito. Poiché il
   compilatore del C genera del codice valido si ottiene questo segnale se il
   file eseguibile è corrotto o si stanno cercando di eseguire dei dati.
   Quest'ultimo caso può accadere quando si passa un puntatore sbagliato al
   posto di un puntatore a funzione, o si eccede la scrittura di un vettore di
-  una variabile locale, andando a corrompere lo \itindex{stack}
-  \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.  È tipico ottenere questo segnale dereferenziando un puntatore
-  nullo o non inizializzato leggendo al di là della fine di un vettore.  Se il
-  gestore ritorna il comportamento del processo è indefinito.
-
-\item[\signal{SIGBUS}] Il nome deriva da \textit{bus error}. Come
+  una variabile locale, andando a corrompere lo \textit{stack}. Lo stesso
+  segnale viene generato in caso di overflow dello \textit{stack} o di
+  problemi nell'esecuzione di un gestore.  Se il gestore ritorna il
+  comportamento del processo è indefinito.
+
+\item[\signald{SIGSEGV}] Il nome deriva da \textit{segment violation}, e
+  significa che il programma sta cercando di leggere o scrivere in una zona di
+  memoria protetta al di fuori di quella che gli è stata riservata dal
+  sistema. In genere è il meccanismo della protezione della memoria che si
+  accorge dell'errore ed il kernel genera il segnale.  È tipico ottenere
+  questo segnale dereferenziando un puntatore nullo o non inizializzato
+  leggendo al di là della fine di un vettore.  Se il gestore ritorna il
+  comportamento del processo è indefinito.
+
+\item[\signald{SIGBUS}] Il nome deriva da \textit{bus error}. Come
   \signal{SIGSEGV} questo è un segnale che viene generato di solito quando si
   dereferenzia un puntatore non inizializzato, la differenza è che
   \signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
-  (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.
+  (al di fuori dallo \textit{heap} o dallo \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
+\item[\signald{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica
   che il programma stesso ha rilevato un errore che viene riportato chiamando
   la funzione \func{abort}, che genera questo segnale.
 
-\item[\signal{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
+\item[\signald{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
   dall'attivazione del tracciamento per il processo. È usato dai programmi per
   il debugging e un programma normale non dovrebbe ricevere questo segnale.
 
-\item[\signal{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
+\item[\signald{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
   richiede l'esecuzione di una \textit{system call}, ma si è fornito un codice
   sbagliato per quest'ultima. 
 
-\item[\signal{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non
+\item[\signald{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non
   è previsto da nessuno standard ed è definito solo su alcune architetture che
   come il vecchio PDP11 prevedono questo tipo di interruzione, non è presente
   sui normali PC.
@@ -574,32 +569,31 @@ 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:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
+\item[\signald{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
   generico usato per causare la conclusione di un programma. È quello che
   viene generato di default dal comando \cmd{kill}.  Al contrario di
   \signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo
   si usa per chiedere in maniera ``\textsl{educata}'' ad un processo di
   concludersi.
 
-\item[\signal{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
+\item[\signald{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
   interruzione per il programma. È quello che viene generato di default dal
   dall'invio sul terminale del carattere di controllo ``\textit{INTR}'',
   \textit{interrupt} appunto, che viene generato normalmente dalla sequenza
   \cmd{C-c} sulla tastiera.
 
-\item[\signal{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
+\item[\signald{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
   controllato da un altro carattere di controllo, ``\textit{QUIT}'',
   corrispondente alla sequenza \texttt{C-\bslash} sulla tastiera. A differenza
   del precedente l'azione predefinita, oltre alla terminazione del processo,
-  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
+  comporta anche la creazione di un \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 \textit{core dump}.
+
+\item[\signald{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
   qualunque programma. Questo segnale non può essere né intercettato, né
   ignorato, né bloccato, per cui causa comunque la terminazione del processo.
   In genere esso viene generato solo per richiesta esplicita dell'utente dal
@@ -614,7 +608,7 @@ processo, questi segnali sono:
   per condizioni particolari il processo non può più essere eseguito neanche
   per eseguire un gestore.
 
-\item[\signal{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
+\item[\signald{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
   terminale dell'utente si è disconnesso, ad esempio perché si è interrotta la
   rete. Viene usato anche per riportare la terminazione del processo di
   controllo di un terminale a tutti i processi della sessione (vedi
@@ -636,15 +630,15 @@ causare la terminazione del programma, ma con questi segnali la scelta
 predefinita è irrilevante, in quanto il loro uso presuppone sempre la
 necessità di un gestore.  Questi segnali sono:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
+\item[\signald{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
   un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
   usato dalla funzione \func{alarm}.
 
-\item[\const{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
+\item[\signald{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
   precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
   processo. 
 
-\item[\signal{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
+\item[\signald{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
   di un timer che misura sia il tempo di CPU speso direttamente dal processo
   che quello che il sistema ha speso per conto di quest'ultimo. In genere
   viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
@@ -660,18 +654,17 @@ questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a
 generare questi segnali.  L'azione predefinita è di essere ignorati. Questi
 segnali sono:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGIO}] Questo segnale viene inviato quando un file descriptor è
+\item[\signald{SIGIO}] Questo segnale viene inviato quando un file descriptor è
   pronto per eseguire dell'input/output. In molti sistemi solo i socket e i
   terminali possono generare questo segnale, in Linux questo può essere usato
   anche per i file, posto che la chiamata a \func{fcntl} che lo attiva abbia
   avuto successo.
 
-\item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati
-  urgenti o \itindex{out-of-band} \textit{out-of-band} su di un
-  socket; per maggiori dettagli al proposito si veda
-  sez.~\ref{sec:TCP_urgent_data}.
+\item[\signald{SIGURG}] Questo segnale è inviato quando arrivano dei dati
+  urgenti o \textit{out-of-band} su di un socket; per maggiori dettagli al
+  proposito si veda sez.~\ref{sec:TCP_urgent_data}.
 
-\item[\signal{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001,
+\item[\signald{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001,
   ed è equivalente a \signal{SIGIO} che invece deriva da BSD. Su Linux è
   definito per compatibilità con i sistemi System V.
 \end{basedescript}
@@ -684,15 +677,15 @@ Questi sono i segnali usati dal controllo delle sessioni e dei processi, il
 loro uso è specializzato e viene trattato in maniera specifica nelle sezioni
 in cui si trattano gli argomenti relativi.  Questi segnali sono:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
+\item[\signald{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
   figlio termina o viene fermato. L'azione predefinita è di ignorare il
   segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
 
-\item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al
+\item[\signald{SIGCLD}] Per Linux questo è solo un segnale identico al
   precedente e definito come sinonimo. Il nome è obsoleto, deriva dalla
   definizione del segnale su System V, ed oggi deve essere evitato.
 
-\item[\signal{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
+\item[\signald{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
   usato per fare ripartire un programma precedentemente fermato da
   \signal{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
   ripartire il processo prima della sua consegna. Il comportamento predefinito
@@ -703,15 +696,15 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
   La maggior pare dei programmi non hanno necessità di intercettare il
   segnale, in quanto esso è completamente trasparente rispetto all'esecuzione
   che riparte senza che il programma noti niente. Si possono installare dei
-  gestori per far si che un programma produca una qualche azione speciale
+  gestori per far sì 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 l'esecuzione di un processo, lo porta
+\item[\signald{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta
   cioè nello stato \textit{stopped} (vedi sez.~\ref{sec:proc_sched}). Il
   segnale non può essere né intercettato, né ignorato, né bloccato.
 
-\item[\signal{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
+\item[\signald{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
   ferma il processo interattivamente, ed è generato dal carattere
   ``\textit{SUSP}'', prodotto dalla combinazione di tasti \cmd{C-z}, ed al
   contrario di \signal{SIGSTOP} può essere intercettato e ignorato. In genere
@@ -720,14 +713,14 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
   esempio un programma ha disabilitato l'eco sul terminale può installare un
   gestore per riabilitarlo prima di fermarsi.
 
-\item[\signal{SIGTTIN}] Un processo non può leggere dal terminale se esegue
+\item[\signald{SIGTTIN}] Un processo non può leggere dal terminale se esegue
   una sessione di lavoro in \textit{background}. Quando un processo in
   \textit{background} tenta di leggere da un terminale viene inviato questo
   segnale a tutti i processi della sessione di lavoro. L'azione predefinita è
   di fermare il processo.  L'argomento è trattato in
   sez.~\ref{sec:sess_job_control_overview}.
 
-\item[\signal{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
+\item[\signald{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
   generato quando si tenta di scrivere sul terminale o modificarne uno dei
   modi con un processo in \textit{background}. L'azione predefinita è di
   fermare il processo, l'argomento è trattato in
@@ -744,30 +737,30 @@ che impediscono il completamento dell'esecuzione dovute all'interazione con il
 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
-  scrivere su una di esse, che un altro l'abbia aperta in lettura (si veda
-  sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
-  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{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
+\item[\signald{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle
+  \textit{pipe}, (o delle FIFO o dei socket) è necessario, prima che un
+  processo inizi a scrivere su una di esse, che un altro l'abbia aperta in
+  lettura (si veda sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è
+  partito o è terminato inavvertitamente alla scrittura sulla \textit{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[\signald{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
   segnale è generato quando un processo eccede il limite impostato per il
   tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}. Fino al
   kernel 2.2 terminava semplicemente il processo, a partire dal kernel 2.4,
   seguendo le indicazioni dello standard POSIX.1-2001 viene anche generato un
-  \itindex{core~dump} \textit{core dump}.
+  \textit{core dump}.
 
-\item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
+\item[\signald{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
   segnale è generato quando un processo tenta di estendere un file oltre le
   dimensioni specificate dal limite impostato per le dimensioni massime di un
   file, vedi sez.~\ref{sec:sys_resource_limit}.  Fino al kernel 2.2 terminava
   semplicemente il processo, a partire dal kernel 2.4, seguendo le indicazioni
-  dello standard POSIX.1-2001 viene anche generato un \itindex{core~dump}
-  \textit{core dump}.
+  dello standard POSIX.1-2001 viene anche generato un \textit{core dump}.
 
-\item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
+\item[\signald{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
   segnale che viene generato quando si perde un advisory lock su un file su
   NFS perché il server NFS è stato riavviato. Il progetto GNU lo utilizza per
   indicare ad un client il crollo inaspettato di un server. In Linux è
@@ -781,31 +774,31 @@ quella di terminare il processo, questi segnali sono:
 Raccogliamo qui infine una serie di segnali che hanno scopi differenti non
 classificabili in maniera omogenea. Questi segnali sono:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
+\item[\signald{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
   dell'utente che lo può usare per quello che vuole. Viene generato solo
   attraverso l'invocazione della funzione \func{kill}. Entrambi i segnali
   possono essere utili per implementare una comunicazione elementare fra
   processi diversi, o per eseguire a richiesta una operazione utilizzando un
   gestore. L'azione predefinita è di terminare il processo.
-\item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per
+\item[\signald{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per
   il suo utilizzo vale esattamente quanto appena detto per \signal{SIGUSR1}.
-\item[\signal{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
+\item[\signald{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
   generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
   righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
   programmi testuali per riformattare l'uscita su schermo quando si cambia
   dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
-\item[\signal{SIGINFO}] Il segnale indica una richiesta di informazioni. È
+\item[\signald{SIGINFO}] Il segnale indica una richiesta di informazioni. È
   usato con il controllo di sessione, causa la stampa di informazioni da parte
   del processo leader del gruppo associato al terminale di controllo, gli
   altri processi lo ignorano. Su Linux però viene utilizzato come sinonimo di
   \signal{SIGPWR} e l'azione predefinita è di terminare il processo.
-\item[\signal{SIGPWR}] Il segnale indica un cambio nello stato di
+\item[\signald{SIGPWR}] Il segnale indica un cambio nello stato di
   alimentazione di un eventuale gruppo di continuità e viene usato
   principalmente per segnalare l'assenza ed il ritorno della corrente. Viene
   usato principalmente con \cmd{init} per attivare o fermare le procedure di
   spegnimento automatico all'esaurimento delle batterie. L'azione predefinita
   è di terminare il processo.
-\item[\signal{SIGSTKFLT}] Indica un errore nello stack del coprocessore
+\item[\signald{SIGSTKFLT}] Indica un errore nello stack del coprocessore
   matematico, è definito solo per le architetture PC, ma è completamente
   inusato. L'azione predefinita è di terminare il processo.
 \end{basedescript}
@@ -862,9 +855,9 @@ 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
-\index{variabili!globali} variabile globale \var{sys\_siglist}, che è definita
-in \headfile{signal.h} e può essere acceduta con la dichiarazione:
+\func{strsignal} e \func{psignal} è quello di usare la 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,
@@ -908,38 +901,38 @@ figlio dovranno arrivare solo i segnali dovuti alle sue azioni.
 
 Quando si mette in esecuzione un nuovo programma con \func{exec} (si ricordi
 quanto detto in sez.~\ref{sec:proc_exec}) tutti i segnali per i quali è stato
-installato un gestore vengono reimpostati a \const{SIG\_DFL}. Non ha più
+installato un gestore vengono reimpostati a \constd{SIG\_DFL}. Non ha più
 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
-\const{SIG\_IGN}. Questo permette ad esempio alla shell di impostare ad
+\constd{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
 successiva pressione di \texttt{C-c} o \texttt{C-y}.
 
 Per quanto riguarda il comportamento di tutte le altre \textit{system call} si
-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
-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.
+danno sostanzialmente due casi, a seconda che esse siano \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 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.
+
+\index{system~call~lente|(}
 
 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:
+indefinitamente e per questo motivo vengono chiamate \textsl{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
-  presenti (come per certi \index{file!di~dispositivo} file di dispositivo, i
-  socket o le pipe);
+  presenti (come per certi file di dispositivo, i socket o le \textit{pipe});
 \item la scrittura sugli stessi file, nel caso in cui dati non possano essere
   accettati immediatamente (di nuovo comune per i socket);
 \item l'apertura di un file di dispositivo che richiede operazioni non
@@ -947,27 +940,28 @@ 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 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
+\item l'uso di funzioni di intercomunicazione fra processi (vedi
+  cap.~\ref{cha:IPC}) che si bloccano in attesa di risposte da altri processi;
+\item l'uso della 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 l'uso delle 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.
+\item l'uso della 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 \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.
+gestori controllino lo stato di uscita delle funzioni che eseguono una
+\textit{system call} lenta per ripeterne la chiamata qualora l'errore fosse
+questo.
 
 Dimenticarsi di richiamare una \textit{system call} interrotta da un segnale è
-un errore comune, tanto che le \acr{glibc} provvedono una macro
+un errore comune, tanto che la \acr{glibc} provvede 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}.
@@ -979,7 +973,7 @@ 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,
+Linux e la \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 \textit{system
@@ -990,18 +984,18 @@ 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
+\item le funzioni di attesa di un segnale: \func{pause} (vedi
+  sez.~\ref{sec:sig_pause_sleep}) o \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 di attesa dell'\textit{I/O multiplexing} (vedi
+  sez.~\ref{sec:file_multiplexing}) come \func{select}, \func{pselect},
+  \func{poll}, \func{ppoll}, \func{epoll\_wait} e \func{epoll\_pwait}.
 \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 per la messa in attesa di un processo come \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},
@@ -1012,6 +1006,8 @@ possa essere stato richiesto il riavvio automatico, queste funzioni sono:
 \end{itemize*}
 
 
+\index{system~call~lente|)}
+
 
 \subsection{L'installazione di un gestore}
 \label{sec:sig_signal}
@@ -1034,7 +1030,7 @@ comportamento, pur mantenendone immutato il prototipo\footnote{in realtà in
 }
 
 {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}
+  successo e \constd{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.
@@ -1044,17 +1040,17 @@ comportamento, pur mantenendone immutato il prototipo\footnote{in realtà in
 
 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
+estensione GNU, definita dalla \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}
-questa infatti, per la poca chiarezza della sintassi del C quando si vanno a
+questa infatti, per la complessità della sintassi del C quando si vanno a
 trattare puntatori a funzioni, è molto meno comprensibile.  Da un confronto
 con il precedente prototipo si può dedurre la definizione di
-\type{sighandler\_t} che è:
+\typed{sighandler\_t} che è:
 \includecodesnip{listati/sighandler_t.c}
 e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
-che prende un argomento di tipo \ctyp{int}. Si noti come si devono usare le
+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}.
@@ -1070,10 +1066,12 @@ 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. 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}.
+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 nell'argomento
+\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
@@ -1085,29 +1083,33 @@ 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
+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 la \acr{libc4} e la \acr{libc5}.\footnote{nelle
-  \acr{libc5} esiste però la possibilità di includere \file{bsd/signal.h} al
-  posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} viene
+  \acr{libc5} esisteva però la possibilità di includere \file{bsd/signal.h} al
+  posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} era
   ridefinita per seguire la semantica affidabile usata da BSD.}
 
 Al contrario BSD segue la semantica affidabile, non disinstallando il gestore
-e bloccando il segnale durante l'esecuzione dello stesso. Con l'utilizzo delle
+e bloccando il segnale durante l'esecuzione dello stesso. Con l'utilizzo della
 \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 \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 devono usare \func{sigaction}.
+\macro{\_XOPEN\_SOURCE}.
 
-È 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 altra funzione affine, è indefinito. Un gestore che ritorna da
-questi segnali può dare luogo ad un ciclo infinito.
+In generale, per evitare questi problemi e per le possibili differenze nella
+semantica fra versioni diverse di kernel, l'uso di \func{signal} è sempre da
+evitare, visto che tra l'altro la funzione ha un comportamento indefinito in
+caso di processi multi-\textit{thread}; l'unico utilizzo sicuro della funzione
+è con \const{SIG\_IGN} e \const{SIG\_DFL}, in tutti gli altri casi si deve
+usare \func{sigaction}.
+
+Infine si deve tenere presente che su Linux, 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 altra funzione affine, è indefinito. Un gestore
+che ritorna da questi segnali può dare luogo ad un ciclo infinito.
 
 
 \subsection{Le funzioni per l'invio di segnali}
@@ -1148,9 +1150,10 @@ gestore dovrà prima reinstallare l'azione predefinita, per poi attivarla
 chiamando \func{raise}.
 
 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 è:
+veniva implementata (nelle versioni più recenti del kernel viene usata
+\func{tgkill} che vedremo in sez.~\ref{sec:thread_signal}) 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}
@@ -1163,10 +1166,10 @@ che consente effettivamente di inviare un segnale generico ad un processo, il
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
     \item[\errcode{EINVAL}] il segnale specificato 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.
+    \item[\errcode{ESRCH}] il processo o il gruppo di processi indicato non
+      esiste.
   \end{errlist}
 }
 \end{funcproto}
@@ -1183,19 +1186,18 @@ 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 \ids{PID} uguale
-           a \param{pid}.\\ 
-    0    & Il segnale è mandato ad ogni processo del \itindex{process~group}
-           \textit{process group} del chiamante.\\ 
+           a \param{pid}.\\
+    0    & Il segnale è mandato ad ogni processo del \textit{process group}
+           (vedi sez.~\ref{sec:sess_proc_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} con \ids{PGID} uguale
-           a $|\param{pid}|$.\\
+           con \ids{PGID} uguale a $|\param{pid}|$.\\
     \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{pid} per la funzione
@@ -1210,7 +1212,27 @@ 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.
+segnale (torneremo su questo in sez.~\ref{sec:sig_pid_fd}).
+
+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.\footnote{questo a partire dal kernel 1.3.78, seguendo lo
+  standard POSIX.1; in precedenza il comportamento era diverso, gli
+  interessati alla storia possono consultare la pagina di manuale della
+  funzione.} 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
@@ -1223,49 +1245,63 @@ 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}.} 
+\fdesc{Invia un segnale ad un \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}.  }
+  errori sono gli stessi di \func{kill}.
+}
 \end{funcproto}
 
 
-La funzione invia il segnale \param{signal} al \itindex{process~group}
-\textit{process group} \param{pidgrp} ed è è sostanzialmente equivalente
-all'esecuzione di \code{kill(-pidgrp, signal)}.
+La funzione invia il segnale \param{signal} al \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 è:
 
-Oltre a queste funzioni di base vedremo più avanti che esistono altre funzioni
-per inviare segnali, 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}.
+\begin{funcproto}{
+\fhead{stdlib.h}
+\fdecl{void abort(void)}
+\fdesc{Abortisce il processo corrente.} 
+}
 
-Ma indipendentemente dalla funzione 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 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.
+{La funzione non ritorna, il processo viene terminato.}
+\end{funcproto}
 
-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.
+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 interruzione ed i \textit{timer}}
+\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 è:
+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}
@@ -1301,12 +1337,12 @@ processo tre diversi timer:
   corrisponde al \textit{clock time}). La scadenza di questo timer provoca
   l'emissione di \signal{SIGALRM};
 \item un \textit{virtual timer} che calcola il tempo di processore usato dal
-  processo in user space (che corrisponde all'\textit{user time}). La scadenza
-  di questo timer provoca l'emissione di \signal{SIGVTALRM};
+  processo in \textit{user space} (che corrisponde all'\textit{user time}). La
+  scadenza 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
-  \textit{system call} ad esso relative (che corrisponde a quello che in
-  sez.~\ref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La
+  utilizzati direttamente dal processo in \textit{user space}, e dal kernel
+  nelle \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*}
 
@@ -1320,18 +1356,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]
@@ -1342,9 +1384,9 @@ tab.~\ref{tab:sig_setitimer_values}.
     \textbf{Valore} & \textbf{Timer} \\
     \hline
     \hline
-    \const{ITIMER\_REAL}    & \textit{real-time timer}\\
-    \const{ITIMER\_VIRTUAL} & \textit{virtual timer}\\
-    \const{ITIMER\_PROF}    & \textit{profiling timer}\\
+    \constd{ITIMER\_REAL}    & \textit{real-time timer}\\
+    \constd{ITIMER\_VIRTUAL} & \textit{virtual timer}\\
+    \constd{ITIMER\_PROF}    & \textit{profiling timer}\\
     \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{which} per la funzione
@@ -1369,7 +1411,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 
@@ -1381,14 +1423,14 @@ questo modo il ciclo verrà ripetuto; se invece il valore di \var{it\_interval}
 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}
+in termini di \func{setitimer}, come evidenziato dal manuale della \acr{glibc}
 \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 
@@ -1397,78 +1439,57 @@ 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
-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
-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
-quella fornita dall'hardware disponibile.
+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 ``\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 \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 \constd{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 quella fornita dall'hardware disponibile.
 
 Una seconda causa di potenziali ritardi è che il segnale viene generato alla
 scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo
-è attivo (questo è sempre vero per \const{ITIMER\_VIRT}) la consegna è
+è attivo (questo è sempre vero per \const{ITIMER\_VIRTUAL}) la consegna è
 immediata, altrimenti può esserci un ulteriore ritardo che può variare a
 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}
+oggi l'uso di questa funzione è deprecato a favore degli
+\textit{high-resolution timer} e della cosiddetta \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 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}
 
-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.
-
-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}
@@ -1476,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}
-
-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).
+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 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}
-
-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.
+già noto in partenza, lo standard POSIX.1 prevede una funzione di attesa
+specifica, \funcd{sleep}, il cui prototipo è:
+
+\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
+della \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 la \acr{glibc} segue (secondo la pagina di
+manuale almeno dalla versione 2.2.2)  quella di SUSv2 per cui la
+funzione \funcd{usleep} (dove la \texttt{u} è intesa come sostituzione di
+$\mu$), ha il seguente prototipo:
 
-\end{prototype}
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int usleep(unsigned long usec)}
+\fdesc{Pone il processo in pausa per un tempo in microsecondi.} 
+}
+
+{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 intervallo 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{EINTR}] la funzione è stata interrotta da un segnale.
     \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}
+  \end{errlist}
+}
+\end{funcproto}
 
-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.
+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
@@ -1580,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
@@ -1594,19 +1651,20 @@ specificato, ma prima che il processo possa tornare ad essere eseguito
 occorrerà almeno attendere la successiva interruzione del timer di sistema,
 cioè un tempo che a seconda dei casi può arrivare fino a 1/\const{HZ}, (sempre
 che il sistema sia scarico ed il processa venga immediatamente rimesso in
-esecuzione); per questo motivo il valore restituito in \param{rem} è sempre
-arrotondato al multiplo successivo di 1/\const{HZ}.
+esecuzione). Per questo motivo il valore restituito in \param{rem} è sempre
+arrotondato al multiplo successivo di 1/\const{HZ}. 
 
 Con i kernel della serie 2.4 in realtà era possibile ottenere anche pause più
-precise del centesimo di secondo usando politiche di \itindex{scheduler}
-scheduling \textit{real-time} come \const{SCHED\_FIFO} o \const{SCHED\_RR}; in
-tal caso infatti il calcolo sul numero di interruzioni del timer veniva
-evitato utilizzando direttamente un ciclo di attesa con cui si raggiungevano
-pause fino ai 2~ms con precisioni del $\mu$s. Questa estensione è stata
-rimossa con i kernel della serie 2.6, che consentono una risoluzione più alta
-del timer di sistema; inoltre a partire dal kernel 2.6.21, \func{nanosleep}
-può avvalersi del supporto dei timer ad alta risoluzione, ottenendo la massima
-precisione disponibile sull'hardware della propria macchina.
+precise del centesimo di secondo usando politiche di \textit{scheduling}
+\textit{real-time} come \const{SCHED\_FIFO} o \const{SCHED\_RR} (vedi
+sez.~\ref{sec:proc_real_time}); in tal caso infatti il calcolo sul numero di
+interruzioni del timer veniva evitato utilizzando direttamente un ciclo di
+attesa con cui si raggiungevano pause fino ai 2~ms con precisioni del
+$\mu$s. Questa estensione è stata rimossa con i kernel della serie 2.6, che
+consentono una risoluzione più alta del timer di sistema; inoltre a partire
+dal kernel 2.6.21, \func{nanosleep} può avvalersi del supporto dei timer ad
+alta risoluzione, ottenendo la massima precisione disponibile sull'hardware
+della propria macchina.
 
 
 \subsection{Un esempio elementare}
@@ -1615,21 +1673,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 \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 \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},
@@ -1637,7 +1692,7 @@ implementazione generica di una funzione di gestione per \signal{SIGCHLD},
 test di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con
 l'opzione \cmd{-s} (che si limita ad effettuare l'installazione di questa
 funzione come gestore di \signal{SIGCHLD}) potremo verificare che non si ha
-più la creazione di \itindex{zombie} \textit{zombie}.
+più la creazione di \textit{zombie}.
 
 \begin{figure}[!htbp]
   \footnotesize  \centering
@@ -1650,13 +1705,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
@@ -1677,8 +1733,7 @@ rimosso verrà recapitato un solo segnale.
 Allora, nel caso della terminazione dei processi figli, se si chiamasse
 \func{waitpid} una sola volta, essa leggerebbe lo stato di terminazione per un
 solo processo, anche se i processi terminati sono più di uno, e gli altri
-resterebbero in stato di \itindex{zombie} \textit{zombie} per un tempo
-indefinito.
+resterebbero in stato di \textit{zombie} per un tempo indefinito.
 
 Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non
 ritorni un valore nullo, segno che non resta nessun processo di cui si debba
@@ -1694,9 +1749,9 @@ tutti gli stati di terminazione sono stati ricevuti.
 
 Le funzioni esaminate finora fanno riferimento alle modalità più elementari
 della gestione dei segnali; non si sono pertanto ancora prese in
-considerazione le tematiche più complesse, collegate alle varie
-\itindex{race~condition} \textit{race condition} che i segnali possono
-generare e alla natura asincrona degli stessi.
+considerazione le tematiche più complesse, collegate alle varie \textit{race
+  condition} che i segnali possono generare e alla natura asincrona degli
+stessi.
 
 Affronteremo queste problematiche in questa sezione, partendo da un esempio
 che le evidenzi, per poi prendere in esame le varie funzioni che permettono di
@@ -1714,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}
@@ -1726,32 +1781,32 @@ fig.~\ref{fig:sig_sleep_wrong}.
 
 Dato che è nostra intenzione utilizzare \signal{SIGALRM} il primo passo della
 nostra implementazione sarà quello di installare il relativo gestore salvando
-il precedente (\texttt{\small 14-17}).  Si effettuerà poi una chiamata ad
+il precedente (\texttt{\small 14--17}).  Si effettuerà poi una chiamata ad
 \func{alarm} per specificare il tempo d'attesa per l'invio del segnale a cui
 segue la chiamata a \func{pause} per fermare il programma (\texttt{\small
-  18-20}) fino alla sua ricezione.  Al ritorno di \func{pause}, causato dal
-ritorno del gestore (\texttt{\small 1-9}), si ripristina il gestore originario
-(\texttt{\small 21-22}) restituendo l'eventuale tempo rimanente
-(\texttt{\small 23-24}) che potrà essere diverso da zero qualora
+  18--20}) fino alla sua ricezione.  Al ritorno di \func{pause}, causato dal
+ritorno del gestore (\texttt{\small 1--9}), si ripristina il gestore originario
+(\texttt{\small 21--22}) restituendo l'eventuale tempo rimanente
+(\texttt{\small 23--24}) che potrà essere diverso da zero qualora
 l'interruzione di \func{pause} venisse causata da un altro segnale.
 
 Questo codice però, a parte il non gestire il caso in cui si è avuta una
 precedente chiamata a \func{alarm} (che si è tralasciato per brevità),
-presenta una pericolosa \itindex{race~condition} \textit{race condition}.
-Infatti, se il processo viene interrotto fra la chiamata di \func{alarm} e
-\func{pause}, può capitare (ad esempio se il sistema è molto carico) che il
-tempo di attesa scada prima dell'esecuzione di quest'ultima, cosicché essa
-sarebbe eseguita dopo l'arrivo di \signal{SIGALRM}. In questo caso ci si
-troverebbe di fronte ad un \itindex{deadlock} deadlock, in quanto \func{pause}
-non verrebbe mai più interrotta (se non in caso di un altro segnale).
+presenta una pericolosa \textit{race condition}.  Infatti, se il processo
+viene interrotto fra la chiamata di \func{alarm} e \func{pause}, può capitare
+(ad esempio se il sistema è molto carico) che il tempo di attesa scada prima
+dell'esecuzione di quest'ultima, cosicché essa sarebbe eseguita dopo l'arrivo
+di \signal{SIGALRM}. In questo caso ci si troverebbe di fronte ad un
+\textit{deadlock}, in quanto \func{pause} 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}
@@ -1761,30 +1816,33 @@ codice del tipo di quello riportato in fig.~\ref{fig:sig_sleep_incomplete}.
   \label{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.
+In questo caso il gestore (\texttt{\small 18--27}) non ritorna come in
+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
+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
-\textit{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 impostare nel gestore una variabile
+globale preventivamente inizializzata nel programma principale ad un valore
+diverso (\texttt{\small 14--19}). In questo modo dal corpo principale del
+programma si potrà determinare, osservando il contenuto di detta variabile,
+l'occorrenza o meno del segnale, ed eseguire le conseguenti azioni relative
+(\texttt{\small 6--11}).
 
 \begin{figure}[!htbp]
   \footnotesize\centering
@@ -1798,17 +1856,20 @@ prendere le relative azioni conseguenti (\texttt{\small 6-11}).
 \end{figure}
 
 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.
+sez.~\ref{sec:proc_race_cond}, in cui si genera una \textit{race
+  condition}. Infatti, in una situazione in cui un segnale è già arrivato (e
+quindi \var{flag} è già stata impostata ad 1 nel gestore) 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 funzione \func{signal} infatti ha la sua origine
+nell'interfaccia alquanto primitiva che venne adottata nei primi sistemi Unix,
+ma con questa funzione è sostanzialmente impossibile gestire in maniera
+adeguata di tutti i possibili aspetti con cui un processo deve reagire alla
+ricezione di un segnale.
 
 
 
@@ -1821,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
@@ -1829,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.}
+}
+
+{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}
 
-  \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}
-
-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} 
 
@@ -1890,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 principale funzione di sistema prevista dall'interfaccia POSIX.1 per la
+gestione dei 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 per 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{EFAULT}] si sono specificati indirizzi non validi.
   \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
@@ -1934,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 
@@ -1954,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}|}
@@ -1969,45 +2093,50 @@ tab.~\ref{tab:sig_sa_flag}.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{SA\_NOCLDSTOP}& Se il segnale è \signal{SIGCHLD} allora non deve
-                           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.\\ 
-    \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\_RESTART}  & Riavvia automaticamente le \textit{slow system
-                           call} quando vengono interrotte dal suddetto
-                           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 \\ 
+    \constd{SA\_NOCLDSTOP}& Se il segnale è \signal{SIGCHLD} allora non deve
+                            essere notificato quando il processo figlio viene
+                            fermato da uno dei segnali \signal{SIGSTOP},
+                            \signal{SIGTSTP}, \signal{SIGTTIN} o 
+                            \signal{SIGTTOU}, questo flag ha significato solo
+                            quando si imposta un gestore per \signal{SIGCHLD}.\\
+    \constd{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} e si richiede di
+                            ignorare il segnale con \const{SIG\_IGN} allora i
+                            processi figli non diventano \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.\\
+    \constd{SA\_NODEFER}  & Evita che il segnale corrente sia bloccato durante
+                            l'esecuzione del gestore.\\
+    \constd{SA\_NOMASK}   & Nome obsoleto e sinonimo non standard di
+                            \const{SA\_NODEFER}, non deve essere più
+                            utilizzato.\\ 
+    \constd{SA\_ONESHOT}  & Nome obsoleto e sinonimo non standard di
+                            \const{SA\_RESETHAND}, non deve essere più
+                            utilizzato.\\ 
+    \constd{SA\_ONSTACK}  & Stabilisce l'uso di uno \textit{stack} alternativo
+                            per l'esecuzione del gestore (vedi
+                            sez.~\ref{sec:sig_specific_features}).\\  
+    \constd{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.\\  
+    \constd{SA\_RESTART}  & Riavvia automaticamente le \textit{slow system
+                            call} quando vengono interrotte dal suddetto
+                            segnale, riproduce cioè il comportamento standard
+                            di BSD.\\ 
+    \constd{SA\_SIGINFO}  & Deve essere specificato quando si vuole usare un
+                            gestore in forma estesa usando
+                            \var{sa\_sigaction} al posto di
+                            \var{sa\_handler}.\\
     \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
@@ -2016,13 +2145,16 @@ 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}.\footnote{la direttiva \direct{union} del
+  linguaggio C definisce una variabile complessa, analoga a una stuttura, i
+  cui campi indicano i diversi tipi di valori che possono essere salvati, in
+  maniera alternativa, all'interno della stessa.}
 
 Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile
 accedere alle informazioni restituite attraverso il puntatore a questa
@@ -2034,7 +2166,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 
@@ -2062,27 +2194,28 @@ altre informazioni specifiche.
 \begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{8cm}|}
+  \begin{tabular}[c]{|l|p{10cm}|}
     \hline
     \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
-                         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_io}) è stata
-                         completata.\\
-    \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\\ 
+    \constd{SI\_USER}   & Generato da \func{kill} o \func{raise} o affini.\\
+    \constd{SI\_KERNEL} & Inviato direttamente dal kernel.\\
+    \constd{SI\_QUEUE}  & Inviato con \func{sigqueue} (vedi
+                          sez.~\ref{sec:sig_real_time}).\\ 
+    \constd{SI\_TIMER}  & Scadenza di un \textit{POSIX timer} (vedi
+                          sez.~\ref{sec:sig_timer_adv}).\\ 
+    \constd{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.\\ 
+    \constd{SI\_ASYNCIO}& Una operazione di I/O asincrono (vedi
+                          sez.~\ref{sec:file_asyncronous_io}) è stata
+                          completata.\\
+    \constd{SI\_SIGIO}  & Segnale di \signal{SIGIO} da una coda (vedi
+                          sez.~\ref{sec:file_asyncronous_operation}).\\ 
+    \constd{SI\_TKILL}  & Inviato da \func{tkill} o \func{tgkill} (vedi
+                          sez.~\ref{cha:thread_xxx}), introdotto con il kernel
+                          2.4.19.\\ 
     \hline
   \end{tabular}
   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
@@ -2090,19 +2223,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
@@ -2112,47 +2244,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.\\
+    \constd{ILL\_ILLOPC}  & Codice di operazione illegale.\\
+    \constd{ILL\_ILLOPN}  & Operando illegale.\\
+    \constd{ILL\_ILLADR}  & Modo di indirizzamento illegale.\\
+    \constd{ILL\_ILLTRP}  & Trappola di processore illegale.\\
+    \constd{ILL\_PRVOPC}  & Codice di operazione privilegiato.\\
+    \constd{ILL\_PRVREG}  & Registro privilegiato.\\
+    \constd{ILL\_COPROC}  & Errore del coprocessore.\\
+    \constd{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.\\
+    \constd{FPE\_INTDIV}  & Divisione per zero intera.\\
+    \constd{FPE\_INTOVF}  & Overflow intero.\\
+    \constd{FPE\_FLTDIV}  & Divisione per zero in virgola mobile.\\
+    \constd{FPE\_FLTOVF}  & Overflow in virgola mobile.\\
+    \constd{FPE\_FLTUND}  & Underflow in virgola mobile.\\
+    \constd{FPE\_FLTRES}  & Risultato in virgola mobile non esatto.\\
+    \constd{FPE\_FLTINV}  & Operazione in virgola mobile non valida.\\
+    \constd{FPE\_FLTSUB}  & Mantissa? fuori intervallo.\\
     \hline
-    \const{SEGV\_MAPERR} & Indirizzo non mappato.\\
-    \const{SEGV\_ACCERR} & Permessi non validi per l'indirizzo.\\
+    \constd{SEGV\_MAPERR} & Indirizzo non mappato.\\
+    \constd{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.\\
+    \constd{BUS\_ADRALN}  & Allineamento dell'indirizzo non valido.\\
+    \constd{BUS\_ADRERR}  & Indirizzo fisico inesistente.\\
+    \constd{BUS\_OBJERR}  & Errore hardware sull'indirizzo.\\
     \hline
-    \const{TRAP\_BRKPT}  & Breakpoint sul processo.\\
-    \const{TRAP\_TRACE}  & Trappola di tracciamento del processo.\\
+    \constd{TRAP\_BRKPT}  & Breakpoint sul processo.\\
+    \constd{TRAP\_TRACE}  & Trappola di tracciamento del processo.\\
     \hline
-    \const{CLD\_EXITED}  & Il figlio è uscito.\\
-    \const{CLD\_KILLED}  & Il figlio è stato terminato.\\
-    \const{CLD\_DUMPED}  & Il figlio è terminato in modo anormale.\\
-    \const{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
-    \const{CLD\_STOPPED} & Il figlio è stato fermato.\\
-    \const{CLD\_CONTINUED}& Il figlio è ripartito.\\
+    \constd{CLD\_EXITED}  & Il figlio è uscito.\\
+    \constd{CLD\_KILLED}  & Il figlio è stato terminato.\\
+    \constd{CLD\_DUMPED}  & Il figlio è terminato in modo anormale.\\
+    \constd{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
+    \constd{CLD\_STOPPED} & Il figlio è stato fermato.\\
+    \constd{CLD\_CONTINUED}& Il figlio è ripartito.\\
     \hline
-    \const{POLL\_IN}   & Disponibili dati in ingresso.\\
-    \const{POLL\_OUT}  & Spazio disponibile sul buffer di uscita.\\
-    \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.\\
+    \constd{POLL\_IN}   & Disponibili dati in ingresso.\\
+    \constd{POLL\_OUT}  & Spazio disponibile sul buffer di uscita.\\
+    \constd{POLL\_MSG}  & Disponibili messaggi in ingresso.\\
+    \constd{POLL\_ERR}  & Errore di I/O.\\
+    \constd{POLL\_PRI}  & Disponibili dati di alta priorità in ingresso.\\
+    \constd{POLL\_HUP}  & Il dispositivo è stato disconnesso.\\
     \hline
   \end{tabular}
   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
@@ -2162,21 +2294,22 @@ 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 \dirct{union}
+ed i valori eventualmente presenti dipendono dal segnale ricevuto, così
+\signal{SIGCHLD} ed i segnali \textit{real-time} (vedi
+sez.~\ref{sec:sig_real_time}) inviati tramite \func{kill} avvalorano
+\var{si\_pid} e \var{si\_uid} coi valori corrispondenti al processo che ha
+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}.
+file descriptor e \var{si\_band} per i dati urgenti (vedi
+sez.~\ref{sec:TCP_urgent_data}) su un socket, il segnale inviato alla scadenza
+di un 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
@@ -2210,24 +2343,27 @@ 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 modo più comprensibile la forma di un
+gestore di segnale.
+
+Si noti come, essendo la funzione estremamente semplice, essa è definita come
+\dirct{inline}. Questa direttiva viene usata per dire al compilatore di
+trattare la funzione cui essa fa riferimento in maniera speciale inserendo il
+codice direttamente nel testo del programma.  Anche se i compilatori più
+moderni sono in grado di effettuare da soli queste manipolazioni (impostando
+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 \textit{user space}, non sono sempre adatte.
+
+In tal caso infatti le istruzioni per creare un nuovo frame nello
+\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.
 
 
 
@@ -2235,48 +2371,63 @@ definito un apposito tipo \texttt{SigFunc}.
   \textit{signal mask}}
 \label{sec:sig_sigmask}
 
-\itindbeg{signal~mask}
-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}.
+\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 come azione \const{SIG\_IGN}) 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 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
+  \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
+  \end{errlist}
+}
+\end{funcproto}
+
+La funzione usa l'insieme di segnali posto all'indirizzo passato
+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]
@@ -2287,13 +2438,13 @@ quell'indirizzo.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{SIG\_BLOCK}   & L'insieme dei segnali bloccati è l'unione fra
-                           quello specificato e quello corrente.\\
-    \const{SIG\_UNBLOCK} & I segnali specificati in \param{set} sono rimossi
-                           dalla maschera dei segnali, specificare la
-                           cancellazione di un segnale non bloccato è legale.\\
-    \const{SIG\_SETMASK} & La maschera dei segnali è impostata al valore
-                           specificato da \param{set}.\\
+    \constd{SIG\_BLOCK}   & L'insieme dei segnali bloccati è l'unione fra
+                            quello specificato e quello corrente.\\
+    \constd{SIG\_UNBLOCK} & I segnali specificati in \param{set} sono rimossi
+                            dalla maschera dei segnali, specificare la
+                            cancellazione di un segnale non bloccato è legale.\\
+    \constd{SIG\_SETMASK} & La maschera dei segnali è impostata al valore
+                            specificato da \param{set}.\\
     \hline
   \end{tabular}
   \caption{Valori e significato dell'argomento \param{how} della funzione
@@ -2302,38 +2453,39 @@ quell'indirizzo.
 \end{table}
 
 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. 
+l'insieme di segnali voluto per poi riabilitarli alla fine della 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 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
-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
+dei casi di \textit{race condition} restano aperte 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 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}
+  \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
+  \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
@@ -2357,14 +2509,14 @@ presenta neanche questa necessità.
  
 Per evitare i problemi di interferenza con gli altri segnali in questo caso
 non si è usato l'approccio di fig.~\ref{fig:sig_sleep_incomplete} evitando
-l'uso di \func{longjmp}. Come in precedenza il gestore (\texttt{\small 27-30})
-non esegue nessuna operazione, limitandosi a ritornare per interrompere il
-programma messo in attesa.
+l'uso di \func{longjmp}. Come in precedenza il gestore (\texttt{\small
+  27--30}) non esegue nessuna operazione, limitandosi a ritornare per
+interrompere il programma messo in attesa.
 
-La prima parte della funzione (\texttt{\small 6-10}) provvede ad installare
+La prima parte della funzione (\texttt{\small 6--10}) provvede ad installare
 l'opportuno gestore per \signal{SIGALRM}, salvando quello originario, che
 sarà ripristinato alla conclusione della stessa (\texttt{\small 23}); il passo
-successivo è quello di bloccare \signal{SIGALRM} (\texttt{\small 11-14}) per
+successivo è quello di bloccare \signal{SIGALRM} (\texttt{\small 11--14}) per
 evitare che esso possa essere ricevuto dal processo fra l'esecuzione di
 \func{alarm} (\texttt{\small 16}) e la sospensione dello stesso. Nel fare
 questo si salva la maschera corrente dei segnali, che sarà ripristinata alla
@@ -2372,11 +2524,11 @@ fine (\texttt{\small 22}), e al contempo si prepara la maschera dei segnali
 \var{sleep\_mask} per riattivare \signal{SIGALRM} all'esecuzione di
 \func{sigsuspend}.  
 
-In questo modo non sono più possibili \itindex{race~condition} \textit{race
-  condition} dato che \signal{SIGALRM} viene disabilitato con
-\func{sigprocmask} fino alla chiamata di \func{sigsuspend}.  Questo metodo è
-assolutamente generale e può essere applicato a qualunque altra situazione in
-cui si deve attendere per un segnale, i passi sono sempre i seguenti:
+In questo modo non sono più possibili \textit{race condition} dato che
+\signal{SIGALRM} viene disabilitato con \func{sigprocmask} fino alla chiamata
+di \func{sigsuspend}.  Questo metodo è assolutamente generale e può essere
+applicato a qualunque altra situazione in cui si deve attendere per un
+segnale, i passi sono sempre i seguenti:
 \begin{enumerate*}
 \item leggere la maschera dei segnali corrente e bloccare il segnale voluto
   con \func{sigprocmask};
@@ -2385,11 +2537,10 @@ cui si deve attendere per un segnale, i passi sono sempre i seguenti:
 \item ripristinare la maschera dei segnali originaria.
 \end{enumerate*}
 Per quanto possa sembrare strano bloccare la ricezione di un segnale per poi
-riabilitarla immediatamente dopo, in questo modo si evita il
-\itindex{deadlock} deadlock dovuto all'arrivo del segnale prima
-dell'esecuzione di \func{sigsuspend}.
+riabilitarla immediatamente dopo, in questo modo si evita il \textit{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}
@@ -2403,12 +2554,12 @@ principale, cosa che ad esempio può rendere problematico chiamare all'interno
 di un gestore di segnali la stessa funzione che dal segnale è stata
 interrotta.
 
-\index{funzioni!sicure|(}
+\index{funzioni!\textit{signal safe}|(}
 
 Il concetto è comunque più generale e porta ad una distinzione fra quelle che
 POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e
-\textsl{funzioni sicure} (o più precisamente \textit{signal safe function});
-quando un segnale interrompe una funzione insicura ed il gestore chiama al suo
+\textsl{funzioni sicure} (o più precisamente \textit{signal safe function}).
+Quando un segnale interrompe una funzione insicura ed il gestore chiama al suo
 interno una funzione insicura il sistema può dare luogo ad un comportamento
 indefinito, la cosa non avviene invece per le funzioni sicure.
 
@@ -2419,13 +2570,13 @@ vogliono evitare questi problemi si può ricorrere soltanto all'uso delle
 funzioni considerate sicure.
 
 L'elenco delle funzioni considerate sicure varia a seconda della
-implementazione utilizzata e dello standard a cui si fa
-riferimento;\footnote{non è riportata una lista specifica delle funzioni
-  sicure per Linux, si suppone pertanto che siano quelle richieste dallo
-  standard.}  secondo quanto riportato dallo standard POSIX 1003.1 nella
-revisione del 2003, le ``\textit{signal safe function}'' che possono essere
-chiamate anche all'interno di un gestore di segnali sono tutte quelle della
-lista riportata in fig.~\ref{fig:sig_safe_functions}.
+implementazione utilizzata e dello standard a cui si fa riferimento. Non è
+riportata una lista specifica delle funzioni sicure per Linux, e si suppone
+pertanto che siano quelle richieste dallo standard. Secondo quanto richiesto
+dallo standard POSIX 1003.1 nella revisione del 2003, le ``\textit{signal safe
+  function}'' che possono essere chiamate anche all'interno di un gestore di
+segnali sono tutte quelle della lista riportata in
+fig.~\ref{fig:sig_safe_functions}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2466,7 +2617,7 @@ lista riportata in fig.~\ref{fig:sig_safe_functions}.
   \label{fig:sig_safe_functions}
 \end{figure}
 
-\index{funzioni!sicure|)}
+\index{funzioni!\textit{signal safe}|)}
 
 Lo standard POSIX.1-2004 modifica la lista di
 fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e
@@ -2492,17 +2643,15 @@ ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}.
 Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni
 effettuate all'interno di un gestore di segnali, qualora si debbano compiere
 operazioni complesse è sempre preferibile utilizzare la tecnica in cui si usa
-il gestore per impostare il valore di una qualche \index{variabili!globali}
-variabile globale, e poi si eseguono le operazioni complesse nel programma
-verificando (con tutti gli accorgimenti visti in precedenza) il valore di
-questa variabile tutte le volte che si è rilevata una interruzione dovuta ad
-un segnale.
+il gestore per impostare il valore di una qualche variabile globale, e poi si
+eseguono le operazioni complesse nel programma verificando (con tutti gli
+accorgimenti visti in precedenza) il valore di questa variabile tutte le volte
+che si è rilevata una interruzione dovuta ad 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
@@ -2515,19 +2664,19 @@ di segnali ed eventi attraverso l'uso di file descriptor.
 Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi
 \textit{real-time}, ha introdotto una estensione del modello classico dei
 segnali che presenta dei significativi miglioramenti,\footnote{questa
-  estensione è stata introdotta in Linux a partire dal kernel 2.1.43, e dalle
-  \acr{glibc} 2.1.} in particolare sono stati superati tre limiti fondamentali
-dei segnali classici:
+  estensione è stata introdotta in Linux a partire dal kernel 2.1.43, e dalla
+  versione 2.1 della \acr{glibc}.} in particolare sono stati superati tre
+limiti fondamentali dei segnali classici:
 \begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}}
-\item[I segnali non sono accumulati
+\item[\textbf{I segnali non sono accumulati}
   se più segnali vengono generati prima dell'esecuzione di un gestore
   questo sarà eseguito una sola volta, ed il processo non sarà in grado di
-  accorgersi di quante volte l'evento che ha generato il segnale è accaduto;
-\item[I segnali non trasportano informazione]   
+  accorgersi di quante volte l'evento che ha generato il segnale è accaduto.
+\item[\textbf{I segnali non trasportano informazione}]   
   i segnali classici non prevedono altra informazione sull'evento
   che li ha generati se non il fatto che sono stati emessi (tutta
-  l'informazione che il kernel associa ad un segnale è il suo numero);
-\item[I segnali non hanno un ordine di consegna
+  l'informazione che il kernel associa ad un segnale è il suo numero).
+\item[\textbf{I segnali non hanno un ordine di consegna}
   l'ordine in cui diversi segnali vengono consegnati è casuale e non
   prevedibile. Non è possibile stabilire una priorità per cui la reazione a
   certi segnali ha la precedenza rispetto ad altri.
@@ -2542,10 +2691,10 @@ funzionalità aggiunte sono:
 \item i segnali sono inseriti in una coda che permette di consegnare istanze
   multiple dello stesso segnale qualora esso venga inviato più volte prima
   dell'esecuzione del gestore; si assicura così che il processo riceva un
-  segnale per ogni occorrenza dell'evento che lo genera.
+  segnale per ogni occorrenza dell'evento che lo genera;
 \item è stata introdotta una priorità nella consegna dei segnali: i segnali
   vengono consegnati in ordine a seconda del loro valore, partendo da quelli
-  con un numero minore, che pertanto hanno una priorità maggiore.
+  con un numero minore, che pertanto hanno una priorità maggiore;
 \item è stata introdotta la possibilità di restituire dei dati al gestore,
   attraverso l'uso di un apposito campo \var{si\_value} nella struttura
   \struct{siginfo\_t}, accessibile tramite gestori di tipo
@@ -2556,19 +2705,19 @@ Tutte queste nuove funzionalità eccetto l'ultima, che, come illustrato in
 sez.~\ref{sec:sig_sigaction}, è disponibile anche con i segnali ordinari, si
 applicano solo ai nuovi segnali \textit{real-time}; questi ultimi sono
 accessibili in un intervallo di valori specificati dalle due costanti
-\const{SIGRTMIN} e \const{SIGRTMAX}, che specificano il numero minimo e
+\constd{SIGRTMIN} e \constd{SIGRTMAX}, che specificano il numero minimo e
 massimo associato ad un segnale \textit{real-time}.
 
 Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1},
 che di norma (vale a dire sulla piattaforma i386) è 64. Questo dà un totale di
 32 segnali disponibili, contro gli almeno 8 richiesti da POSIX.1b. Si tenga
-presente però che i primi segnali \textit{real-time} disponibili vendono usati
-dalle \acr{glibc} per l'implementazione dei \textit{thread} POSIX (vedi
+presente però che i primi segnali \textit{real-time} disponibili vengono usati
+dalla \acr{glibc} per l'implementazione dei \textit{thread} POSIX (vedi
 sez.~\ref{sec:thread_posix_intro}), ed il valore di \const{SIGRTMIN} viene
-modificato di conseguenza.\footnote{vengono usati i primi tre per la vecchia
-  implementazione dei \textit{LinuxThread} ed i primi due per la nuova NTPL
-  (\textit{New Thread Posix Library}), il che comporta che \const{SIGRTMIN} a
-  seconda dei casi può essere 34 o 35.}
+modificato di conseguenza.\footnote{per la precisione vengono usati i primi
+  tre per la vecchia implementazione dei \textit{LinuxThread} ed i primi due
+  per la nuova NTPL (\textit{New Thread Posix Library}), il che comporta che
+  \const{SIGRTMIN} a seconda dei casi può assumere i valori 34 o 35.}
 
 Per questo motivo nei programmi che usano i segnali \textit{real-time} non si
 deve mai usare un valore assoluto dato che si correrebbe il rischio di
@@ -2582,134 +2731,141 @@ consegnati per primi, inoltre i segnali \textit{real-time} non possono
 interrompere l'esecuzione di un gestore di un segnale a priorità più alta; la
 loro azione predefinita è quella di terminare il programma.  I segnali
 ordinari hanno tutti la stessa priorità, che è più alta di quella di qualunque
-segnale \textit{real-time}.\footnote{lo standard non definisce niente al
-  riguardo ma Linux, come molte altre implementazioni, adotta questa
-  politica.}
+segnale \textit{real-time}. Lo standard non definisce niente al riguardo ma
+Linux, come molte altre implementazioni, adotta questa politica.
 
 Si tenga presente che questi nuovi segnali non sono associati a nessun evento
 specifico, a meno di non richiedere specificamente il loro utilizzo in
 meccanismi di notifica come quelli per l'I/O asincrono (vedi
 sez.~\ref{sec:file_asyncronous_io}) o per le code di messaggi POSIX (vedi
-sez.~\ref{sec:ipc_posix_mq}); pertanto devono essere inviati esplicitamente.
+sez.~\ref{sec:ipc_posix_mq}), pertanto devono essere inviati esplicitamente.
 
 Inoltre, per poter usufruire della capacità di restituire dei dati, i relativi
 gestori devono essere installati con \func{sigaction}, specificando per
 \var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare la
-forma estesa \var{sa\_sigaction} (vedi sez.~\ref{sec:sig_sigaction}).  In
-questo modo tutti i segnali \textit{real-time} possono restituire al gestore
-una serie di informazioni aggiuntive attraverso l'argomento
-\struct{siginfo\_t}, la cui definizione è stata già vista in
-fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa.
+forma estesa \var{sa\_sigaction} del gestore (vedi
+sez.~\ref{sec:sig_sigaction}).  In questo modo tutti i segnali
+\textit{real-time} possono restituire al gestore una serie di informazioni
+aggiuntive attraverso l'argomento \struct{siginfo\_t}, la cui definizione è
+stata già vista in fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori
+in forma estesa.
 
 In particolare i campi utilizzati dai segnali \textit{real-time} sono
 \var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il
-\ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale, mentre
-per la restituzione dei dati viene usato il campo \var{si\_value}.
+\ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale,
+mentre per la restituzione dei dati viene usato il campo \var{si\_value}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/sigval_t.h}
   \end{minipage} 
   \normalsize 
   \caption{La definizione dell'unione \structd{sigval}, definita anche come
-    tipo \type{sigval\_t}.}
+    tipo \typed{sigval\_t}.}
   \label{fig:sig_sigval}
 \end{figure}
 
-Questo è una \direct{union} di tipo \struct{sigval} (la sua definizione è in
+Detto campo, identificato con il tipo di dato \type{sigval\_t}, è una
+\dirct{union} di tipo \struct{sigval} (la sua definizione è in
 fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico,
-se usata nella forma \var{sival\_int}, o un indirizzo, se usata nella forma
+se usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma
 \var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
-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}.
+vari meccanismi di notifica per restituire dati al gestore del segnale in
+\var{si\_value}. 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}).
 
 A causa delle loro caratteristiche, la funzione \func{kill} non è adatta ad
 inviare segnali \textit{real-time}, poiché non è in grado di fornire alcun
-valore per \struct{sigval}; per questo motivo lo standard ha previsto una
-nuova funzione, \funcd{sigqueue}, il cui prototipo è:
-\begin{prototype}{signal.h}
-  {int sigqueue(pid\_t pid, int signo, const union sigval value)}
-  
-  Invia il segnale \param{signo} al processo \param{pid}, restituendo al
-  gestore il valore \param{value}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+valore per il campo \var{si\_value} restituito nella struttura
+\struct{siginfo\_t} prevista da un gestore in forma estesa. Per questo motivo
+lo standard ha previsto una nuova funzione, \funcd{sigqueue}, il cui prototipo
+è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigqueue(pid\_t pid, int signo, const union sigval value)}
+\fdesc{Invia un segnale con un valore di informazione.} 
+}
+
+{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{EAGAIN}] la coda è esaurita, ci sono già
     \const{SIGQUEUE\_MAX} segnali in attesa si consegna.
+  \item[\errcode{EINVAL}] si è specificato un valore non valido per
+    \param{signo}.
   \item[\errcode{EPERM}] non si hanno privilegi appropriati per inviare il
     segnale al processo specificato.
   \item[\errcode{ESRCH}] il processo \param{pid} non esiste.
-  \item[\errcode{EINVAL}] si è specificato un valore non valido per
-    \param{signo}.
   \end{errlist}
-  ed inoltre \errval{ENOMEM}.}
-\end{prototype}
+}
+\end{funcproto}
 
-Il comportamento della funzione è analogo a quello di \func{kill}, ed i
-privilegi occorrenti ad inviare il segnale ad un determinato processo sono gli
-stessi; un valore nullo di \param{signo} permette di verificare le condizioni
-di errore senza inviare nessun segnale.
+
+La funzione invia il segnale indicato dall'argomento \param{signo} al processo
+indicato dall'argomento \param{pid}. Per il resto il comportamento della
+funzione è analogo a quello di \func{kill}, ed i privilegi occorrenti ad
+inviare il segnale ad un determinato processo sono gli stessi; un valore nullo
+di \param{signo} permette di verificare le condizioni di errore senza inviare
+nessun segnale.
 
 Se il segnale è bloccato la funzione ritorna immediatamente, se si è
 installato un gestore con \const{SA\_SIGINFO} e ci sono risorse disponibili,
 (vale a dire che c'è posto nella coda dei segnali \textit{real-time}) esso
-viene inserito e diventa pendente; una volta consegnato riporterà nel campo
-\var{si\_code} di \struct{siginfo\_t} il valore \const{SI\_QUEUE} e il campo
-\var{si\_value} riceverà quanto inviato con \param{value}. Se invece si è
-installato un gestore nella forma classica il segnale sarà generato, ma tutte
-le caratteristiche tipiche dei segnali \textit{real-time} (priorità e coda)
-saranno perse.
-
-Secondo lo standard POSIX la profondità della coda è indicata dalla costante
-\const{SIGQUEUE\_MAX},\footnote{una della tante costanti di sistema definite
-  dallo standard POSIX che non abbiamo riportato esplicitamente in
-  sez.~\ref{sec:sys_limits}.} il suo valore minimo secondo lo standard,
-\const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una
+viene inserito e diventa pendente. Una volta consegnato il segnale il gestore
+otterrà nel campo \var{si\_code} di \struct{siginfo\_t} il valore
+\const{SI\_QUEUE} e nel campo \var{si\_value} il valore indicato
+nell'argomento \param{value}. Se invece si è installato un gestore nella forma
+classica il segnale sarà generato, ma tutte le caratteristiche tipiche dei
+segnali \textit{real-time} (priorità e coda) saranno perse.
+
+Per lo standard POSIX la profondità della coda è indicata dalla costante
+\constd{SIGQUEUE\_MAX}, una della tante costanti di sistema definite dallo
+standard POSIX che non abbiamo riportato esplicitamente in
+sez.~\ref{sec:sys_limits}. Il suo valore minimo secondo lo standard,
+\macrod{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una
 dimensione variabile; fino alla versione 2.6.7 c'era un limite massimo globale
 che poteva essere impostato come parametro del kernel in
-\sysctlfile{kernel/rtsig-max};\footnote{ed il valore predefinito era
-  pari a 1024.} a partire dal kernel 2.6.8 il valore globale è stato rimosso e
-sostituito dalla risorsa \const{RLIMIT\_SIGPENDING} associata al singolo
-utente, che può essere modificata con \func{setrlimit} come illustrato in
+\sysctlfiled{kernel/rtsig-max} ed il valore predefinito era pari a 1024. A
+partire dal kernel 2.6.8 il valore globale è stato rimosso e sostituito dalla
+risorsa \const{RLIMIT\_SIGPENDING} associata al singolo utente, che può essere
+modificata con \func{setrlimit} come illustrato in
 sez.~\ref{sec:sys_resource_limit}.
 
-Lo standard POSIX.1b definisce inoltre delle nuove funzioni che permettono di
-gestire l'attesa di segnali specifici su una coda, esse servono in particolar
-modo nel caso dei \itindex{thread} \textit{thread}, in cui si possono usare i
+Lo standard POSIX.1b definisce inoltre delle nuove funzioni di sistema che
+permettono di gestire l'attesa di segnali specifici su una coda, esse servono
+in particolar modo nel caso dei \textit{thread}, in cui si possono usare i
 segnali \textit{real-time} come meccanismi di comunicazione elementare; la
-prima di queste funzioni è \funcd{sigwait}, il cui prototipo è:
-\begin{prototype}{signal.h}
-  {int sigwait(const sigset\_t *set, int *sig)}
-  
-  Attende che uno dei segnali specificati in \param{set} sia pendente.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
+prima di queste è \funcd{sigwait}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigwait(const sigset\_t *set, int *sig)}
+\fdesc{Attende la ricezione di 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{EINTR}] la funzione è stata interrotta.
   \item[\errcode{EINVAL}] si è specificato un valore non valido per
-    \param{set}.
   \end{errlist}
-  ed inoltre \errval{EFAULT}.}
-\end{prototype}
-
-La funzione estrae dall'insieme dei segnali pendenti uno qualunque dei segnali
-specificati da \param{set}, il cui valore viene restituito in \param{sig}.  Se
-sono pendenti più segnali, viene estratto quello a priorità più alta (cioè con
-il numero più basso). Se, nel caso di segnali \textit{real-time}, c'è più di
-un segnale pendente, ne verrà estratto solo uno. Una volta estratto il segnale
-non verrà più consegnato, e se era in una coda il suo posto sarà liberato. Se
-non c'è nessun segnale pendente il processo viene bloccato fintanto che non ne
-arriva uno.
+  ed inoltre \errval{EFAULT} nel suo significato generico.}
+\end{funcproto}
+
+La funzione estrae dall'insieme dei segnali pendenti uno qualunque fra quelli
+indicati nel \textit{signal set} specificato in \param{set}, il cui valore
+viene restituito nella variabile puntata da \param{sig}.  Se sono pendenti più
+segnali, viene estratto quello a priorità più alta, cioè quello con il numero
+più basso. Se, nel caso di segnali \textit{real-time}, c'è più di un segnale
+pendente, ne verrà estratto solo uno. Una volta estratto il segnale non verrà
+più consegnato, e se era in una coda il suo posto sarà liberato. Se non c'è
+nessun segnale pendente il processo viene bloccato fintanto che non ne arriva
+uno.
 
 Per un funzionamento corretto la funzione richiede che alla sua chiamata i
 segnali di \param{set} siano bloccati. In caso contrario si avrebbe un
@@ -2719,49 +2875,45 @@ comportamento del sistema è indeterminato: il segnale può sia essere
 consegnato che essere ricevuto da \func{sigwait}, il tutto in maniera non
 prevedibile.
 
-Lo standard POSIX.1b definisce altre due funzioni, anch'esse usate
-prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e
+Lo standard POSIX.1b definisce altre due funzioni di sistema, anch'esse usate
+prevalentemente con i \textit{thread}; \funcd{sigwaitinfo} e
 \funcd{sigtimedwait}, i relativi prototipi sono:
-\begin{functions}
-  \headdecl{signal.h}   
 
-  \funcdecl{int sigwaitinfo(const sigset\_t *set, siginfo\_t *info)}  
-  
-  Analoga a \func{sigwait}, ma riceve anche le informazioni associate al
-  segnale in \param{info}.
-  
-  \funcdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const
-    struct timespec *timeout)}
-  
-  Analoga a \func{sigwaitinfo}, con un la possibilità di specificare un
-  timeout in \param{timeout}.
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigwaitinfo(const sigset\_t *set, siginfo\_t *info)}
+\fdesc{Attende un segnale con le relative informazioni.}
+\fdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const
+  struct timespec *timeout)}
+\fdesc{Attende un segnale con le relative informazioni per un tempo massimo.}
+}
 
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori già visti per
-    \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}:
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno gli stessi valori di \func{sigwait} ai quali
+  si aggiunge per \func{sigtimedwait}:
   \begin{errlist}
   \item[\errcode{EAGAIN}] si è superato il timeout senza che un segnale atteso
-    fosse emesso.
+    sia stato ricevuto.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
+
 
 Entrambe le funzioni sono estensioni di \func{sigwait}. La prima permette di
 ricevere, oltre al numero del segnale, anche le informazioni ad esso associate
-tramite \param{info}; in particolare viene restituito il numero del segnale
-nel campo \var{si\_signo}, la sua causa in \var{si\_code}, e se il segnale è
-stato immesso sulla coda con \func{sigqueue}, il valore di ritorno ad esso
-associato viene riportato in \var{si\_value}, che altrimenti è indefinito. 
-
-La seconda è identica alla prima ma in più permette di specificare un timeout,
-scaduto il quale ritornerà con un errore. Se si specifica un puntatore nullo
-il comportamento sarà identico a \func{sigwaitinfo}, se si specifica un tempo
-di timeout nullo, e non ci sono segnali pendenti la funzione ritornerà
-immediatamente; in questo modo si può eliminare un segnale dalla coda senza
-dover essere bloccati qualora esso non sia presente.
+tramite l'argomento \param{info}; in particolare viene restituito il numero
+del segnale nel campo \var{si\_signo}, la sua causa in \var{si\_code}, e se il
+segnale è stato immesso sulla coda con \func{sigqueue}, il valore di ritorno
+ad esso associato viene riportato in \var{si\_value}, che altrimenti è
+indefinito.
 
-\itindbeg{thread} 
+La seconda è identica alla prima ma in più permette di specificare un timeout
+con l'argomento omonimo, scaduto il quale ritornerà con un errore. Se si
+specifica per \param{timeout} un puntatore nullo il comportamento sarà
+identico a \func{sigwaitinfo}. Se si specifica un tempo di timeout nullo e non
+ci sono segnali pendenti la funzione ritornerà immediatamente, in questo modo
+si può eliminare un segnale dalla coda senza dover essere bloccati qualora
+esso non sia presente.
 
 L'uso di queste funzioni è principalmente associato alla gestione dei segnali
 con i \textit{thread}. In genere esse vengono chiamate dal \textit{thread}
@@ -2774,8 +2926,6 @@ che venga eseguita l'azione predefinita, devono essere mascherati per tutti i
 \textit{thread}, compreso quello dedicato alla gestione, che potrebbe
 riceverlo fra due chiamate successive.
 
-\itindend{thread} 
-
 
 \subsection{La gestione avanzata delle temporizzazioni}
 \label{sec:sig_timer_adv}
@@ -2784,24 +2934,27 @@ 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
 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 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
-  \func{setitimer}, problemi per il massimo periodo di tempo copribile da
-  alcuni di questi orologi, come quelli associati al \textit{process time}
-  almeno fino a quando, con il kernel 2.6.16, non è stato rimosso il limite di
-  un valore a 32 bit per i \textit{jiffies}.}
+dal timer di sistema che governa lo \textit{scheduler}, 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 tempi infatti erano basati sul numero di
+\textit{jiffies} che vengono incrementati ad ogni \textit{clock tick} del
+timer di sistema, il che comportava anche, come accennato in
+sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per il massimo
+periodo di tempo copribile da alcuni di questi orologi, come quelli associati
+al \textit{process time} almeno fino a quando, con il kernel 2.6.16, non è
+stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}.
+
+\itindbeg{POSIX~Timer~API}
 
 Nelle architetture moderne però tutti i computer sono dotati di temporizzatori
 hardware che possono supportare risoluzioni molto elevate, ed in maniera del
 tutto indipendente dalla frequenza scelta per il timer di sistema che governa
-lo \textit{scheduler};\footnote{normalmente si possono ottenere precisioni
-  fino al microsecondo, andando molto oltre in caso di hardware dedicato.} per
-questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni
+lo \textit{scheduler}, normalmente si possono ottenere precisioni fino al
+microsecondo, andando molto oltre in caso di hardware dedicato. 
+
+Per questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni
 relative a quelli che vengono chiamati ``\textsl{orologi}
 \textit{real-time}'', in grado di supportare risoluzioni fino al
 nanosecondo. Inoltre le CPU più moderne sono dotate a loro volta di contatori
@@ -2810,29 +2963,29 @@ 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
-\itindex{high~resolution~timer} \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ò
-erano già presenti, essendo stata introdotte insieme ad altre funzioni per il
-supporto delle estensioni \textit{real-time} con il rilascio del kernel 2.6,
-ma la risoluzione effettiva era nominale.
+\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{per il supporto deve essere stata
+  abilitata l'opzione di compilazione \texttt{CONFIG\_HIGH\_RES\_TIMERS}, il
+  supporto era però disponibile anche in precedenza nei patch facenti parte
+  dello sviluppo delle estensioni \textit{real-time} del kernel, per cui
+  alcune distribuzioni possono averlo anche con versioni precedenti del
+  kernel.} Le funzioni definite dallo standard POSIX per gestire orologi ad
+alta definizione però erano già presenti, essendo stata introdotte insieme ad
+altre funzioni per il supporto delle estensioni \textit{real-time} con il
+rilascio del kernel 2.6, ma la risoluzione effettiva era nominale.
 
 A tutte le implementazioni che si rifanno a queste estensioni è richiesto di
 disporre di una versione \textit{real-time} almeno per l'orologio generale di
 sistema, quello che mantiene il \textit{calendar time} (vedi
 sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di
 secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The
-  Epoch}).\footnote{si ricordi che l'orologio ordinario usato dal
-  \textit{calendar time} riporta solo un numero di secondi, e che la
-  risoluzione effettiva normalmente non raggiunge il nanosecondo (a meno di
-  hardware specializzato).}  Oltre all'orologio generale di sistema possono
-essere presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali
-viene identificato da un opportuno valore di una variabile di tipo
+  Epoch}). Si ricordi infatti che l'orologio ordinario usato dal
+\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione
+effettiva normalmente non raggiunge il nanosecondo (a meno di hardware
+specializzato).  Oltre all'orologio generale di sistema possono essere
+presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene
+identificato da un opportuno valore di una variabile di tipo
 \type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in
 tab.~\ref{tab:sig_timer_clockid_types}.
 
@@ -2844,87 +2997,112 @@ tab.~\ref{tab:sig_timer_clockid_types}.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{CLOCK\_REALTIME}     & Orologio \textit{real-time} di sistema, può
+    \constd{CLOCK\_REALTIME}    & Orologio \textit{real-time} di sistema, può
                                   essere impostato solo con privilegi
                                   amministrativi.\\ 
-    \const{CLOCK\_MONOTONIC}    & Orologio che indica un tempo monotono
+    \constd{CLOCK\_MONOTONIC}   & Orologio che indica un tempo monotono
                                   crescente (a partire da un tempo iniziale non
                                   specificato) che non può essere modificato e
                                   non cambia neanche in caso di reimpostazione
                                   dell'orologio di sistema.\\
-    \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli
-                                  aggiustamenti dovuti all'uso di NTP (viene
-                                  usato per fare riferimento ad una fonte
-                                  hardware).\footnotemark\\
-    \const{CLOCK\_PROCESS\_CPUTIME\_ID}& contatore del tempo di CPU usato 
+    \constd{CLOCK\_PROCESS\_CPUTIME\_ID}& Contatore del tempo di CPU usato 
                                   da un processo (il \textit{process time} di
                                   sez.~\ref{sec:sys_cpu_times}, nel totale di
                                   \textit{system time} e \textit{user time})
                                   comprensivo di tutto il tempo di CPU usato
-                                  da eventuali \itindex{thread}
-                                  \textit{thread}.\\
-    \const{CLOCK\_THREAD\_CPUTIME\_ID}& contatore del tempo di CPU
+                                  da eventuali \textit{thread}.\\
+    \constd{CLOCK\_THREAD\_CPUTIME\_ID}& Contatore del tempo di CPU
                                   (\textit{user time} e \textit{system time})
-                                  usato da un singolo \itindex{thread}
-                                  \textit{thread}.\\
+                                  usato da un singolo \textit{thread}.\\
+    \hline
+    \constd{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli
+                                  aggiustamenti dovuti all'uso di NTP (viene
+                                  usato per fare riferimento ad una fonte
+                                  hardware). Questo orologio è specifico di
+                                  Linux, ed è disponibile a partire dal kernel
+                                  2.6.28.\\
+    \constd{CLOCK\_BOOTTIME}    & Identico a \const{CLOCK\_MONOTONIC} ma tiene
+                                  conto anche del tempo durante il quale il
+                                  sistema è stato sospeso (nel caso di
+                                  sospensione in RAM o \textsl{ibernazione} su
+                                  disco. Questo orologio è specifico di Linux,
+                                  ed è disponibile a partire dal kernel
+                                  2.6.39.\\
+    \constd{CLOCK\_REALTIME\_ALARM}&Identico a \const{CLOCK\_REALTIME}, ma se
+                                  usato per un timer il sistema sarà riattivato 
+                                  anche se è in sospensione. Questo orologio è
+                                  specifico di Linux, ed è disponibile a
+                                  partire dal kernel 3.0.\\
+    \constd{CLOCK\_BOOTTIME\_ALARM}&Identico a \const{CLOCK\_BOOTTIME}, ma se
+                                  usato per un timer il sistema sarà riattivato 
+                                  anche se è in sospensione. Questo orologio è
+                                  specifico di Linux, ed è disponibile a
+                                  partire dal kernel 3.0.\\
 %    \const{}   & .\\
     \hline
   \end{tabular}
-  \caption{Valori possibili per una variabile di tipo \type{clockid\_t} 
+  \caption{Valori possibili per una variabile di tipo \typed{clockid\_t} 
     usata per indicare a quale tipo di orologio si vuole fare riferimento.}
   \label{tab:sig_timer_clockid_types}
 \end{table}
 
-\footnotetext{specifico di Linux, introdotto a partire dal kernel 2.6.28, non
-  previsto da POSIX e non presente in altri sistemi unix-like.}
 
-% TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il
-% funzionamento, vedi http://lwn.net/Articles/429595/
-% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME, vedi
-% http://lwn.net/Articles/429925/
-% TODP: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
+% TODO: dal 4.17 CLOCK_MONOTONIC e CLOCK_BOOTTIME sono identici vedi
+% https://lwn.net/Articles/751651/ e
+% https://git.kernel.org/linus/d6ed449afdb38f89a7b38ec50e367559e1b8f71f
+% change reverted, vedi: https://lwn.net/Articles/752757/
+
+% NOTE: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
 % CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/
+% TODO: dal 3.10 anche CLOCK_TAI 
+
+% TODO seguire l'evoluzione delle nuove syscall per il problema del 2038,
+% iniziate ad entrare nel kernel dal 5.1, vedi
+% https://lwn.net/Articles/776435/, https://lwn.net/Articles/782511/,
+% https://git.kernel.org/linus/b1b988a6a035 
 
-Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la
+Per poter utilizzare queste funzionalità la \acr{glibc} richiede 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
-\macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e
-\macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi
+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 \macrod{\_POSIX\_TIMERS}
+ad un valore maggiore di 0, e che le ulteriori macro
+\macrod{\_POSIX\_MONOTONIC\_CLOCK}, \macrod{\_POSIX\_CPUTIME} e
+\macrod{\_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 \headfile{unistd.h}, che pertanto deve essere incluso per poterle
-  controllarle.} Infine se il kernel ha il supporto per gli \textit{high
+\const{CLOCK\_THREAD\_CPUTIME\_ID}; tutte queste macro sono definite 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}.
 
 Le due funzioni che ci consentono rispettivamente di modificare o leggere il
 valore per uno degli orologi \textit{real-time} sono \funcd{clock\_settime} e
 \funcd{clock\_gettime}; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{time.h}
 
-  \funcdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
-  \funcdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
-  
-  Imposta o legge un orologio \textit{real-time}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
+\fdesc{Imposta un orologio \textit{real-time}.} 
+\fdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
+\fdesc{Legge un orologio \textit{real-time}.} 
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
+  \item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido.
   \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è
     valido o il relativo orologio \textit{real-time} non è supportato dal
     sistema.
   \item[\errcode{EPERM}] non si ha il permesso di impostare l'orologio
     indicato (solo per \func{clock\_settime}).
-  \item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 Entrambe le funzioni richiedono che si specifichi come primo argomento il tipo
 di orologio su cui si vuole operare con uno dei valori di
@@ -2932,9 +3110,10 @@ tab.~\ref{tab:sig_timer_clockid_types} o con il risultato di una chiamata a
 \func{clock\_getcpuclockid} (che tratteremo a breve), il secondo argomento
 invece è sempre il puntatore \param{tp} ad una struttura \struct{timespec}
 (vedi fig.~\ref{fig:sys_timespec_struct}) che deve essere stata
-precedentemente allocata; nel primo caso questa dovrà anche essere stata
-inizializzata con il valore che si vuole impostare sull'orologio, mentre nel
-secondo verrà restituito al suo interno il valore corrente dello stesso.
+precedentemente allocata.  Per \func{clock\_settime} questa dovrà anche essere
+stata inizializzata con il valore che si vuole impostare sull'orologio, mentre
+per \func{clock\_gettime} verrà restituito al suo interno il valore corrente
+dello stesso.
 
 Si tenga presente inoltre che per eseguire un cambiamento sull'orologio
 generale di sistema \const{CLOCK\_REALTIME} occorrono i privilegi
@@ -2950,29 +3129,30 @@ possibilità di modifiche anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
 \const{CLOCK\_THREAD\_CPUTIME\_ID}, il kernel non le consente.
 
 Oltre alle due funzioni precedenti, lo standard POSIX prevede una terza
-funzione che consenta di ottenere la risoluzione effettiva fornita da un certo
-orologio, la funzione è \funcd{clock\_getres} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{time.h}
+funzione di sistema che consenta di ottenere la risoluzione effettiva fornita
+da un certo orologio, la funzione è \funcd{clock\_getres} ed il suo prototipo
+è:
 
-  \funcdecl{int clock\_getres(clockid\_t clockid, struct timespec *res)}
-  
-  Legge la risoluzione di un orologio \textit{real-time}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int clock\_getres(clockid\_t clockid, struct timespec *res)}
+\fdesc{Legge la risoluzione di un orologio \textit{real-time}.} 
+}
+
+{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{EFAULT}] l'indirizzo di \param{res} non è valido.
   \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è
     valido.
-  \item[\errcode{EFAULT}] l'indirizzo di \param{res} non è valido.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione richiede come primo argomento l'indicazione dell'orologio di cui
 si vuole conoscere la risoluzione (effettuata allo stesso modo delle due
 precedenti) e questa verrà restituita in una struttura \struct{timespec}
-all'indirizzo puntato dall'argomento \param{res}. 
+all'indirizzo puntato dall'argomento \param{res}.
 
 Come accennato il valore di questa risoluzione dipende sia dall'hardware
 disponibile che dalla implementazione delle funzioni, e costituisce il limite
@@ -2980,6 +3160,18 @@ minimo di un intervallo di tempo che si può indicare. Qualunque valore si
 voglia utilizzare nelle funzioni di impostazione che non corrisponda ad un
 multiplo intero di questa risoluzione, sarà troncato in maniera automatica. 
 
+Gli orologi elencati nella seconda sezione di
+tab.~\ref{tab:sig_timer_clockid_types} sono delle estensioni specifiche di
+Linux, create per rispondere ad alcune esigenze specifiche, come quella di
+tener conto di eventuali periodi di sospensione del sistema, e presenti solo
+nelle versioni più recenti del kernel. In particolare gli ultimi due,
+contraddistinti dal suffisso \texttt{\_ALARM}, hanno un impiego particolare,
+derivato dalle esigenze emerse con Android per l'uso di Linux sui cellulari,
+che consente di creare timer che possono scattare, riattivando il sistema,
+anche quando questo è in sospensione. Per il loro utilizzo è prevista la
+necessità di una capacità specifica, \const{CAP\_WAKE\_ALARM} (vedi
+sez.~\ref{sec:proc_capabilities}).
+
 Si tenga presente inoltre che con l'introduzione degli \textit{high resolution
   timer} i due orologi \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
 \const{CLOCK\_THREAD\_CPUTIME\_ID} fanno riferimento ai contatori presenti in
@@ -3008,27 +3200,27 @@ Per poter gestire questo tipo di problematiche lo standard ha previsto una
 apposita funzione che sia in grado di ottenere l'identificativo dell'orologio
 associato al \textit{process time} di un processo, la funzione è
 \funcd{clock\_getcpuclockid} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{time.h}
 
-  \funcdecl{int clock\_getcpuclockid(pid\_t pid, clockid\_t *clockid)}
-  
-  Ottiene l'identificatore dell'orologio di CPU usato da un processo.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo o un numero positivo
-    in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti
-    valori:
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int clock\_getcpuclockid(pid\_t pid, clockid\_t *clockid)}
+\fdesc{Ottiene l'identificatore dell'orologio di CPU usato da un processo.} 
+}
+
+{La funzione ritorna $0$ in caso di successo ed un numero positivo per un
+  errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOSYS}] non c'è il supporto per ottenere l'orologio relativo
     al \textit{process time} di un altro processo, e \param{pid} non
     corrisponde al processo corrente.
   \item[\errcode{EPERM}] il chiamante non ha il permesso di accedere alle
-    informazioni relative al processo \param{pid}.
+    informazioni relative al processo \param{pid}, avviene solo se è
+    disponibile il supporto per leggere l'orologio relativo ad un altro
+    processo.
   \item[\errcode{ESRCH}] non esiste il processo \param{pid}.
   \end{errlist}
 }
-\end{functions}
-
+\end{funcproto}
 
 La funzione ritorna l'identificativo di un orologio di sistema associato ad un
 processo indicato tramite l'argomento \param{pid}. Un utente normale, posto
@@ -3037,59 +3229,57 @@ può accedere soltanto ai dati relativi ai propri processi.
 
 Del tutto analoga a \func{clock\_getcpuclockid}, ma da utilizzare per ottenere
 l'orologio associato ad un \textit{thread} invece che a un processo, è
-\funcd{pthread\_getcpuclockid},\footnote{per poter usare la funzione, come per
+\funcd{pthread\_getcpuclockid},\footnote{per poterla utilizzare, come per
   qualunque funzione che faccia riferimento ai \textit{thread}, occorre
   effettuare il collegamento alla relativa libreria di gestione compilando il
   programma con \texttt{-lpthread}.} il cui prototipo è:
-\begin{functions}
-  \headdecl{pthread.h}
-  \headdecl{time.h}
 
-  \funcdecl{int pthread\_getcpuclockid(pthread\_t thread, clockid\_t *clockid)}
-  
-  Ottiene l'identificatore dell'orologio di CPU associato ad un
-  \textit{thread}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo o un numero positivo
-    in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti
-    valori:
+\begin{funcproto}{
+\fhead{pthread.h}
+\fhead{time.h}
+\fdecl{int pthread\_getcpuclockid(pthread\_t thread, clockid\_t *clockid)}
+\fdesc{Ottiene l'identificatore dell'orologio di CPU associato ad un
+  \textit{thread}.} 
+}
+
+{La funzione ritorna $0$ in caso di successo ed un numero positivo per un
+  errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOENT}] la funzione non è supportata dal sistema.
   \item[\errcode{ESRCH}] non esiste il \textit{thread} identificato
-    da \param{thread}.
   \end{errlist}
-}
-\end{functions}
+ }
+\end{funcproto}
 
-% TODO, dal 2.6.39 aggiunta clock_adjtime 
 
-% TODO manca clock_nanosleep, referenziata in sez.~\ref{sec:sig_gen_beha}
+% TODO, dal 2.6.39 aggiunta clock_adjtime 
 
 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
-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
-interfaccia è stata introdotta a partire dal kernel 2.6, anche se il supporto
-di varie funzionalità è stato aggiunto solo in un secondo tempo.
+da BSD presenti delle serie limitazioni, come 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 interfaccia è stata introdotta a partire dal
+kernel 2.6, anche se il supporto di varie funzionalità da essa previste è
+stato aggiunto solo in un secondo tempo.
 
 Una delle principali differenze della nuova interfaccia è che un processo può
 utilizzare un numero arbitrario di timer; questi vengono creati (ma non
-avviati) tramite la funzione \funcd{timer\_create}, il cui prototipo è:
-\begin{functions}
-  \headdecl{signal.h}
-  \headdecl{time.h}
+avviati) tramite la funzione di sistema \funcd{timer\_create}, il cui
+prototipo è:
 
-  \funcdecl{int timer\_create(clockid\_t clockid, struct sigevent *evp,
+\begin{funcproto}{
+\fhead{signal.h}
+\fhead{time.h}
+\fdecl{int timer\_create(clockid\_t clockid, struct sigevent *evp,
     timer\_t *timerid)}
-  
-  Crea un nuovo timer Posix.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
+\fdesc{Crea un nuovo timer POSIX.} 
+}
+
+{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{EAGAIN}] fallimento nel tentativo di allocare le strutture
     dei timer.
@@ -3099,27 +3289,29 @@ avviati) tramite la funzione \funcd{timer\_create}, il cui prototipo è:
   \item[\errcode{ENOMEM}] errore di allocazione della memoria.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione richiede tre argomenti: il primo argomento serve ad indicare quale
 tipo di orologio si vuole utilizzare e prende uno dei valori di
-tab.~\ref{tab:sig_timer_clockid_types},\footnote{di detti valori però non è
-  previsto l'uso di \const{CLOCK\_MONOTONIC\_RAW} mentre
-  \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID}
-  sono disponibili solo a partire dal kernel 2.6.12.} si può così fare
-riferimento sia ad un tempo assoluto che al tempo utilizzato dal processo (o
-\textit{thread}) stesso. 
+tab.~\ref{tab:sig_timer_clockid_types}; di detti valori però non è previsto
+l'uso di \const{CLOCK\_MONOTONIC\_RAW} mentre
+\const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID} sono
+disponibili solo a partire dal kernel 2.6.12. Si può così fare riferimento sia
+ad un tempo assoluto che al tempo utilizzato dal processo (o \textit{thread})
+stesso. Si possono inoltre utilizzare, posto di avere un kernel che li
+supporti, gli orologi aggiuntivi della seconda parte di
+tab.~\ref{tab:sig_timer_clockid_types}. 
 
 Il secondo argomento richiede una trattazione più dettagliata, in quanto
 introduce una struttura di uso generale, \struct{sigevent}, che viene
 utilizzata anche da altre funzioni, come quelle per l'I/O asincrono (vedi
 sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi
-sez.~\ref{sec:ipc_posix_mq})) e che serve ad indicare in maniera generica un
-meccanismo di notifica. 
+sez.~\ref{sec:ipc_posix_mq}) e che serve ad indicare in maniera generica un
+meccanismo di notifica.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/sigevent.h}
   \end{minipage} 
   \normalsize 
@@ -3129,13 +3321,13 @@ meccanismo di notifica.
 \end{figure}
 
 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
+riportata in fig.~\ref{fig:struct_sigevent}, 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
 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
@@ -3150,25 +3342,25 @@ effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{SIGEV\_NONE}    & Non viene inviata nessuna notifica.\\
-    \const{SIGEV\_SIGNAL}  & La notifica viene effettuata inviando al processo
+    \constd{SIGEV\_NONE}   & Non viene inviata nessuna notifica.\\
+    \constd{SIGEV\_SIGNAL} & La notifica viene effettuata inviando al processo
                              chiamante il segnale specificato dal campo
                              \var{sigev\_signo}; se il gestore di questo
                              segnale è stato installato con
                              \const{SA\_SIGINFO} gli verrà restituito il
                              valore specificato con \var{sigev\_value} (una
-                             \direct{union} \texttt{sigval}, la cui definizione
+                             \dirct{union} \texttt{sigval}, la cui definizione
                              è in fig.~\ref{fig:sig_sigval}) come valore del
                              campo \var{si\_value} di \struct{siginfo\_t}.\\
-    \const{SIGEV\_THREAD}  & La notifica viene effettuata creando un nuovo
-                             \itindex{thread} \textit{thread} che esegue la
-                             funzione di notifica specificata da
+    \constd{SIGEV\_THREAD} & La notifica viene effettuata creando un nuovo
+                             \textit{thread} che esegue la funzione di
+                             notifica specificata da 
                              \var{sigev\_notify\_function} con argomento
                              \var{sigev\_value}. Se questo è diverso da
                              \val{NULL}, il \textit{thread} viene creato con
                              gli attributi specificati da
                              \var{sigev\_notify\_attribute}.\footnotemark\\
-    \const{SIGEV\_THREAD\_ID}& Invia la notifica come segnale (con le stesse
+    \constd{SIGEV\_THREAD\_ID}& Invia la notifica come segnale (con le stesse
                              modalità di \const{SIGEV\_SIGNAL}) che però viene
                              recapitato al \textit{thread} indicato dal campo
                              \var{sigev\_notify\_thread\_id}. Questa modalità
@@ -3185,9 +3377,9 @@ effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione
 
 \footnotetext{nel caso dei \textit{timer} questa funzionalità è considerata un
   esempio di pessima implementazione di una interfaccia, richiesta dallo
-  standard POSIX, ma da evitare totalmente, a causa della possibilità di
-  creare disservizi generando una gran quantità di processi, tanto che ne è
-  stata richiesta addirittura la rimozione.}
+  standard POSIX, ma da evitare totalmente nell'uso ordinario, a causa della
+  possibilità di creare disservizi generando una gran quantità di processi,
+  tanto che ne è stata richiesta addirittura la rimozione.}
 
 Nel caso di \func{timer\_create} occorrerà passare alla funzione come secondo
 argomento l'indirizzo di una di queste strutture per indicare le modalità con
@@ -3199,7 +3391,7 @@ per \var{sigev\_notify}, \signal{SIGALRM} per \var{sigev\_signo} e
 l'identificatore del timer come valore per \var{sigev\_value.sival\_int}.
 
 Il terzo argomento deve essere l'indirizzo di una variabile di tipo
-\type{timer\_t} dove sarà scritto l'identificativo associato al timer appena
+\typed{timer\_t} dove sarà scritto l'identificativo associato al timer appena
 creato, da usare in tutte le successive funzioni di gestione. Una volta creato
 questo identificativo resterà univoco all'interno del processo stesso fintanto
 che il timer non viene cancellato.
@@ -3216,28 +3408,28 @@ sia stato impostato, dal limite \const{RLIMIT\_SIGPENDING}.
 
 Una volta creato il timer \func{timer\_create} ed ottenuto il relativo
 identificatore, si può attivare o disattivare un allarme (in gergo
-\textsl{armare} o \textsl{disarmare} il timer) con la funzione
+\textsl{armare} o \textsl{disarmare} il timer) con la funzione di sistema
 \funcd{timer\_settime}, il cui prototipo è:
-\begin{functions}
-  \headdecl{signal.h}
-  \headdecl{time.h}
 
-  \funcdecl{int timer\_settime(timer\_t timerid, int flags, const struct
+\begin{funcproto}{
+\fhead{signal.h}
+\fhead{time.h}
+\fdecl{int timer\_settime(timer\_t timerid, int flags, const struct
     itimerspec *new\_value, struct itimerspec *old\_value)}
-  
-  Arma o disarma il timer POSIX.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
+\fdesc{Arma o disarma un timer POSIX.} 
+}
+
+{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{EFAULT}] si è specificato un indirizzo non valido
+    per \param{new\_value} o \param{old\_value}.
   \item[\errcode{EINVAL}] all'interno di \param{new\_value.value} si è
     specificato un tempo negativo o un numero di nanosecondi maggiore di
     999999999.
-  \item[\errcode{EFAULT}] si è specificato un indirizzo non valido
-    per \param{new\_value} o \param{old\_value}.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione richiede che si indichi la scadenza del timer con
 l'argomento \param{new\_value}, che deve essere specificato come puntatore ad
@@ -3249,7 +3441,7 @@ state allocate.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/itimerspec.h}
   \end{minipage} 
   \normalsize 
@@ -3265,17 +3457,19 @@ con una precisione fino al nanosecondo tramite una struttura \struct{timespec}
 valore di \param{flags} è nullo, questo valore viene considerato come un
 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
+per \param{flags} il valore \constd{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.
+timer. 
+
+Quindi a seconda dei casi si potrà impostare un timer o con 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 con un 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}, dove 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
@@ -3294,36 +3488,36 @@ programma che riceve l'allarme su un eventuale numero di scadenze che sono
 passate prima della ricezione della notifica dell'allarme. 
 
 É infatti possibile, qualunque sia il meccanismo di notifica scelto, che
-quest'ultima venga ricevuta dopo che il timer è scaduto più di una
-volta.\footnote{specialmente se si imposta un timer con una ripetizione a
-  frequenza elevata.} Nel caso dell'uso di un segnale infatti il sistema mette
-in coda un solo segnale per timer,\footnote{questo indipendentemente che si
-  tratti di un segnale ordinario o \textit{real-time}; per questi ultimi
-  sarebbe anche possibile inviare un segnale per ogni scadenza, questo però
-  non viene fatto per evitare il rischio, tutt'altro che remoto, di riempire
-  la coda.}  e se il sistema è sotto carico o se il segnale è bloccato, prima
-della sua ricezione può passare un intervallo di tempo sufficientemente lungo
-ad avere scadenze multiple, e lo stesso può accadere anche se si usa un
-\textit{thread} di notifica. 
+quest'ultima venga ricevuta dopo che il timer è scaduto più di una volta,
+specialmente se si imposta un timer con una ripetizione a frequenza
+elevata. Nel caso dell'uso di un segnale infatti il sistema mette in coda un
+solo segnale per timer,\footnote{questo indipendentemente che si tratti di un
+  segnale ordinario o \textit{real-time}, per questi ultimi sarebbe anche
+  possibile inviare un segnale per ogni scadenza, questo però non viene fatto
+  per evitare il rischio, tutt'altro che remoto, di riempire la coda.} e se il
+sistema è sotto carico o se il segnale è bloccato, prima della sua ricezione
+può passare un intervallo di tempo sufficientemente lungo ad avere scadenze
+multiple, e lo stesso può accadere anche se si usa un \textit{thread} di
+notifica.
 
 Per questo motivo il gestore del segnale o il \textit{thread} di notifica può
 ottenere una indicazione di quante volte il timer è scaduto dall'invio della
-notifica utilizzando la funzione \funcd{timer\_getoverrun}, il cui prototipo è:
-\begin{functions}
-  \headdecl{time.h}
+notifica utilizzando la funzione di sistema \funcd{timer\_getoverrun}, il cui
+prototipo è:
 
-  \funcdecl{int timer\_getoverrun(timer\_t timerid)}
-  
-  Ottiene il numero di scadenze di un timer POSIX.
-  
-  \bodydesc{La funzione restituisce il numero di scadenze di un timer in caso
-    di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà
-    il valore:
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int timer\_getoverrun(timer\_t timerid)}
+\fdesc{Ottiene il numero di scadenze di un timer POSIX.} 
+}
+
+{La funzione ritorna il numero di scadenze di un timer in caso di successo e
+  $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione ritorna il numero delle scadenze avvenute, che può anche essere
 nullo se non ve ne sono state. Come estensione specifica di Linux,\footnote{in
@@ -3340,24 +3534,24 @@ informazione, l'identificativo del timer, in questo caso nel campo
 
 Qualora si voglia rileggere lo stato corrente di un timer, ed ottenere il
 tempo mancante ad una sua eventuale scadenza, si deve utilizzare la funzione
-\funcd{timer\_gettime}, il cui prototipo è:
-\begin{functions}
-  \headdecl{time.h}
+di sistema \funcd{timer\_gettime}, il cui prototipo è:
 
-  \funcdecl{int timer\_gettime(timer\_t timerid, int flags, struct
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int timer\_gettime(timer\_t timerid, int flags, struct
     itimerspec *curr\_value)}
-  
-  Legge lo stato di un timer POSIX.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
+\fdesc{Legge lo stato di un timer POSIX.} 
+}
+
+{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}] \param{timerid} non indica un timer valido.
   \item[\errcode{EFAULT}] si è specificato un indirizzo non valido
     per \param{curr\_value}.
+  \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione restituisce nella struttura \struct{itimerspec} puntata
 da \param{curr\_value} il tempo restante alla prossima scadenza nel campo
@@ -3375,29 +3569,85 @@ singolo (in gergo \textit{one shot}).
 
 Infine, quando un timer non viene più utilizzato, lo si può cancellare,
 rimuovendolo dal sistema e recuperando le relative risorse, effettuando in
-sostanza l'operazione inversa rispetto a \funcd{timer\_create}. Per questo
-compito lo standard prevede una apposita funzione \funcd{timer\_delete}, il
-cui prototipo è:
-\begin{functions}
-  \headdecl{time.h}
+sostanza l'operazione inversa rispetto a \func{timer\_create}. Per questo
+compito lo standard prevede una apposita funzione di sistema,
+\funcd{timer\_delete}, il cui prototipo è:
 
-  \funcdecl{int timer\_delete(timer\_t timerid)}
-  
-  Cancella un timer POSIX.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
-    \begin{errlist}
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int timer\_delete(timer\_t timerid)}
+\fdesc{Cancella un timer POSIX.} 
+}
+
+{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}] \param{timerid} non indica un timer valido.
-    \end{errlist}
+  \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 La funzione elimina il timer identificato da \param{timerid}, disarmandolo se
 questo era stato attivato. Nel caso, poco probabile ma comunque possibile, che
 un timer venga cancellato prima della ricezione del segnale pendente per la
 notifica di una scadenza, il comportamento del sistema è indefinito.
 
+Infine a partire dal kernel 2.6 e per le versioni della \acr{libc} superiori
+alla 2.1, si può utilizzare la nuova interfaccia dei timer POSIX anche per le
+funzioni di attesa, per questo è disponibile la funzione di sistema
+\funcd{clock\_nanosleep}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int clock\_nanosleep(clockid\_t clock\_id, int flags, const struct
+    timespec *request,\\
+\phantom{int clock\_nanosleep(}struct timespec *remain)}
+\fdesc{Pone il processo in pausa per un tempo specificato.}
+}
+
+{La funzione ritorna $0$ in caso di successo ed un valore positivo per un
+  errore, espresso dai valori:
+  \begin{errlist}
+    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+    \item[\errcode{EINVAL}] si è specificato un numero di secondi negativo o
+      un numero di nanosecondi maggiore di 999.999.999 o indicato un orologio
+      non valido.
+  \end{errlist}
+  ed inoltre \errval{EFAULT} nel suo significato generico.}
+\end{funcproto}
+
+I due argomenti \param{request} e \param{remain} sono identici agli analoghi di
+\func{nanosleep} che abbiamo visto in sez.~\ref{sec:sig_pause_sleep}, ed hanno
+lo stesso significato.  L'argomento \param{clock\_id} consente di indicare
+quale orologio si intende utilizzare per l'attesa con uno dei valori della
+prima parte di tab.~\ref{tab:sig_timer_clockid_types} (eccetto
+\const{CLOCK\_THREAD\_CPUTIME\_ID}).  L'argomento \param{flags} consente di
+modificare il comportamento della funzione, il suo unico valore valido al
+momento è \const{TIMER\_ABSTIME} che, come per \func{timer\_settime} indica di
+considerare il tempo indicato in \param{request} come assoluto anziché
+relativo.
+
+Il comportamento della funzione è analogo a \func{nanosleep}, se la chiamata
+viene interrotta il tempo rimanente viene restituito in \param{remain}.
+Utilizzata normalmente con attese relative può soffrire degli stessi problemi
+di deriva di cui si è parlato in sez.~\ref{sec:sig_pause_sleep} dovuti ad
+interruzioni ripetute per via degli arrotondamenti fatti a questo tempo.  Ma
+grazie alla possibilità di specificare tempi assoluti con \param{flags} si può
+ovviare a questo problema ricavando il tempo corrente con
+\func{clock\_gettime}, aggiungendovi l'intervallo di attesa, ed impostando
+questa come tempo assoluto.
+
+Si tenga presente che se si è usato il valore \const{TIMER\_ABSTIME}
+per \param{flags} e si è indicato un tempo assoluto che è già passato la
+funzione ritorna immediatamente senza nessuna sospensione. In caso di
+interruzione da parte di un segnale il tempo rimanente viene restituito
+in \param{remain} soltanto se questo non è un puntatore \val{NULL} e non si è
+specificato \const{TIMER\_ABSTIME} per \param{flags}.
+
+
+\itindend{POSIX~Timer~API}
+
+
 \subsection{Ulteriori funzioni di gestione}
 \label{sec:sig_specific_features}
 
@@ -3405,16 +3655,19 @@ In questo ultimo paragrafo esamineremo le rimanenti funzioni di gestione dei
 segnali non descritte finora, relative agli aspetti meno utilizzati e più
 ``\textsl{esoterici}'' della interfaccia.
 
-La prima di queste funzioni è \funcd{sigpending}, anch'essa introdotta dallo
-standard POSIX.1; il suo prototipo è:
-\begin{prototype}{signal.h}
-{int sigpending(sigset\_t *set)} 
-  
-Scrive in \param{set} l'insieme dei segnali pendenti.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
-    errore.}
-\end{prototype}
+La prima di queste funzioni è la funzione di sistema \funcd{sigpending},
+anch'essa introdotta dallo standard POSIX.1, il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigpending(sigset\_t *set)}
+\fdesc{Legge l'insieme dei segnali pendenti.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà solo il valore \errcode{EFAULT} nel suo
+  significato generico.}
+\end{funcproto}
 
 La funzione permette di ricavare quali sono i segnali pendenti per il processo
 in corso, cioè i segnali che sono stati inviati dal kernel ma non sono stati
@@ -3425,12 +3678,11 @@ escluderne l'avvenuto invio al momento della chiamata non significa nulla
 rispetto a quanto potrebbe essere in un qualunque momento successivo.
 
 Una delle caratteristiche di BSD, disponibile anche in Linux, è la possibilità
-di usare uno \itindex{stack} \textit{stack} alternativo per i segnali; è cioè
-possibile fare usare al sistema un altro \itindex{stack} \textit{stack}
-(invece di quello relativo al processo, vedi sez.~\ref{sec:proc_mem_layout})
-solo durante l'esecuzione di un gestore.  L'uso di uno \textit{stack}
-alternativo è del tutto trasparente ai gestori, occorre però seguire una certa
-procedura:
+di usare uno \textit{stack} alternativo per i segnali; è cioè possibile fare
+usare al sistema un altro \textit{stack} (invece di quello relativo al
+processo, vedi sez.~\ref{sec:proc_mem_layout}) solo durante l'esecuzione di un
+gestore.  L'uso di uno \textit{stack} alternativo è del tutto trasparente ai
+gestori, occorre però seguire una certa procedura:
 \begin{enumerate*}
 \item allocare un'area di memoria di dimensione sufficiente da usare come
   \textit{stack} alternativo;
@@ -3444,49 +3696,51 @@ procedura:
 
 In genere il primo passo viene effettuato allocando un'opportuna area di
 memoria con \code{malloc}; in \headfile{signal.h} sono definite due costanti,
-\const{SIGSTKSZ} e \const{MINSIGSTKSZ}, che possono essere utilizzate per
+\constd{SIGSTKSZ} e \constd{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}
-\textit{stack} di segnali e di norma è sufficiente per tutti gli usi normali.
+prima delle due è la dimensione canonica per uno \textit{stack} di segnali e
+di norma è sufficiente per tutti gli usi normali.
 
 La seconda è lo spazio che occorre al sistema per essere in grado di lanciare
 il gestore e la dimensione di uno \textit{stack} alternativo deve essere
 sempre maggiore di questo valore. Quando si conosce esattamente quanto è lo
 spazio necessario al gestore gli si può aggiungere questo valore per allocare
-uno \itindex{stack} \textit{stack} di dimensione sufficiente.
+uno \textit{stack} di dimensione sufficiente.
 
-Come accennato, per poter essere usato, lo \itindex{stack} \textit{stack} per
-i segnali deve essere indicato al sistema attraverso la funzione
-\funcd{sigaltstack}; il suo prototipo è:
-\begin{prototype}{signal.h}
-{int sigaltstack(const stack\_t *ss, stack\_t *oss)}
-  
-Installa un nuovo \textit{stack} per i segnali.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+Come accennato, per poter essere usato, lo \textit{stack} per i segnali deve
+essere indicato al sistema attraverso la funzione \funcd{sigaltstack}; il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{signal.h}
+\fdecl{int sigaltstack(const stack\_t *ss, stack\_t *oss)}
+\fdesc{Installa uno \textit{stack} alternativo per i gestori di segnali.} 
+}
 
+{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{EFAULT}] uno degli indirizzi degli argomenti non è valido.
+  \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un
+  valore diverso da zero che non è \const{SS\_DISABLE}.
   \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo
     \textit{stack} è minore di \const{MINSIGSTKSZ}.
-  \item[\errcode{EPERM}] uno degli indirizzi non è valido.
-  \item[\errcode{EFAULT}] si è cercato di cambiare lo \textit{stack}
+  \item[\errcode{EPERM}] si è cercato di cambiare lo \textit{stack}
     alternativo mentre questo è attivo (cioè il processo è in esecuzione su di
     esso).
-  \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un
-  valore diverso da zero che non è \const{SS\_DISABLE}.
-  \end{errlist}}
-\end{prototype}
+  \end{errlist}
+}
+\end{funcproto}
 
 La funzione prende come argomenti puntatori ad una struttura di tipo
 \var{stack\_t}, definita in fig.~\ref{fig:sig_stack_t}. I due valori
 \param{ss} e \param{oss}, se non nulli, indicano rispettivamente il nuovo
-\itindex{stack} \textit{stack} da installare e quello corrente (che viene
-restituito dalla funzione per un successivo ripristino).
+\textit{stack} da installare e quello corrente (che viene restituito dalla
+funzione per un successivo ripristino).
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.8\textwidth}
     \includestruct{listati/stack_t.h}
   \end{minipage} 
   \normalsize 
@@ -3495,82 +3749,80 @@ restituito dalla funzione per un successivo ripristino).
 \end{figure}
 
 Il campo \var{ss\_sp} di \struct{stack\_t} indica l'indirizzo base dello
-\itindex{stack} \textit{stack}, mentre \var{ss\_size} ne indica la dimensione;
-il campo \var{ss\_flags} invece indica lo stato dello \textit{stack}.
-Nell'indicare un nuovo \textit{stack} occorre inizializzare \var{ss\_sp} e
-\var{ss\_size} rispettivamente al puntatore e alla dimensione della memoria
-allocata, mentre \var{ss\_flags} deve essere nullo.  Se invece si vuole
-disabilitare uno \textit{stack} occorre indicare \const{SS\_DISABLE} come
-valore di \var{ss\_flags} e gli altri valori saranno ignorati.
+\textit{stack}, mentre \var{ss\_size} ne indica la dimensione; il campo
+\var{ss\_flags} invece indica lo stato dello \textit{stack}.  Nell'indicare un
+nuovo \textit{stack} occorre inizializzare \var{ss\_sp} e \var{ss\_size}
+rispettivamente al puntatore e alla dimensione della memoria allocata, mentre
+\var{ss\_flags} deve essere nullo.  Se invece si vuole disabilitare uno
+\textit{stack} occorre indicare \constd{SS\_DISABLE} come valore di
+\var{ss\_flags} e gli altri valori saranno ignorati.
 
 Se \param{oss} non è nullo verrà restituito dalla funzione indirizzo e
-dimensione dello \itindex{stack} \textit{stack} corrente nei relativi campi,
-mentre \var{ss\_flags} potrà assumere il valore \const{SS\_ONSTACK} se il
-processo è in esecuzione sullo \textit{stack} alternativo (nel qual caso non è
-possibile cambiarlo) e \const{SS\_DISABLE} se questo non è abilitato.
-
-In genere si installa uno \itindex{stack} \textit{stack} alternativo per i
-segnali quando si teme di avere problemi di esaurimento dello \textit{stack}
-standard o di superamento di un limite (vedi
-sez.~\ref{sec:sys_resource_limit}) imposto con chiamate del tipo
-\code{setrlimit(RLIMIT\_STACK, \&rlim)}.  In tal caso infatti si avrebbe un
-segnale di \signal{SIGSEGV}, che potrebbe essere gestito soltanto avendo
-abilitato uno \itindex{stack} \textit{stack} alternativo.
+dimensione dello \textit{stack} corrente nei relativi campi, mentre
+\var{ss\_flags} potrà assumere il valore \constd{SS\_ONSTACK} se il processo è
+in esecuzione sullo \textit{stack} alternativo (nel qual caso non è possibile
+cambiarlo) e \const{SS\_DISABLE} se questo non è abilitato.
+
+In genere si installa uno \textit{stack} alternativo per i segnali quando si
+teme di avere problemi di esaurimento dello \textit{stack} standard o di
+superamento di un limite (vedi sez.~\ref{sec:sys_resource_limit}) imposto con
+chiamate del tipo \code{setrlimit(RLIMIT\_STACK, \&rlim)}.  In tal caso
+infatti si avrebbe un segnale di \signal{SIGSEGV}, che potrebbe essere gestito
+soltanto avendo abilitato uno \textit{stack} alternativo.
 
 Si tenga presente che le funzioni chiamate durante l'esecuzione sullo
 \textit{stack} alternativo continueranno ad usare quest'ultimo, che, al
-contrario di quanto avviene per lo \itindex{stack} \textit{stack} ordinario
-dei processi, non si accresce automaticamente (ed infatti eccederne le
-dimensioni può portare a conseguenze imprevedibili).  Si ricordi infine che
-una chiamata ad una funzione della famiglia \func{exec} cancella ogni
-\textit{stack} alternativo.
+contrario di quanto avviene per lo \textit{stack} ordinario dei processi, non
+si accresce automaticamente (ed infatti eccederne le dimensioni può portare a
+conseguenze imprevedibili).  Si ricordi infine che una chiamata ad una
+funzione della famiglia \func{exec} cancella ogni \textit{stack} alternativo.
 
 Abbiamo visto in fig.~\ref{fig:sig_sleep_incomplete} come si possa usare
 \func{longjmp} per uscire da un gestore rientrando direttamente nel corpo
-del programma; sappiamo però che nell'esecuzione di un gestore il segnale
+del programma, sappiamo però che nell'esecuzione di un gestore il segnale
 che l'ha invocato viene bloccato, e abbiamo detto che possiamo ulteriormente
 modificarlo con \func{sigprocmask}. 
 
 Resta quindi il problema di cosa succede alla maschera dei segnali quando si
 esce da un gestore usando questa funzione. Il comportamento dipende
-dall'implementazione; in particolare la semantica usata da BSD prevede che sia
+dall'implementazione. In particolare la semantica usata da BSD prevede che sia
 ripristinata la maschera dei segnali precedente l'invocazione, come per un
 normale ritorno, mentre quella usata da System V no.
 
 Lo standard POSIX.1 non specifica questo comportamento per \func{setjmp} e
-\func{longjmp}, ed il comportamento delle \acr{glibc} dipende da quale delle
+\func{longjmp}, ed il comportamento della \acr{glibc} dipende da quale delle
 caratteristiche si sono abilitate con le macro viste in
 sez.~\ref{sec:intro_gcc_glibc_std}.
 
 Lo standard POSIX però prevede anche la presenza di altre due funzioni
-\funcd{sigsetjmp} e \funcd{siglongjmp}, che permettono di decidere quale dei
-due comportamenti il programma deve assumere; i loro prototipi sono:
-\begin{functions}
-  \headdecl{setjmp.h} 
-  
-  \funcdecl{int sigsetjmp(sigjmp\_buf env, int savesigs)} Salva il contesto
-  dello \textit{stack} per un \index{salto~non-locale} salto non-locale.
-  \funcdecl{void siglongjmp(sigjmp\_buf env, int val)} Esegue un salto
-  non-locale su un precedente contesto.
+\funcd{sigsetjmp} e \funcd{siglongjmp}, che permettono di decidere in maniera
+esplicita quale dei due comportamenti il programma deve assumere; i loro
+prototipi sono:
+
+\begin{funcproto}{
+\fhead{setjmp.h}
+\fdecl{int sigsetjmp(sigjmp\_buf env, int savesigs)}
+\fdesc{Salva il contesto dello \textit{stack} e la maschera dei segnali.}  
+\fdecl{void siglongjmp(sigjmp\_buf env, int val)}
+\fdesc{Ripristina il contesto dello \textit{stack} e la maschera dei segnali.} 
+}
 
-  \bodydesc{Le due funzioni sono identiche alle analoghe \func{setjmp} e
-    \func{longjmp} di sez.~\ref{sec:proc_longjmp}, ma consentono di specificare
-    il comportamento sul ripristino o meno della maschera dei segnali.}
-\end{functions}
+{La funzioni sono identiche alle analoghe \func{setjmp} e \func{longjmp} di
+  sez.~\ref{sec:proc_longjmp} ed hanno gli stessi errori e valori di uscita.}
+\end{funcproto}
 
 Le due funzioni prendono come primo argomento la variabile su cui viene
-salvato il contesto dello \itindex{stack} \textit{stack} per permettere il
-\index{salto~non-locale} salto non-locale; nel caso specifico essa è di tipo
-\type{sigjmp\_buf}, e non \type{jmp\_buf} come per le analoghe di
-sez.~\ref{sec:proc_longjmp} in quanto in questo caso viene salvata anche la
-maschera dei segnali.
+salvato il contesto dello \textit{stack} per permettere il salto non-locale;
+nel caso specifico essa è di tipo \typed{sigjmp\_buf}, e non \type{jmp\_buf}
+come per le analoghe di sez.~\ref{sec:proc_longjmp} in quanto in questo caso
+viene salvata anche la maschera dei segnali.
 
 Nel caso di \func{sigsetjmp}, se si specifica un valore di \param{savesigs}
-diverso da zero la maschera dei valori sarà salvata in \param{env} e
-ripristinata in un successivo \func{siglongjmp}; quest'ultima funzione, a
-parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a
-\func{longjmp}.
+diverso da zero la maschera dei valori verrà salvata in \param{env} insieme al
+contesto dello \textit{stack} usato per il salto non locale. Se così si è
+fatto la maschera dei segnali verrà ripristinata in una successiva chiamata a
+\func{siglongjmp}. Quest'ultima, a parte l'uso di un valore di \param{env} di
+tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}.
 
 
 % TODO: se e quando si troverà un argomento adeguato inserire altre funzioni
@@ -3579,6 +3831,27 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a
 % argomento a priorità IDLE (fare quando non resta niente altro da trattare)
 
 
+\subsection{I \textit{pidfd} e l'invio di segnali \textit{race-free}}
+\label{sec:sig_pid_fd}
+
+
+% TODO: trattare (qui?) pidfd_send_signal() introdotta con il kernel 5.1 vedi
+% https://lwn.net/Articles/784831/, https://lwn.net/Articles/773459/ e
+% https://lwn.net/Articles/801319/ 
+% oppure sopra in "Ulteriori funzioni di gestione"
+
+% TODO: Nuova subsection sui pidfd, e le funzioni correlate, in particolare:
+% trattare pidfd_send_signal, aggiunta con il kernel 5.1 (vedi
+% https://lwn.net/Articles/783052/) per mandare segnali a processi senza dover
+% usare un PID, vedi anche https://lwn.net/Articles/773459/,
+% https://git.kernel.org/linus/3eb39f47934f
+% trattare pure pidfd_open() (vedi https://lwn.net/Articles/789023/) per
+% ottere un pid fd pollabile aggiunta con il kernel 5.3
+% man pidfd_send_signal su le versioni più recenti della man pages
+
+
+
+
 % LocalWords:  kernel POSIX timer shell control ctrl kill raise signal handler
 % LocalWords:  reliable unreliable fig race condition sez struct process table
 % LocalWords:  delivered pending scheduler sigpending l'I suspend SIGKILL wait
@@ -3635,10 +3908,11 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a
 % LocalWords:  ENOSYS pthread ENOENT NULL attribute itimerspec new old ABSTIME
 % LocalWords:  epoch multiplexing overrun res lpthread sec nsec curr one shot
 % LocalWords:  delete stopped gdb alpha mips emulation locking ppoll epoll PGID
+% LocalWords:  pwait msgrcv msgsnd semop semtimedop runnable sigisemptyset HRT
+% LocalWords:  sigorset sigandset BOOTTIME Android request remain
 
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
-% LocalWords:  pwait msgrcv msgsnd semop semtimedop