Ancora sui timer e rimessi i prototipi delle funzioni
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 27 May 2012 16:17:11 +0000 (16:17 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 27 May 2012 16:17:11 +0000 (16:17 +0000)
filedir.tex
signal.tex

index 2891b774c2f01ac691513b32f0c2d9d6fc9985d2..8b1f942c9e86b8df58e47ce41fed4b0c01476eef 100644 (file)
@@ -6798,10 +6798,10 @@ operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}.
 \itindend{file~capabilities}
 
 
-% TODO verificare per process capability bounding set, vedi:
-%  http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
+% NOTE per dati relativi al process capability bounding set, vedi:
+% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
 
-% TODO capire cosa cambia con i patch vari, vedi
+% NOTE riferimenti ai vari cambiamenti vedi:
 % http://lwn.net/Articles/280279/  
 % http://lwn.net/Articles/256519/
 % http://lwn.net/Articles/211883/
@@ -6812,7 +6812,7 @@ breve descrizione ed il nome delle costanti che le identificano, è riportato
 in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
   tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
     capabilities}) e dalle definizioni in
-  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la
+  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
 tabella è divisa in due parti, la prima riporta le \textit{capabilities}
 previste anche nella bozza dello standard POSIX1.e, la seconda quelle
 specifiche di Linux.  Come si può notare dalla tabella alcune
@@ -6893,57 +6893,51 @@ opportuno dettagliare maggiormente.
                               sez.~\ref{sec:file_asyncronous_lease})
                               pur non essendo proprietari del file (dal kernel
                               2.4).\\ 
-    \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli
-                              attributi \textit{immutable} e
-                              \itindex{append~mode} \textit{append-only} (vedi
+    \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi 
+                              \textit{immutable} e \itindex{append~mode}
+                              \textit{append-only} (vedi
                               sez.~\ref{sec:file_perm_overview}) se
                               supportati.\\
-    \const{CAP\_MKNOD}      & Creare
-                              \index{file!di~dispositivo} file di dispositivo
-                              con \func{mknod} (vedi
+    \const{CAP\_MKNOD}      & Creare \index{file!di~dispositivo} file di 
+                              dispositivo con \func{mknod} (vedi
                               sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ 
     \const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
                               privilegiate sulla rete.\\
-    \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto
-                              su porte riservate (vedi
+    \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi 
                               sez.~\ref{sec:TCP_func_bind}).\\ 
     \const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
                               \itindex{broadcast} \textit{broadcast} e
                               \itindex{multicast} \textit{multicast}.\\ 
-    \const{CAP\_NET\_RAW}   & Usare socket \texttt{RAW} e
-                              \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
+    \const{CAP\_NET\_RAW}   & Usare socket \texttt{RAW} e \texttt{PACKET}
+                              (vedi sez.~\ref{sec:sock_type}).\\ 
     \const{CAP\_SETPCAP}    & Effettuare modifiche privilegiate alle
                               \textit{capabilities}.\\   
-    \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti
-                              amministrativi.\\
-    \const{CAP\_SYS\_BOOT}  & Eseguire un riavvio del
-                              sistema (vedi sez.~\ref{sec:sys_reboot}).\\
-    \const{CAP\_SYS\_CHROOT}& Eseguire la funzione
-                              \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\
+    \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
+    \const{CAP\_SYS\_BOOT}  & Eseguire un riavvio del sistema (vedi
+                              sez.~\ref{sec:sys_reboot}).\\ 
+    \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi 
+                              sez.~\ref{sec:file_chroot}).\\
     \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
                                Access Control} di Smack (dal kernel 2.6.25).\\  
     \const{CAP\_MAC\_OVERRIDE}& Evitare il  \textit{Mandatory
                                Access Control} di Smack (dal kernel 2.6.25).\\  
-    \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del
-                              kernel.\\ 
-    \const{CAP\_SYS\_NICE}  & Modificare le varie priorità dei
-                              processi (vedi sez.~\ref{sec:proc_priority}).\\
-    \const{CAP\_SYS\_PACCT} & Usare le funzioni di
-                              \textit{accounting} dei processi (vedi
-                              sez.~\ref{sec:sys_bsd_accounting}).\\ 
+    \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\ 
+    \const{CAP\_SYS\_NICE}  & Modificare le varie priorità dei processi (vedi 
+                              sez.~\ref{sec:proc_priority}).\\
+    \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei 
+                              processi (vedi
+                              sez.~\ref{sec:sys_bsd_accounting}).\\  
     \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
                               \func{ptrace} (vedi 
                               sez.~\ref{sec:process_ptrace}).\\
-    \const{CAP\_SYS\_RAWIO} & Operare sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
+    \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+                               \func{iopl} (vedi
                               sez.~\ref{sec:process_io_port}).\\
-    \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni
-                              sulle risorse.\\ 
-    \const{CAP\_SYS\_TIME}  & Modificare il tempo di sistema
-                              (vedi sez.~\ref{sec:sys_time}).\\ 
-    \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup}
-                              della console, con la funzione
-                              \func{vhangup}.\\
+    \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\ 
+    \const{CAP\_SYS\_TIME}  & Modificare il tempo di sistema (vedi 
+                              sez.~\ref{sec:sys_time}).\\ 
+    \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+                              con la funzione \func{vhangup}.\\
     \const{CAP\_SYSLOG}     & Gestire il buffer dei messaggi
                               del kernel, (vedi sez.~\ref{sec:sess_daemon}),
                               introdotta dal kernel 2.6.38 come capacità
index d1a744ad981da31aa5d374e82b542fb9d3247817..2d0fa2c85771606e15b52cd32881b716f1f86f45 100644 (file)
@@ -3012,23 +3012,24 @@ tab.~\ref{tab:sig_timer_clockid_types}.
                                   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). Questo orologio è specifico di
-                                  Linux, ed è disponibile a partire dal kernel
-                                  2.6.28.\\
-    \const{CLOCK\_PROCESS\_CPUTIME\_ID}& contatore del tempo di CPU usato 
+    \const{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
+    \const{CLOCK\_THREAD\_CPUTIME\_ID}& Contatore del tempo di CPU
                                   (\textit{user time} e \textit{system time})
                                   usato da un singolo \itindex{thread}
                                   \textit{thread}.\\
+    \hline
+    \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). Questo orologio è specifico di
+                                  Linux, ed è disponibile a partire dal kernel
+                                  2.6.28.\\
     \const{CLOCK\_BOOTTIME}     & Identico a \const{CLOCK\_MONOTONIC} ma tiene
                                   conto anche del tempo durante il quale il
                                   sistema è stato sospeso (nel caso di
@@ -3055,18 +3056,17 @@ tab.~\ref{tab:sig_timer_clockid_types}.
 \end{table}
 
 
-% TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il
+% Note: aggiungere le estensioni introdotte, verificandone il
 % funzionamento, vedi http://lwn.net/Articles/429595/
-% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME
-% TODO: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
+% NOTE: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME
+% NOTE: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
 % CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/
 
 Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la
 macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale
 di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i
 programmi che le usano devono essere collegati con la libreria delle
-estensioni \textit{real-time} usando esplicitamente l'opzione
-\texttt{-lrt}. 
+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}
@@ -3111,9 +3111,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
@@ -3129,29 +3130,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.
   \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
@@ -3159,6 +3161,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 suffusso \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
@@ -3187,27 +3201,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
@@ -3216,59 +3230,58 @@ 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, dal 2.6.39 aggiunta clock_adjtime 
 % TODO manca clock_nanosleep, referenziata in sez.~\ref{sec:sig_gen_beha}
 
 Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile
 ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in
 sez.~\ref{sec:sig_alarm_abort} come l'interfaccia di \func{setitimer} derivata
-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.
@@ -3278,23 +3291,25 @@ 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
@@ -3308,13 +3323,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
@@ -3364,9 +3379,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
@@ -3395,19 +3410,19 @@ 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}.
@@ -3416,7 +3431,7 @@ identificatore, si può attivare o disattivare un allarme (in gergo
     999999999.
   \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
@@ -3487,22 +3502,22 @@ ad avere scadenze multiple, e lo stesso può accadere anche se si usa un
 
 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
@@ -3519,24 +3534,26 @@ 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{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
@@ -3555,22 +3572,22 @@ 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}
+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
@@ -3588,16 +3605,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
@@ -3641,25 +3661,27 @@ uno \itindex{stack} \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:
 
+\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}] si è cercato di cambiare lo \textit{stack}
-    alternativo mentre questo è attivo (cioè il processo è in esecuzione su di
-    esso).
+  \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.
-  \end{errlist}}
-\end{prototype}
+  \item[\errcode{EPERM}] si è cercato di cambiare lo \textit{stack}
+    alternativo mentre questo è attivo (cioè il processo è in esecuzione su di
+    esso).
+  \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