Prova di endianess
[gapil.git] / system.tex
index ec2f1b6a14fc0df116a0c36bc1fddfc5fc52616e..2427feeb025ab0cccce6365e17ae4600aedc606e 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
-%% Copyright (C) 2000-2002 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2003 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 "Prefazione",
@@ -8,7 +8,7 @@
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %%
-\chapter{La gestione del sistema, delle risorse, e degli errori}
+\chapter{La gestione del sistema, del tempo e degli errori}
 \label{cha:system}
 
 In questo capitolo tratteremo varie interfacce che attengono agli aspetti più
@@ -42,7 +42,7 @@ quelle della gestione dei file.
 \subsection{Limiti e parametri di sistema}
 \label{sec:sys_limits}
 
-Quando si devono determinare le le caratteristiche generali del sistema ci si
+Quando si devono determinare le caratteristiche generali del sistema ci si
 trova di fronte a diverse possibilità; alcune di queste infatti possono
 dipendere dall'architettura dell'hardware (come le dimensioni dei tipi
 interi), o dal sistema operativo (come la presenza o meno del gruppo degli
@@ -157,7 +157,7 @@ file, riportate in \tabref{tab:sys_file_macro}).
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|r|p{8cm}|}
+  \begin{tabular}[c]{|l|r|p{7cm}|}
     \hline
     \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
     \hline
@@ -201,7 +201,7 @@ riportati in \tabref{tab:sys_posix1_general}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|r|p{8cm}|}
+  \begin{tabular}[c]{|l|r|p{7cm}|}
     \hline
     \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
     \hline
@@ -292,7 +292,7 @@ Come accennato in \secref{sec:sys_limits} quando uno dei limiti o delle
 caratteristiche del sistema può variare, per non dover essere costretti a
 ricompilare un programma tutte le volte che si cambiano le opzioni con cui è
 compilato il kernel, o alcuni dei parametri modificabili a run time, è
-necessario ottenerne il valore attraverso la funzione \func{sysconf}. Il
+necessario ottenerne il valore attraverso la funzione \funcd{sysconf}. Il
 prototipo di questa funzione è:
 \begin{prototype}{unistd.h}{long sysconf(int name)}
   Restituisce il valore del parametro di sistema \param{name}.
@@ -365,22 +365,7 @@ sostituendolo a \code{\_POSIX\_} per le macro definite dagli gli altri due.
 
 In generale si dovrebbe fare uso di \func{sysconf} solo quando la relativa
 macro non è definita, quindi con un codice analogo al seguente:
-%\footnotesize
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
-get_child_max(void)
-{
-#ifdef CHILD_MAX
-    return CHILD_MAX;
-#else
-    int val = sysconf(_SC_CHILD_MAX);
-    if (val < 0) {
-        perror("fatal error");
-        exit(-1);
-    }
-    return val;
-}
-\end{lstlisting}
-%\normalsize 
+\includecodesnip{listati/get_child_max.c}
 ma in realtà in Linux queste macro sono comunque definite, indicando però un
 limite generico. Per questo motivo è sempre meglio usare i valori restituiti
 da \func{sysconf}.
@@ -464,7 +449,7 @@ In generale i limiti per i file sono molto pi
 rispetto ai limiti generali del sistema; ad esempio parametri come la
 lunghezza del nome del file o il numero di link possono variare da filesystem
 a filesystem; per questo motivo questi limiti devono essere sempre controllati
-con la funzione \func{pathconf}, il cui prototipo è:
+con la funzione \funcd{pathconf}, il cui prototipo è:
 \begin{prototype}{unistd.h}{long pathconf(char *path, int name)}
   Restituisce il valore del parametro \param{name} per il file \param{path}.
   
@@ -476,7 +461,7 @@ con la funzione \func{pathconf}, il cui prototipo 
 E si noti come la funzione in questo caso richieda un parametro che specifichi
 a quale file si fa riferimento, dato che il valore del limite cercato può
 variare a seconda del filesystem. Una seconda versione della funzione,
-\func{fpathconf}, opera su un file descriptor invece che su un pathname. Il
+\funcd{fpathconf}, opera su un file descriptor invece che su un pathname. Il
 suo prototipo è:
 \begin{prototype}{unistd.h}{long fpathconf(int fd, int name)}
   Restituisce il valore del parametro \param{name} per il file \param{fd}.
@@ -492,8 +477,8 @@ suo prototipo 
 \label{sec:sys_uname}
 
 Un'altra funzione che si può utilizzare per raccogliere informazioni sia
-riguardo al sistema che al computer su cui esso sta girando è \func{uname}; il
-suo prototipo è:
+riguardo al sistema che al computer su cui esso sta girando è \funcd{uname};
+il suo prototipo è:
 \begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)}
   Restituisce informazioni sul sistema nella struttura \param{info}.
   
@@ -521,35 +506,24 @@ solo definendo \macro{\_GNU\_SOURCE}.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-  \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct utsname {
-    char sysname[];
-    char nodename[];
-    char release[];
-    char version[];
-    char machine[];
-#ifdef _GNU_SOURCE
-    char domainname[];
-#endif
-};
-  \end{lstlisting}
+    \includestruct{listati/ustname.h}
   \end{minipage}
   \normalsize 
-  \caption{La struttura \var{utsname}.} 
+  \caption{La struttura \structd{utsname}.} 
   \label{fig:sys_utsname}
 \end{figure}
 
 In generale si tenga presente che le dimensioni delle stringe di una
-\var{utsname} non è specificata, e che esse sono sempre terminate con
-\val{null}; il manuale delle \acr{glibc} indica due diverse dimensioni,
+\struct{utsname} non è specificata, e che esse sono sempre terminate con NUL;
+il manuale delle \acr{glibc} indica due diverse dimensioni,
 \const{\_UTSNAME\_LENGTH} per i campi standard e
 \const{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
 altri sistemi usano nomi diversi come \const{SYS\_NMLN} o \const{\_SYS\_NMLN}
 o \const{UTSLEN} che possono avere valori diversi.\footnote{Nel caso di Linux
-\func{uname} corrisponde in realtà a 3 system call diverse, le prime due usano
-rispettivamente delle lunghezze delle stringhe di 9 e 65 byte; la terza usa
-anch'essa 65 byte, ma restituisce anche l'ultimo campo, \var{domainname}, con
-una lunghezza di 257 byte.}
+  \func{uname} corrisponde in realtà a 3 system call diverse, le prime due
+  usano rispettivamente delle lunghezze delle stringhe di 9 e 65 byte; la
+  terza usa anch'essa 65 byte, ma restituisce anche l'ultimo campo,
+  \var{domainname}, con una lunghezza di 257 byte.}
 
 
 \section{Opzioni e configurazione del sistema}
@@ -575,7 +549,7 @@ sistema, come quelle per la gestione dei filesystem e di utenti e gruppi.
 \label{sec:sys_sysctl}
 
 La funzione che permette la lettura ed l'impostazione dei parametri del
-sistema è \func{sysctl}; è una funzione derivata da BSD4.4, ma
+sistema è \funcd{sysctl}; è una funzione derivata da BSD4.4, ma
 l'implementazione è specifica di Linux; il suo prototipo è:
 \begin{functions}
 \headdecl{unistd.h}
@@ -606,7 +580,7 @@ Legge o scrive uno dei parametri di sistema.
 \end{functions}
 
 I parametri a cui la funzione permettere di accedere sono organizzati in
-maniera gerarchica all'interno un albero;\footnote{si tenga presente che
+maniera gerarchica all'interno di un albero;\footnote{si tenga presente che
   includendo solo \file{unistd.h}, saranno definiti solo i parametri generici;
   dato che ce ne sono molti specifici dell'implementazione, nel caso di Linux
   occorrerà includere anche i file \file{linux/unistd.h} e
@@ -620,7 +594,7 @@ arriva ad identificare un parametro specifico 
 attraverso l'array \param{name}, di lunghezza \param{nlen}, che contiene la
 sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un
 formato specifico che può essere un intero, una stringa o anche una struttura
-complessa, per questo motivo il valori vengono passati come puntatori
+complessa, per questo motivo i valori vengono passati come puntatori
 \ctyp{void}.
 
 L'indirizzo a cui il valore corrente del parametro deve essere letto è
@@ -639,14 +613,14 @@ sistema) e in genere i loro nomi possono variare da una versione di kernel
 all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl}
 quando esistono modalità alternative per ottenere le stesse informazioni.
 Alcuni esempi di parametri ottenibili sono:
-\begin{itemize*}
+\begin{itemize}
 \item il nome di dominio
 \item i parametri del meccanismo di \textit{paging}.
 \item il filesystem montato come radice
 \item la data di compilazione del kernel
 \item i parametri dello stack TCP
 \item il numero massimo di file aperti
-\end{itemize*}
+\end{itemize}
 
 Come accennato in Linux si ha una modalità alternativa per accedere alle
 stesse informazioni di \func{sysctl} attraverso l'uso del filesystem
@@ -685,8 +659,8 @@ Come accennato in \secref{sec:file_organization} per poter accedere ai file
 occorre prima rendere disponibile al sistema il filesystem su cui essi sono
 memorizzati; l'operazione di attivazione del filesystem è chiamata
 \textsl{montaggio}, per far questo in Linux\footnote{la funzione è specifica
-  di Linux e non è portabile.} si usa la funzione \func{mount} il cui prototipo
-è:
+  di Linux e non è portabile.} si usa la funzione \funcd{mount} il cui
+prototipo è:
 \begin{prototype}{sys/mount.h}
 {mount(const char *source, const char *target, const char *filesystemtype, 
   unsigned long mountflags, const void *data)}
@@ -813,7 +787,7 @@ specificate dagli altri bit), anche in questo caso il valore di \param{source}
 viene ignorato.
 
 Una volta che non si voglia più utilizzare un certo filesystem è possibile
-\textsl{smontarlo} usando la funzione \func{umount}, il cui prototipo è:
+\textsl{smontarlo} usando la funzione \funcd{umount}, il cui prototipo è:
 \begin{prototype}{sys/mount.h}{umount(const char *target)}
   
   Smonta il filesystem montato sulla directory \param{target}.
@@ -843,7 +817,7 @@ filesystem, se questo contiene la directory di lavoro corrente di un qualunque
 processo o il mount point di un altro filesystem; in questo caso l'errore
 restituito è \errcode{EBUSY}.
 
-Linux provvede inoltre una seconda funzione, \func{umount2}, che in alcuni
+Linux provvede inoltre una seconda funzione, \funcd{umount2}, che in alcuni
 casi permette di forzare lo smontaggio di un filesystem, anche quando questo
 risulti occupato; il suo prototipo è:
 \begin{prototype}{sys/mount.h}{umount2(const char *target, int flags)}
@@ -863,7 +837,7 @@ viene eseguita una sincronizzazione dei dati.
 Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD,
   ma con una struttura diversa.} utili per ottenere in maniera diretta
 informazioni riguardo al filesystem su cui si trova un certo file, sono
-\func{statfs} e \func{fstatfs}, i cui prototipi sono:
+\funcd{statfs} e \funcd{fstatfs}, i cui prototipi sono:
 \begin{functions}
   \headdecl{sys/vfs.h} 
   \funcdecl{int statfs(const char *path, struct statfs *buf)} 
@@ -886,44 +860,31 @@ informazioni riguardo al filesystem su cui si trova un certo file, sono
 
 Queste funzioni permettono di ottenere una serie di informazioni generali
 riguardo al filesystem su cui si trova il file specificato; queste vengono
-restituite una struttura \param{buf} di tipo \type{statfs} definita come in
-\figref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in
-esame sono impostati a zero.  I valori del campo \var{f\_type} sono definiti
-per i vari filesystem nei relativi file di header dei sorgenti del kernel da
-costanti del tipo \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in genere è il
-nome del filesystem stesso.
+restituite all'indirizzo \param{buf} di una struttura \struct{statfs} definita
+come in \figref{fig:sys_statfs}, ed i campi che sono indefiniti per il
+filesystem in esame sono impostati a zero.  I valori del campo \var{f\_type}
+sono definiti per i vari filesystem nei relativi file di header dei sorgenti
+del kernel da costanti del tipo \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in
+genere è il nome del filesystem stesso.
 
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-  \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct statfs {
-   long    f_type;     /* tipo di filesystem */
-   long    f_bsize;    /* dimensione ottimale dei blocchi di I/O */
-   long    f_blocks;   /* blocchi totali nel filesystem */
-   long    f_bfree;    /* blocchi liberi nel filesystem */
-   long    f_bavail;   /* blocchi liberi agli utenti normali */
-   long    f_files;    /* inode totali nel filesystem */
-   long    f_ffree;    /* inode liberi nel filesystem */
-   fsid_t  f_fsid;     /* filesystem id */
-   long    f_namelen;  /* lunghezza massima dei nomi dei file */
-   long    f_spare[6]; /* riservati per uso futuro */
-};
-\end{lstlisting}
+    \includestruct{listati/statfs.h}
   \end{minipage}
   \normalsize 
-  \caption{La struttura \var{statfs}.} 
+  \caption{La struttura \structd{statfs}.} 
   \label{fig:sys_statfs}
 \end{figure}
 
 
 Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file \file{/etc/fstab} ed \file{/etc/mtab}, che convenzionalmente sono usati in
-quasi tutti i sistemi unix-like per mantenere rispettivamente le informazioni
-riguardo ai filesystem da montare e a quelli correntemente montati. Le
-funzioni servono a leggere il contenuto di questi file in opportune strutture
-\var{struct fstab} e \var{struct mntent}, e, per \file{/etc/mtab} per inserire
-e rimuovere le voci presenti nel file.
+file \file{/etc/fstab} ed \file{/etc/mtab}, che convenzionalmente sono usati
+in quasi tutti i sistemi unix-like per mantenere rispettivamente le
+informazioni riguardo ai filesystem da montare e a quelli correntemente
+montati. Le funzioni servono a leggere il contenuto di questi file in
+opportune strutture \struct{fstab} e \struct{mntent}, e, per \file{/etc/mtab}
+per inserire e rimuovere le voci presenti nel file.
 
 In generale si dovrebbero usare queste funzioni (in particolare quelle
 relative a \file{/etc/mtab}), quando si debba scrivere un programma che
@@ -956,7 +917,7 @@ citati, il cui formato 
 \cmd{man 5 passwd} e \cmd{man 5 group}).
 
 Per leggere le informazioni relative ad un utente si possono usare due
-funzioni, \func{getpwuid} e \func{getpwnam}, i cui prototipi sono:
+funzioni, \funcd{getpwuid} e \funcd{getpwnam}, i cui prototipi sono:
 \begin{functions}
   \headdecl{pwd.h} 
   \headdecl{sys/types.h} 
@@ -967,7 +928,7 @@ funzioni, \func{getpwuid} e \func{getpwnam}, i cui prototipi sono:
   Restituiscono le informazioni relative all'utente specificato.
   
   \bodydesc{Le funzioni ritornano il puntatore alla struttura contenente le
-    informazioni in caso di successo e \val{null} nel caso non sia stato
+    informazioni in caso di successo e \val{NULL} nel caso non sia stato
     trovato nessun utente corrispondente a quanto specificato.}
 \end{functions}
 
@@ -975,7 +936,7 @@ Le due funzioni forniscono le informazioni memorizzate nel database degli
 utenti (che nelle versioni più recenti possono essere ottenute attraverso PAM)
 relative all'utente specificato attraverso il suo \acr{uid} o il nome di
 login. Entrambe le funzioni restituiscono un puntatore ad una struttura di
-tipo \type{passwd} la cui definizione (anch'essa eseguita in \file{pwd.h}) è
+tipo \struct{passwd} la cui definizione (anch'essa eseguita in \file{pwd.h}) è
 riportata in \figref{fig:sys_passwd_struct}, dove è pure brevemente illustrato
 il significato dei vari campi. 
 
@@ -983,21 +944,11 @@ il significato dei vari campi.
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct passwd {
-    char    *pw_name;       /* user name */
-    char    *pw_passwd;     /* user password */
-    uid_t   pw_uid;         /* user id */
-    gid_t   pw_gid;         /* group id */
-    char    *pw_gecos;      /* real name */
-    char    *pw_dir;        /* home directory */
-    char    *pw_shell;      /* shell program */
-};
-    \end{lstlisting}
+    \includestruct{listati/passwd.h}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \var{passwd} contenente le informazioni relative ad un
-    utente del sistema.}
+  \caption{La struttura \structd{passwd} contenente le informazioni relative ad
+    un utente del sistema.}
   \label{fig:sys_passwd_struct}
 \end{figure}
 
@@ -1026,18 +977,18 @@ essere rientranti, per cui ne esistono anche due versioni alternative
 
 In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
 la memoria necessaria a contenere le informazioni. In particolare i valori
-della struttura \var{passwd} saranno restituiti all'indirizzo \param{password}
-mentre la memoria allocata all'indirizzo \param{buffer}, per un massimo di
-\param{buflen} byte, sarà utilizzata per contenere le stringhe puntate dai
-campi di \param{password}. Infine all'indirizzo puntato da \param{result}
-viene restituito il puntatore ai dati ottenuti, cioè \param{buffer} nel caso
-l'utente esista, o \val{null} altrimenti.  Qualora i dati non possano essere
-contenuti nei byte specificati da \param{buflen}, la funzione fallirà
-restituendo \errcode{ERANGE} (e \param{result} sarà comunque impostato a
-\val{null}).
-
-Del tutto analoghe alle precedenti sono le funzioni \func{getgrnam} e
-\func{getgrgid} (e le relative analoghe rientranti con la stessa estensione
+della struttura \struct{passwd} saranno restituiti all'indirizzo
+\param{password} mentre la memoria allocata all'indirizzo \param{buffer}, per
+un massimo di \param{buflen} byte, sarà utilizzata per contenere le stringhe
+puntate dai campi di \param{password}. Infine all'indirizzo puntato da
+\param{result} viene restituito il puntatore ai dati ottenuti, cioè
+\param{buffer} nel caso l'utente esista, o \val{NULL} altrimenti.  Qualora i
+dati non possano essere contenuti nei byte specificati da \param{buflen}, la
+funzione fallirà restituendo \errcode{ERANGE} (e \param{result} sarà comunque
+impostato a \val{NULL}).
+
+Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e
+\funcd{getgrgid} (e le relative analoghe rientranti con la stessa estensione
 \code{\_r}) che permettono di leggere le informazioni relative ai gruppi, i
 loro prototipi sono:
 \begin{functions}
@@ -1063,24 +1014,18 @@ loro prototipi sono:
 Il comportamento di tutte queste funzioni è assolutamente identico alle
 precedenti che leggono le informazioni sugli utenti, l'unica differenza è che
 in questo caso le informazioni vengono restituite in una struttura di tipo
-\type{group}, la cui definizione è riportata in \figref{fig:sys_group_struct}.
+\struct{group}, la cui definizione è riportata in
+\figref{fig:sys_group_struct}.
 
 \begin{figure}[!htb]
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct group {
-    char    *gr_name;        /* group name */
-    char    *gr_passwd;      /* group password */
-    gid_t   gr_gid;          /* group id */
-    char    **gr_mem;        /* group members */
-};
-    \end{lstlisting}
+    \includestruct{listati/group.h}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \var{group} contenente le informazioni relative ad un
-    gruppo del sistema.}
+  \caption{La struttura \structd{group} contenente le informazioni relative ad
+    un gruppo del sistema.}
   \label{fig:sys_group_struct}
 \end{figure}
 
@@ -1160,21 +1105,21 @@ da cui ci si collega, l'\acr{uid} della shell di login, l'orario della
 connessione ed altre informazioni.  La voce resta nel file fino al logout,
 quando viene cancellata e spostata in \file{/var/log/wtmp}.
 
-In questo modo il primo file viene utilizzato per registrare sta utilizzando
-il sistema al momento corrente, mentre il secondo mantiene la registrazione
-delle attività degli utenti. A quest'ultimo vengono anche aggiunte delle voci
-speciali per tenere conto dei cambiamenti del sistema, come la modifica del
-runlevel, il riavvio della macchina, ecc. Tutte queste informazioni sono
-descritte in dettaglio nel manuale delle \acr{glibc}.
+In questo modo il primo file viene utilizzato per registrare chi sta
+utilizzando il sistema al momento corrente, mentre il secondo mantiene la
+registrazione delle attività degli utenti. A quest'ultimo vengono anche
+aggiunte delle voci speciali per tenere conto dei cambiamenti del sistema,
+come la modifica del runlevel, il riavvio della macchina, ecc. Tutte queste
+informazioni sono descritte in dettaglio nel manuale delle \acr{glibc}.
 
 Questi file non devono mai essere letti direttamente, ma le informazioni che
 contengono possono essere ricavate attraverso le opportune funzioni di
-libreria. Queste sono analoghe alle precedenti (vedi
+libreria. Queste sono analoghe alle precedenti funzioni (vedi
 \tabref{tab:sys_passwd_func}) usate per accedere al database degli utenti,
 solo che in questo caso la struttura del database di accounting è molto più
 complessa, dato che contiene diversi tipi di informazione.
 
-Le prime tre funzioni, \func{setutent}, \func{endutent} e \func{utmpname}
+Le prime tre funzioni, \funcd{setutent}, \funcd{endutent} e \funcd{utmpname}
 servono rispettivamente a aprire e a chiudere il file che contiene il
 database, e a specificare su quale file esso viene mantenuto. I loro prototipi
 sono:
@@ -1205,9 +1150,21 @@ standard \const{\_PATH\_UTMP} (che 
 corrispondenti ai file \file{/var/run/utmp} e \file{/var/log/wtmp} visti in
 precedenza.
 
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/utmp.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{utmp} contenente le informazioni di una voce
+    del database di \textit{accounting}.}
+  \label{fig:sys_utmp_struct}
+\end{figure}
+
 Una volta aperto il file si può eseguire una scansione leggendo o scrivendo
-una voce con le funzioni \func{getutent}, \func{getutid}, \func{getutline} e 
-\func{pututline}, i cui prototipi sono:
+una voce con le funzioni \funcd{getutent}, \funcd{getutid}, \funcd{getutline}
+e \funcd{pututline}, i cui prototipi sono:
 \begin{functions}
   \headdecl{utmp.h} 
 
@@ -1223,45 +1180,17 @@ una voce con le funzioni \func{getutent}, \func{getutid}, \func{getutline} e
 
   \funcdecl{struct utmp *pututline(struct utmp *ut)} 
   Scrive una voce nel database.
-
-  \bodydesc{Le funzioni ritornano il puntatore ad una struttura \var{utmp} in
-    caso di successo e \val{null} in caso di errore.}
+  
+  \bodydesc{Le funzioni ritornano il puntatore ad una struttura \struct{utmp}
+    in caso di successo e \val{NULL} in caso di errore.}
 \end{functions}
 
-Tutte queste funzioni fanno riferimento ad una struttura di tipo \var{utmp},
-la cui definizione in Linux è riportata in \secref{fig:sys_utmp_struct}. Le
+Tutte queste funzioni fanno riferimento ad una struttura di tipo \struct{utmp},
+la cui definizione in Linux è riportata in \figref{fig:sys_utmp_struct}. Le
 prime tre funzioni servono per leggere una voce dal database; \func{getutent}
 legge semplicemente la prima voce disponibile; le altre due permettono di
 eseguire una ricerca.
 
-\begin{figure}[!htb]
-  \footnotesize
-  \centering
-  \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct utmp
-{
-    short int ut_type;            /* Type of login.  */
-    pid_t ut_pid;                 /* Process ID of login process.  */
-    char ut_line[UT_LINESIZE];    /* Devicename.  */
-    char ut_id[4];                /* Inittab ID.  */
-    char ut_user[UT_NAMESIZE];    /* Username.  */
-    char ut_host[UT_HOSTSIZE];    /* Hostname for remote login.  */
-    struct exit_status ut_exit;   /* Exit status of a process marked
-                                     as DEAD_PROCESS.  */
-    long int ut_session;          /* Session ID, used for windowing.  */
-    struct timeval ut_tv;         /* Time entry was made.  */
-    int32_t ut_addr_v6[4];        /* Internet address of remote host.  */
-    char __unused[20];            /* Reserved for future use.  */
-};
-    \end{lstlisting}
-  \end{minipage} 
-  \normalsize 
-  \caption{La struttura \var{utmp} contenente le informazioni di una voce del
-    database di \textit{accounting}.}
-  \label{fig:sys_utmp_struct}
-\end{figure}
-
 Con \func{getutid} si può cercare una voce specifica, a seconda del valore del
 campo \var{ut\_type} dell'argomento \param{ut}.  Questo può assumere i valori
 riportati in \tabref{tab:sys_ut_type}, quando assume i valori
@@ -1290,7 +1219,7 @@ corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}.
     \const{LOGIN\_PROCESS}& Identifica un processo di login. \\
     \const{USER\_PROCESS} & Identifica un processo utente. \\
     \const{DEAD\_PROCESS} & Identifica un processo terminato. \\
-    \const{ACCOUNTING}    & ??? \\
+%    \const{ACCOUNTING}    & ??? \\
     \hline
   \end{tabular}
   \caption{Classificazione delle voci del database di accounting a seconda dei
@@ -1331,7 +1260,7 @@ il risultato all'indirizzo specificato dal primo argomento aggiuntivo (di tipo
   **result)} viene usato per restituire il puntatore allo stesso buffer.
 
 Infine le \acr{glibc} forniscono come estensione per la scrittura delle voci
-in \file{wmtp} altre due funzioni, \func{updwtmp} e \func{logwtmp}, i cui
+in \file{wmtp} altre due funzioni, \funcd{updwtmp} e \funcd{logwtmp}, i cui
 prototipi sono:
 \begin{functions}
   \headdecl{utmp.h} 
@@ -1342,13 +1271,10 @@ prototipi sono:
   \funcdecl{void logwtmp(const char *line, const char *name, const char
     *host)} Aggiunge nel database di accounting una voce con i valori
   specificati.
-
-  \bodydesc{Le funzioni ritornano il puntatore ad una struttura \var{utmp} in
-    caso di successo e \val{null} in caso di errore.}
 \end{functions}
 
 La prima funzione permette l'aggiunta di una voce a \file{wmtp} specificando
-direttamente una struttura \type{utmp}, mentre la seconda utilizza gli
+direttamente una struttura \struct{utmp}, mentre la seconda utilizza gli
 argomenti \param{line}, \param{name} e \param{host} per costruire la voce che
 poi aggiunge chiamando \func{updwtmp}.
 
@@ -1369,46 +1295,27 @@ permettono di imporre a ciascuno di essi vincoli e limiti di utilizzo.
 
 Come abbiamo accennato in \secref{sec:proc_wait4} le informazioni riguardo
 l'utilizzo delle risorse da parte di un processo è mantenuto in una struttura
-di tipo \code{struct }\type{rusage}, la cui definizione (che si trova in
+di tipo \struct{rusage}, la cui definizione (che si trova in
 \file{sys/resource.h}) è riportata in \figref{fig:sys_rusage_struct}.
 
 \begin{figure}[!htb]
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct rusage {
-    struct timeval ru_utime; /* user time used */
-    struct timeval ru_stime; /* system time used */
-    long ru_maxrss;          /* maximum resident set size */
-    long ru_ixrss;           /* integral shared memory size */
-    long ru_idrss;           /* integral unshared data size */
-    long ru_isrss;           /* integral unshared stack size */
-    long ru_minflt;          /* page reclaims */
-    long ru_majflt;          /* page faults */
-    long ru_nswap;           /* swaps */
-    long ru_inblock;         /* block input operations */
-    long ru_oublock;         /* block output operations */
-    long ru_msgsnd;          /* messages sent */
-    long ru_msgrcv;          /* messages received */
-    long ru_nsignals;   ;    /* signals received */
-    long ru_nvcsw;           /* voluntary context switches */
-    long ru_nivcsw;          /* involuntary context switches */
-};
-    \end{lstlisting}
+    \includestruct{listati/rusage.h}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \var{rusage} per la lettura delle informazioni dei 
+  \caption{La struttura \structd{rusage} per la lettura delle informazioni dei 
     delle risorse usate da un processo.}
   \label{fig:sys_rusage_struct}
 \end{figure}
 
-La struttura è ripresa da BSD 4.3, ma attualmente (con i kernel della serie
-2.4.x) i soli campi che sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime},
-\var{ru\_minflt}, \var{ru\_majflt}, e \var{ru\_nswap}. I primi due indicano
-rispettivamente il tempo impiegato dal processo nell'eseguire le istruzioni in
-user space, e quello impiegato dal kernel nelle system call eseguite per conto
-del processo.
+La definizione della struttura in \figref{fig:sys_rusage_struct} è ripresa da
+BSD 4.3, ma attualmente (con i kernel della serie 2.4.x) i soli campi che sono
+mantenuti sono: \var{ru\_utime}, \var{ru\_stime}, \var{ru\_minflt},
+\var{ru\_majflt}, e \var{ru\_nswap}. I primi due indicano rispettivamente il
+tempo impiegato dal processo nell'eseguire le istruzioni in user space, e
+quello impiegato dal kernel nelle system call eseguite per conto del processo.
 
 Gli altri tre campi servono a quantificare l'uso della memoria
 virtuale\index{memoria virtuale} e corrispondono rispettivamente al numero di
@@ -1418,16 +1325,17 @@ quelli che invece han richiesto I/O (detti invece \textit{major page fault})
 ed al numero di volte che il processo è stato completamente tolto dalla
 memoria per essere inserito nello swap.
 
-In genere includere esplicitamente \file{<sys/time.h>} non è più necessario,
-ma aumenta la portabilità, e serve comunque quando, come nella maggior parte
-dei casi, si debba accedere ai campi di \var{rusage} relativi ai tempi di
-utilizzo del processore, che sono definiti come \code{struct }\type{timeval}.
-
+In genere includere esplicitamente \file{<sys/time.h>} non è più strettamente
+necessario, ma aumenta la portabilità, e serve comunque quando, come nella
+maggior parte dei casi, si debba accedere ai campi di \struct{rusage} relativi
+ai tempi di utilizzo del processore, che sono definiti come strutture
+\struct{timeval}.
 
-Questa è la stessa struttura utilizzata da \func{wait4}  per ricavare la
-quantità di risorse impiegato dal processo di cui si è letto lo stato di
-terminazione, ma essa può anche essere letta direttamente utilizzando la
-funzione \func{getrusage}, il cui prototipo è:
+Questa è la stessa struttura utilizzata da \func{wait4} (si ricordi quando
+visto in \secref{sec:proc_wait4}) per ricavare la quantità di risorse
+impiegate dal processo di cui si è letto lo stato di terminazione, ma essa può
+anche essere letta direttamente utilizzando la funzione \funcd{getrusage}, il
+cui prototipo è:
 \begin{functions}
   \headdecl{sys/time.h} 
   \headdecl{sys/resource.h} 
@@ -1463,31 +1371,14 @@ In generale il primo viene chiamato un limite \textsl{soffice} (o \textit{soft
   limit}) dato che il suo valore può essere aumentato, mentre il secondo è
 detto \textsl{duro} (o \textit{hard limit}), in quanto un processo normale non
 può modificarne il valore. Il valore di questi limiti è mantenuto in una
-struttura \var{rlimit}, la cui definizione è riportata in
+struttura \struct{rlimit}, la cui definizione è riportata in
 \figref{fig:sys_rlimit_struct}, ed i cui campi corrispondono appunto a limite
-corrente e massimo.
-
-\begin{figure}[!htb]
-  \footnotesize
-  \centering
-  \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct rlimit {
-     rlim_t    rlim_cur;
-     rlim_t    rlim_max;
-};
-    \end{lstlisting}
-  \end{minipage} 
-  \normalsize 
-  \caption{La struttura \var{rlimit} per impostare i limiti di utilizzo 
-    delle risorse usate da un processo.}
-  \label{fig:sys_rlimit_struct}
-\end{figure}
+corrente e limite massimo.
 
 In genere il superamento di un limite comporta o l'emissione di un segnale o
-il fallimento della system call che lo ha provocato; per far leggere o
-impostare i limiti di utilizzo delle risorse da parte di un processo le
-\acr{glibc} prevedono due funzioni, \func{getrlimit} e \func{setrlimit}, i cui
+il fallimento della system call che lo ha provocato; per permettere di leggere
+e di impostare i limiti di utilizzo delle risorse da parte di un processo
+Linux prevede due funzioni, \funcd{getrlimit} e \funcd{setrlimit}, i cui
 prototipi sono:
 \begin{functions}
   \headdecl{sys/time.h} 
@@ -1512,10 +1403,26 @@ prototipi sono:
   ed \errval{EFAULT}.}
 \end{functions}
 
-Entrambe le funzioni permettono di specificare su quale risorsa si vuole
-operare attraverso \param{resource}, i cui possibili valori sono elencati in
-\secref{tab:sys_rlimit_values}, e utilizzano una struttura \var{rlimit} per
-specificarne i valori.
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/rlimit.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{rlimit} per impostare i limiti di utilizzo 
+    delle risorse usate da un processo.}
+  \label{fig:sys_rlimit_struct}
+\end{figure}
+
+
+
+Entrambe le funzioni permettono di specificare, attraverso l'argomento
+\param{resource}, su quale risorsa si vuole operare: i possibili valori di
+questo argomento sono elencati in \secref{tab:sys_rlimit_values}. L'acceso
+(rispettivamente in lettura e scrittura) ai valori effettivi dei limiti viene
+poi effettuato attraverso la struttura \struct{rlimit} puntata da
+\param{rlim}.
 
 \begin{table}[htb]
   \footnotesize
@@ -1556,7 +1463,9 @@ specificarne i valori.
                               aprire. L'apertura di un ulteriore file fallirà
                               con un errore \errcode{EMFILE}.\\
     \const{RLIMIT\_MEMLOCK}&  L'ammontare massimo di memoria che può essere
-                              bloccata (vedi \secref{sec:proc_mem_lock}).\\
+                              bloccata in RAM senza
+                              paginazione\index{paginazione} (vedi
+                              \secref{sec:proc_mem_lock}).\\ 
     \const{RLIMIT\_AS}     &  La dimensione massima di tutta la memoria che il
                               processo può ottenere. Se il processo tenta di
                               allocarne di più  funzioni come \func{brk},
@@ -1569,14 +1478,17 @@ specificarne i valori.
 \end{table}
 
 \footnotetext{Impostare questo limite a zero è la maniera più semplice per
-  evitare la creazione di \file{core} file.}
+  evitare la creazione di \file{core} file (al proposito si veda
+  \secref{sec:sig_prog_error}).}
 
-È inoltre definita la costante \const{RLIM\_INFINITY} che permette di
-sbloccare l'uso di una risorsa, ma solo un processo con i privilegi di
+Nello specificare un limite, oltre a fornire dei valori specifici, si può
+anche usare la costante \const{RLIM\_INFINITY} che permette di sbloccare l'uso
+di una risorsa; ma si ricordi che solo un processo con i privilegi di
 amministratore può innalzare un limite al di sopra del valore corrente del
 limite massimo. Si tenga conto infine che tutti i limiti vengono ereditati dal
 processo padre attraverso una \func{fork} (vedi \secref{sec:proc_fork}) e
-mantenuti attraverso una \func{exec} (vedi \secref{sec:proc_exec}).
+mantenuti per gli altri programmi eseguiti attraverso una \func{exec} (vedi
+\secref{sec:proc_exec}).
 
 
 \subsection{Le risorse di memoria e processore}
@@ -1587,23 +1499,24 @@ La gestione della memoria 
 meccanismo della memoria virtuale\index{memoria virtuale} attraverso la
 divisione della memoria fisica in pagine.
 
-In genere questo è del tutto trasparente al singolo processo, ma in certi
+In genere tutto ciò è del tutto trasparente al singolo processo, ma in certi
 casi, come per l'I/O mappato in memoria (vedi \secref{sec:file_memory_map})
 che usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
 dimensioni delle pagine usate dal kernel. Lo stesso vale quando si vuole
-gestire in maniera ottimale l'interazione della memoria allocata con il
-meccanismo della paginazione.
+gestire in maniera ottimale l'interazione della memoria che si sta allocando
+con il meccanismo della paginazione\index{paginazione}.
 
 Di solito la dimensione delle pagine di memoria è fissata dall'architettura
-hardware, per cui in genere la dimensione delle pagine di memoria era una
-costante definita in fase di compilazione, ma oggi alcune architetture (ad
-esempio su Sun Sparc) permettono di variare questa dimensione, e non volendo
-dover fornire binari diversi per ogni possibile modello, è necessario poter
-utilizzare una funzione. 
-
-In genere questa dimensione può essere ottenuta attraverso una chiamata a
-\func{sysconf} come \code{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
-introdotta una apposita funzione, \func{getpagesize}, che restituisce la
+hardware, per cui il suo valore di norma veniva mantenuto in una costante che
+bastava utilizzare in fase di compilazione, ma oggi, con la presenza di alcune
+architetture (ad esempio Sun Sparc) che permettono di variare questa
+dimensione, per non dover ricompilare i programmi per ogni possibile modello e
+scelta di dimensioni, è necessario poter utilizzare una funzione.
+
+Dato che si tratta di una caratteristica generale del sistema, questa
+dimensione può essere ottenuta come tutte le altre attraverso una chiamata a
+\func{sysconf} (nel caso \code{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
+introdotta una apposita funzione, \funcd{getpagesize}, che restituisce la
 dimensione delle pagine di memoria; il suo prototipo è:
 \begin{prototype}{unistd.h}{int getpagesize(void)}
   Legge le dimensioni delle pagine di memoria.
@@ -1621,8 +1534,8 @@ precedenti le \acr{glibc} 2.1 implementavano questa funzione restituendo
 sempre un valore statico.
 
 Le \acr{glibc} forniscono, come specifica estensione GNU, altre due funzioni,
-\func{get\_phys\_pages} e \func{get\_avphys\_pages} che permettono di ottenere
-informazioni riguardo la memoria; i loro prototipi sono:
+\funcd{get\_phys\_pages} e \funcd{get\_avphys\_pages} che permettono di
+ottenere informazioni riguardo la memoria; i loro prototipi sono:
 \begin{functions}
   \headdecl{sys/sysinfo.h} 
   
@@ -1649,7 +1562,7 @@ attivi); anche queste sono informazioni comunque ottenibili attraverso
 \func{sysconf} utilizzando rispettivamente i parametri
 \const{\_SC\_NPROCESSORS\_CONF} e \const{\_SC\_NPROCESSORS\_ONLN}.
 
-Infine le \acr{glibc} riprendono da BSD la funzione \func{getloadavg} che
+Infine le \acr{glibc} riprendono da BSD la funzione \funcd{getloadavg} che
 permette di ottenere il carico di processore della macchina, in questo modo è
 possibile prendere decisioni su quando far partire eventuali nuovi processi.
 Il suo prototipo è:
@@ -1728,7 +1641,7 @@ una precisione ovviamente superiore al \textit{calendar time} (che 
 dal sistema con una granularità di un secondo) e viene usato per tenere conto
 dei tempi di esecuzione dei processi. Per ciascun processo il kernel calcola
 tre tempi diversi:
-\begin{description*}
+\begin{description}
 \item[\textit{clock time}]: il tempo \textsl{reale} (viene chiamato anche
   \textit{wall clock time}) passato dall'avvio del processo. Chiaramente tale
   tempo dipende anche dal carico del sistema e da quanti altri processi
@@ -1737,7 +1650,7 @@ tre tempi diversi:
   delle istruzioni del processo in user space.
 \item[\textit{system time}]: il tempo che la CPU ha impiegato nel kernel per
   eseguire delle system call per conto del processo.
-\end{description*}
+\end{description}
 
 In genere la somma di \textit{user time} e \textit{system time} indica il
 tempo di processore totale in cui il sistema è stato effettivamente impegnato
@@ -1758,7 +1671,7 @@ un altro processo era in esecuzione o in attesa del risultato di una
 operazione di I/O. 
 
 La funzione più semplice per leggere il \textit{process time} di un processo è
-\func{clock}, che da una valutazione approssimativa del tempo di CPU
+\funcd{clock}, che da una valutazione approssimativa del tempo di CPU
 utilizzato dallo stesso; il suo prototipo è:
 \begin{prototype}{time.h}{clock\_t clock(void)}
   Legge il valore corrente del tempo di CPU.
@@ -1779,7 +1692,7 @@ riprender
 Come accennato in \secref{sec:sys_unix_time} il tempo di CPU è la somma di
 altri due tempi, l'\textit{user time} ed il \textit{system time} che sono
 quelli effettivamente mantenuti dal kernel per ciascun processo. Questi
-possono essere letti attraverso la funzione \func{times}, il cui prototipo è:
+possono essere letti attraverso la funzione \funcd{times}, il cui prototipo è:
 \begin{prototype}{sys/times.h}{clock\_t times(struct tms *buf)}
   Legge in \param{buf} il valore corrente dei tempi di processore.
   
@@ -1788,7 +1701,7 @@ possono essere letti attraverso la funzione \func{times}, il cui prototipo 
 \end{prototype}
 
 La funzione restituisce i valori di process time del processo corrente in una
-struttura di tipo \var{tms}, la cui definizione è riportata in
+struttura di tipo \struct{tms}, la cui definizione è riportata in
 \secref{fig:sys_tms_struct}. La struttura prevede quattro campi; i primi due,
 \var{tms\_utime} e \var{tms\_stime}, sono l'\textit{user time} ed il
 \textit{system time} del processo, così come definiti in
@@ -1798,17 +1711,10 @@ struttura di tipo \var{tms}, la cui definizione 
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct tms {
-       clock_t tms_utime;  /* user time */
-       clock_t tms_stime;  /* system time */
-       clock_t tms_cutime; /* user time of children */
-       clock_t tms_cstime; /* system time of children */
-};
-    \end{lstlisting}
+    \includestruct{listati/tms.h}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \var{tms} dei tempi di processore associati a un
+  \caption{La struttura \structd{tms} dei tempi di processore associati a un
     processo.} 
   \label{fig:sys_tms_struct}
 \end{figure}
@@ -1826,16 +1732,16 @@ lo stato di terminazione di tutti i suoi figli, questi processi ``nipoti'' non
 verranno considerati nel calcolo di questi tempi.
 
 
-
 \subsection{Le funzioni per il \textit{calendar time}}
 \label{sec:sys_time_base}
 
 Come anticipato in \secref{sec:sys_unix_time} il \textit{calendar time} è
 mantenuto dal kernel in una variabile di tipo \type{time\_t}, che usualmente
-corrisponde ad un tipo nativo (in Linux è un intero a 32 bit).  Il valore
-corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di
-  sistema}, può essere ottenuto con la funzione \func{time} che lo restituisce
-in nel suddetto formato; il suo prototipo è:
+corrisponde ad un tipo elementare (in Linux è definito come \ctyp{long int},
+che di norma corrisponde a 32 bit).  Il valore corrente del \textit{calendar
+  time}, che indicheremo come \textsl{tempo di sistema}, può essere ottenuto
+con la funzione \funcd{time} che lo restituisce nel suddetto formato; il suo
+prototipo è:
 \begin{prototype}{time.h}{time\_t time(time\_t *t)}
   Legge il valore corrente del \textit{calendar time}.
   
@@ -1845,7 +1751,7 @@ in nel suddetto formato; il suo prototipo 
 \noindent dove \param{t}, se non nullo, deve essere  l'indirizzo di una
 variabile su cui duplicare il valore di ritorno.
 
-Analoga a \func{time} è la funzione \func{stime} che serve per effettuare
+Analoga a \func{time} è la funzione \funcd{stime} che serve per effettuare
 l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo
 sia necessario; il suo prototipo è:
 \begin{prototype}{time.h}{int stime(time\_t *t)}
@@ -1862,7 +1768,7 @@ altrimenti la chiamata fallir
 Data la scarsa precisione nell'uso di \type{time\_t} (che ha una risoluzione
 massima di un secondo) quando si devono effettuare operazioni sui tempi di
 norma l'uso delle funzioni precedenti è sconsigliato, ed esse sono di solito
-sostituite da \func{gettimeofday} e \func{settimeofday},\footnote{le due
+sostituite da \funcd{gettimeofday} e \funcd{settimeofday},\footnote{le due
   funzioni \func{time} e \func{stime} sono più antiche e derivano da SVr4,
   \func{gettimeofday} e \func{settimeofday} sono state introdotte da BSD, ed
   in BSD4.3 sono indicate come sostitute delle precedenti.} i cui prototipi
@@ -1886,8 +1792,8 @@ sono:
     \errval{EPERM}.}
 \end{functions}
 
-Queste funzioni utilizzano una struttura di tipo \var{timeval}, la cui
-definizione, insieme a quella della analoga \var{timespec}, è riportata in
+Queste funzioni utilizzano una struttura di tipo \struct{timeval}, la cui
+definizione, insieme a quella della analoga \struct{timespec}, è riportata in
 \figref{fig:sys_timeval_struct}. Le \acr{glibc} infatti forniscono queste due
 rappresentazioni alternative del \textit{calendar time} che rispetto a
 \type{time\_t} consentono rispettivamente precisioni del microsecondo e del
@@ -1898,42 +1804,38 @@ nanosecondo.\footnote{la precisione 
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct timeval 
-{
-    long tv_sec;            /* seconds */
-    long tv_usec;           /* microseconds */
-};
-struct timespec {
-    time_t  tv_sec;         /* seconds */
-    long    tv_nsec;        /* nanoseconds */
-};
-    \end{lstlisting}
+    \includestruct{listati/timeval.h}
   \end{minipage} 
   \normalsize 
-  \caption{Le strutture \var{timeval} e \var{timespec} usate per una
+  \caption{Le strutture \structd{timeval} e \structd{timespec} usate per una
     rappresentazione ad alta risoluzione del \textit{calendar time}.}
   \label{fig:sys_timeval_struct}
 \end{figure}
 
-Come nel caso di \func{stime} anche \func{settimeofday} (e qualunque funzione
-vada a modificare l'orologio di sistema, come quelle che tratteremo in
-seguito) può essere utilizzata solo da un processo coi privilegi di
-amministratore.  Il secondo parametro di entrambe le funzioni è una struttura
-\var{timezone}, che storicamente veniva utilizzata per specificare appunto la
-\textit{time zone}, cioè l'insieme del fuso orario e delle convenzioni per
+Come nel caso di \func{stime} anche \func{settimeofday} (la cosa continua a
+valere per qualunque funzione che vada a modificare l'orologio di sistema,
+quindi anche per quelle che tratteremo in seguito) può essere utilizzata solo
+da un processo coi privilegi di amministratore.
+
+Il secondo parametro di entrambe le funzioni è una struttura
+\struct{timezone}, che storicamente veniva utilizzata per specificare appunto
+la \textit{time zone}, cioè l'insieme del fuso orario e delle convenzioni per
 l'ora legale che permettevano il passaggio dal tempo universale all'ora
-locale. Questo parametro è obsoleto e in Linux non è mai stato utilizzato e
-non è supportato né dalle vecchie \textsl{libc5}, né dalle \textsl{glibc}:
-pertanto deve essere sempre impostato a \val{null}.
+locale. Questo parametro oggi è obsoleto ed in Linux non è mai stato
+utilizzato; esso non è supportato né dalle vecchie \textsl{libc5}, né dalle
+\textsl{glibc}: pertanto quando si chiama questa funzione deve essere sempre
+impostato a \val{NULL}.
 
 Modificare l'orologio di sistema con queste funzioni è comunque problematico,
 in quanto esse effettuano un cambiamento immediato. Questo può creare dei
 buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con
-conseguenze indesiderate; ad esempio se si porta avanti l'orologio si possono
+conseguenze indesiderate.  Ad esempio se si porta avanti l'orologio si possono
 perdere delle esecuzioni di \cmd{cron} programmate nell'intervallo che si è
-saltato. Per questo motivo la modalità più corretta per impostare l'ora è
-quella di usare la funzione \func{adjtime}, il cui prototipo è:
+saltato. Oppure se si porta indietro l'orologio si possono eseguire due volte
+delle operazioni previste nell'intervallo di tempo che viene ripetuto. 
+
+Per questo motivo la modalità più corretta per impostare l'ora è quella di
+usare la funzione \funcd{adjtime}, il cui prototipo è:
 \begin{prototype}{sys/time.h}
 {int adjtime(const struct timeval *delta, struct timeval *olddelta)} 
   
@@ -1951,9 +1853,22 @@ il tempo richiesto, altrimenti sar
 usato, se non nullo, per ricevere il valore dell'ultimo aggiustamento
 effettuato.
 
-Linux poi prevede un'altra funzione, \func{adjtimex}, che consente un
-aggiustamento molto più dettagliato, permettendo ad esempio anche di
-modificare anche la velocità dell'orologio di sistema.  Il suo prototipo è:
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/timex.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{timex} per il controllo dell'orologio di
+    sistema.} 
+  \label{fig:sys_timex_struct}
+\end{figure}
+
+Linux poi prevede un'altra funzione, che consente un aggiustamento molto più
+dettagliato del tempo, permettendo ad esempio anche di modificare anche la
+velocità dell'orologio di sistema.  La funzione è \funcd{adjtimex} ed il suo
+prototipo è:
 \begin{prototype}{sys/timex.h}
 {int adjtimex(struct timex *buf)} 
   
@@ -1964,61 +1879,29 @@ modificare anche la velocit
     assumerà i valori \errval{EFAULT}, \errval{EINVAL} ed \errval{EPERM}.}
 \end{prototype}
 
-La funzione richiede una struttura di tipo \var{timex}, la cui definizione,
+La funzione richiede una struttura di tipo \struct{timex}, la cui definizione,
 così come effettuata in \file{sys/timex.h}, è riportata in
 \figref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore del
 campo \var{mode}, che specifica quale parametro dell'orologio di sistema,
-specificato in un opportuno campo di \var{timex}, deve essere impostato. Un
+specificato in un opportuno campo di \struct{timex}, deve essere impostato. Un
 valore nullo serve per leggere i parametri correnti; i valori diversi da zero
 devono essere specificati come OR binario delle costanti riportate in
 \secref{tab:sys_timex_mode}.
 
-\begin{figure}[!htb]
-  \footnotesize \centering
-  \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct timex {
-    unsigned int modes;   /* mode selector */
-    long int offset;      /* time offset (usec) */
-    long int freq;        /* frequency offset (scaled ppm) */
-    long int maxerror;    /* maximum error (usec) */
-    long int esterror;    /* estimated error (usec) */
-    int status;           /* clock command/status */
-    long int constant;    /* pll time constant */
-    long int precision;   /* clock precision (usec) (read only) */
-    long int tolerance;   /* clock frequency tolerance (ppm) (read only) */
-    struct timeval time;  /* (read only) */
-    long int tick;        /* (modified) usecs between clock ticks */
-    long int ppsfreq;     /* pps frequency (scaled ppm) (ro) */
-    long int jitter;      /* pps jitter (us) (ro) */
-    int shift;            /* interval duration (s) (shift) (ro) */
-    long int stabil;      /* pps stability (scaled ppm) (ro) */
-    long int jitcnt;      /* jitter limit exceeded (ro) */
-    long int calcnt;      /* calibration intervals (ro) */
-    long int errcnt;      /* calibration errors (ro) */
-    long int stbcnt;      /* stability limit exceeded (ro) */
-};
-    \end{lstlisting}
-  \end{minipage} 
-  \normalsize 
-  \caption{La struttura \var{timex} per il controllo dell'orologio di sistema.}
-  \label{fig:sys_timex_struct}
-\end{figure}
-
-La funzione utilizza il meccanismo di David L. Mills, descritto nell'RFC~1305,
-che è alla base del protocollo NTP; la funzione è specifica di Linux e non
-deve essere usata se la portabilità è un requisito, le \acr{glibc} provvedono
-anche un suo omonimo \func{ntp\_adjtime}.  La trattazione completa di questa
-funzione necessita di una lettura approfondita del meccanismo descritto
-nell'RFC~1305, ci limitiamo a descrivere in \tabref{tab:sys_timex_mode} i
-principali valori utilizzabili per il campo \var{mode}, un elenco più
-dettagliato del significato dei vari campi della struttura \var{timex} può
-essere ritrovato in \cite{glibc}.
+La funzione utilizza il meccanismo di David L. Mills, descritto
+nell'\href{http://www.ietf.org/rfc/rfc1305.txt}{RFC~1305}, che è alla base del
+protocollo NTP. La funzione è specifica di Linux e non deve essere usata se la
+portabilità è un requisito, le \acr{glibc} provvedono anche un suo omonimo
+\func{ntp\_adjtime}.  La trattazione completa di questa funzione necessita di
+una lettura approfondita del meccanismo descritto nell'RFC~1305, ci limitiamo
+a descrivere in \tabref{tab:sys_timex_mode} i principali valori utilizzabili
+per il campo \var{mode}, un elenco più dettagliato del significato dei vari
+campi della struttura \struct{timex} può essere ritrovato in \cite{glibc}.
 
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c| p{10cm}|}
+  \begin{tabular}[c]{|l|c| p{9cm}|}
     \hline
     \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
     \hline
@@ -2027,33 +1910,33 @@ essere ritrovato in \cite{glibc}.
                                            reale e l'orologio di sistema, che 
                                            deve essere indicata in microsecondi
                                            nel campo \var{offset} di
-                                           \var{timex}.\\ 
+                                           \struct{timex}.\\ 
     \const{ADJ\_FREQUENCY}      & 0x0002 & Imposta la differenze in frequenza
                                            fra il tempo reale e l'orologio di
                                            sistema, che deve essere indicata
                                            in parti per milione nel campo
-                                           \var{frequency} di \var{timex}.\\
+                                           \var{frequency} di \struct{timex}.\\
     \const{ADJ\_MAXERROR}       & 0x0004 & Imposta il valore massimo 
                                            dell'errore
                                            sul tempo, espresso in microsecondi 
                                            nel campo \var{maxerror} di
-                                           \var{timex}.\\ 
+                                           \struct{timex}.\\ 
     \const{ADJ\_ESTERROR}       & 0x0008 & Imposta la stima dell'errore
                                            sul tempo, espresso in microsecondi 
                                            nel campo \var{esterror} di
-                                           \var{timex}.\\
+                                           \struct{timex}.\\
     \const{ADJ\_STATUS}         & 0x0010 & Imposta alcuni
                                            valori di stato interni usati dal
                                            sistema nella gestione
                                            dell'orologio specificati nel campo
-                                           \var{status} di \var{timex}.\\ 
+                                           \var{status} di \struct{timex}.\\ 
     \const{ADJ\_TIMECONST}      & 0x0020 & Imposta la larghezza di banda del 
                                            PLL implementato dal kernel,
                                            specificato nel campo
-                                           \var{constant} di \var{timex}.\\ 
+                                           \var{constant} di \struct{timex}.\\ 
     \const{ADJ\_TICK}           & 0x4000 & Imposta il valore dei tick del timer
                                            in microsecondi, espresso nel campo
-                                           \var{tick} di \var{timex}.\\ 
+                                           \var{tick} di \struct{timex}.\\ 
     \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Imposta uno spostamento una tantum 
                                            dell'orologio secondo il valore del
                                            campo \var{offset} simulando il
@@ -2061,7 +1944,7 @@ essere ritrovato in \cite{glibc}.
     \hline
   \end{tabular}
   \caption{Costanti per l'assegnazione del valore del campo \var{mode} della
-    struttura \var{timex}.} 
+    struttura \struct{timex}.} 
   \label{tab:sys_timex_mode}
 \end{table}
 
@@ -2109,32 +1992,7 @@ stata introdotta una ulteriore rappresentazione, detta \textit{broken-down
   time}, che permette appunto di \textsl{suddividere} il \textit{calendar
   time} usuale in ore, minuti, secondi, ecc.
 
-\begin{figure}[!htb]
-  \footnotesize \centering
-  \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct tm {
-        int     tm_sec;         /* seconds */
-        int     tm_min;         /* minutes */
-        int     tm_hour;        /* hours */
-        int     tm_mday;        /* day of the month */
-        int     tm_mon;         /* month */
-        int     tm_year;        /* year */
-        int     tm_wday;        /* day of the week */
-        int     tm_yday;        /* day in the year */
-        int     tm_isdst;       /* daylight saving time */
-        long int tm_gmtoff;     /* Seconds east of UTC.  */
-        cost char *tm_zone;     /* Timezone abbreviation.  */
-};
-    \end{lstlisting}
-  \end{minipage} 
-  \normalsize 
-  \caption{La struttura \var{tm} per una rappresentazione del tempo in termini
-    di ora, minuti, secondi, ecc.}
-  \label{fig:sys_tm_struct}
-\end{figure}
-
-Questo viene effettuato attraverso una opportuna struttura \var{tm}, la cui
+Questo viene effettuato attraverso una opportuna struttura \struct{tm}, la cui
 definizione è riportata in \figref{fig:sys_tm_struct}, ed è in genere questa
 struttura che si utilizza quando si deve specificare un tempo a partire dai
 dati naturali (ora e data), dato che essa consente anche di trattare la
@@ -2169,10 +2027,23 @@ tempo in una stringa contenente data ed ora, i loro prototipi sono:
   Converte il \textit{broken-down time} in formato \type{time\_t}.
   
   \bodydesc{Tutte le funzioni restituiscono un puntatore al risultato in caso
-  di successo e \val{null} in caso di errore, tranne che \func{mktime} che
+  di successo e \val{NULL} in caso di errore, tranne che \func{mktime} che
   restituisce direttamente il valore o -1 in caso di errore.}
 \end{functions}
 
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/tm.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{tm} per una rappresentazione del tempo in
+    termini di ora, minuti, secondi, ecc.}
+  \label{fig:sys_tm_struct}
+\end{figure}
+
+
+
 Le prime due funzioni, \func{asctime} e \func{ctime} servono per poter
 stampare in forma leggibile un tempo; esse restituiscono il puntatore ad una
 stringa, allocata staticamente, nella forma:
@@ -2189,7 +2060,7 @@ l'utente deve specificare il buffer su cui la stringa deve essere copiata
 (deve essere di almeno 26 caratteri).
 
 Le altre tre funzioni, \func{gmtime}, \func{localtime} e \func{mktime} servono
-per convertire il tempo dal formato \type{time\_t} a quello di \var{tm} e
+per convertire il tempo dal formato \type{time\_t} a quello di \struct{tm} e
 viceversa; \func{gmtime} effettua la conversione usando il tempo coordinato
 universale (UTC), cioè l'ora di Greenwich; mentre \func{localtime} usa l'ora
 locale; \func{mktime} esegue la conversione inversa.  
@@ -2206,7 +2077,7 @@ locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre
 variabili globali mostrate in \figref{fig:sys_tzname}, cui si accede quando si
 include \file{time.h}. Queste variabili vengono impostate quando si chiama una
 delle precedenti funzioni di conversione, oppure invocando direttamente la
-funzione \func{tzset}, il cui prototipo è:
+funzione \funcd{tzset}, il cui prototipo è:
 \begin{prototype}{sys/timex.h}
 {void tzset(void)} 
   
@@ -2223,11 +2094,7 @@ verr
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-extern char *tzname[2];
-extern long timezone;
-extern int daylight;
-    \end{lstlisting}
+    \includestruct{listati/time_zone_var.c}
   \end{minipage} 
   \normalsize 
   \caption{Le variabili globali usate per la gestione delle \textit{time
@@ -2245,8 +2112,8 @@ solare, la seconda per l'ora legale.\footnote{anche se sono indicati come
 Benché la funzione \func{asctime} fornisca la modalità più immediata per
 stampare un tempo o una data, la flessibilità non fa parte delle sue
 caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il
-gionrno) di un tempo si può ricorrere alla più sofisticata \func{strftime}, il
-cui prototipo è:
+giorno) di un tempo si può ricorrere alla più sofisticata \funcd{strftime},
+il cui prototipo è:
 \begin{prototype}{time.h}
 {size\_t strftime(char *s, size\_t max, const char *format, 
   const struct tm *tm)}
@@ -2255,7 +2122,7 @@ Stampa il tempo \param{tm} nella stringa \param{s} secondo il formato
 \param{format}.
   
   \bodydesc{La funzione ritorna il numero di caratteri stampati in \param{s},
-  altrimenti restuisce 0.}
+  altrimenti restituisce 0.}
 \end{prototype}
 
 La funzione converte opportunamente il tempo \param{tm} in una stringa di
@@ -2312,7 +2179,7 @@ viene utilizzato come modificatore; alcuni\footnote{per la precisione quelli
   le \acr{glibc} provvedono tutte le estensioni introdotte da POSIX.2 per il
   comando \cmd{date}, i valori introdotti da SVID3 e ulteriori estensioni GNU;
   l'elenco completo dei possibili valori è riportato nella pagina di manuale
-  della funzione.} dei possibili valori che esso può assumere sono ripotati in
+  della funzione.} dei possibili valori che esso può assumere sono riportati in
 \tabref{tab:sys_strftime_format}. La funzione tiene conto anche della presenza
 di una localizzazione per stampare in maniera adeguata i vari nomi.
 
@@ -2347,14 +2214,14 @@ Per riportare il tipo di errore il sistema usa la variabile globale
 variabile è in genere definita come \direct{volatile} dato che può essere
 cambiata in modo asincrono da un segnale (si veda \secref{sec:sig_sigchld} per
 un esempio, ricordando quanto trattato in \secref{sec:proc_race_cond}), ma
-dato che un manipolatore di segnale scritto bene salva e ripristina il valore
+dato che un gestore di segnale scritto bene salva e ripristina il valore
 della variabile, di questo non è necessario preoccuparsi nella programmazione
 normale.
 
 I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
 nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
 costanti numeriche che identificano i vari errori; essi iniziano tutti per
-\var{E} e si possono considerare come nomi riservati. In seguito faremo
+\val{E} e si possono considerare come nomi riservati. In seguito faremo
 sempre riferimento a tali valori, quando descriveremo i possibili errori
 restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
 codice relativo ad un valore numerico con l'opzione \cmd{-l}.
@@ -2379,98 +2246,89 @@ Bench
 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
 riportare in opportuni messaggi le condizioni di errore verificatesi.  La
 prima funzione che si può usare per ricavare i messaggi di errore è
-\func{strerror}, il cui prototipo è:
+\funcd{strerror}, il cui prototipo è:
 \begin{prototype}{string.h}{char *strerror(int errnum)} 
   Restituisce una stringa con il messaggio di errore relativo ad
   \param{errnum}.
   
-  \bodydesc{La funzione ritorna il puntatore alla stringa col messaggio di
-    errore in caso di successo e \val{null} in caso di errore, nel qual caso
-    \var{errno} assumerà il valore \errval{EINVAL} se si è specificato un
-    numero di errore non valido.}
+  \bodydesc{La funzione ritorna il puntatore ad una stringa di errore.}
 \end{prototype}
 
-In generale \func{strerror} viene usata passando \var{errno} come parametro;
-nel caso si specifichi un codice sbagliato verrà restituito un messaggio di
-errore sconosciuto, e la funzione restituirà come errore \errcode{EINVAL}. La
-funzione tiene conto del valore della variabile di ambiente
-\val{LC\_MESSAGES} per usare eventuali traduzioni dei messaggi d'errore
-nella localizzazione presente. 
+
+La funzione ritorna il puntatore alla stringa contenente il messaggio di
+errore corrispondente al valore di \param{errnum}, se questo non è un valore
+valido verrà comunque restituita una stringa valida contenente un messaggio
+che dice che l'errore è sconosciuto, e \var{errno} verrà modificata assumendo
+il valore \errval{EINVAL}.
+
+In generale \func{strerror} viene usata passando \var{errno} come parametro,
+ed il valore di quest'ultima non verrà modificato. La funzione inoltre tiene
+conto del valore della variabile di ambiente \val{LC\_MESSAGES} per usare le
+appropriate traduzioni dei messaggi d'errore nella localizzazione presente.
 
 La funzione utilizza una stringa statica che non deve essere modificata dal
-programma e che è utilizzabile solo fino ad una chiamata successiva a
-\func{strerror}; per questo motivo non è rientrante e nel caso si usino i
-thread è provvista\footnote{questa funzione è la versione prevista dalle
-  \acr{glibc}, ed effettivamente definita in \file{string.h}, ne esiste una
-  analoga nello standard SUSv3 (quella riportata dalla pagina di manuale), che
-  restituisce \code{int} al posto di \code{char *}, e che tronca la stringa
-  restituita a \param{size}.} una versione apposita:
+programma; essa è utilizzabile solo fino ad una chiamata successiva a
+\func{strerror} o \func{perror}, nessun'altra funzione di libreria tocca
+questa stringa. In ogni caso l'uso di una stringa statica rende la funzione
+non rientrante, per cui nel caso nel caso si usino i thread le librerie
+forniscono\footnote{questa funzione è la versione prevista dalle \acr{glibc},
+  ed effettivamente definita in \file{string.h}, ne esiste una analoga nello
+  standard SUSv3 (quella riportata dalla pagina di manuale), che restituisce
+  \code{int} al posto di \code{char *}, e che tronca la stringa restituita a
+  \param{size}.}  una apposita versione rientrante \func{strerror\_r}, il cui
+prototipo è:
 \begin{prototype}{string.h}
   {char * strerror\_r(int errnum, char *buf, size\_t size)} 
   
-  Analoga a \func{strerror} ma usa il buffer \param{buf} di lunghezza massima
-  (compreso il terminatore) \param{size}.
-  
-  \bodydesc{La funzione restituisce il puntatore alla stringa; in caso di
-    errore \var{errno} oltre a \errval{EINVAL} può assumere anche il valore
-    \errval{ERANGE} per indicare che non c'è sufficiente memoria per contenere
-    la stringa di descrizione.}
+  Restituisce una stringa con il messaggio di errore relativo ad
+  \param{errnum}.
+  \bodydesc{La funzione restituisce l'indirizzo del messaggio in caso di
+    successo e \val{NULL} in caso di errore; nel qual caso \var{errno}
+    assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] si è specificato un valore di \param{errnum} non
+    valido.
+  \item[\errcode{ERANGE}] la lunghezza di \param{buf} è insufficiente a
+    contenere la stringa di errore.
+  \end{errlist}}
 \end{prototype}
 \noindent
-che utilizza un buffer che il singolo thread deve allocare, per evitare i
-problemi connessi alla condivisione del buffer statico. La funzione
-restituisce l'indirizzo della stringa usata, che può essere contenuta nel
-buffer specificato da \param{buf}, per una lunghezza non superiore a
-\param{size}, nel qual caso la stringa sarebbe troncata e terminata con uno
-zero (il carattere NUL).
 
+La funzione è analoga a \func{strerror} ma restituisce la stringa di errore
+nel buffer \param{buf} che il singolo thread deve allocare autonomamente per
+evitare i problemi connessi alla condivisione del buffer statico. Il messaggio
+è copiato fino alla dimensione massima del buffer, specificata dall'argomento
+\param{size}, che deve comprendere pure il carattere di terminazione;
+altrimenti la stringa viene troncata.
 
 Una seconda funzione usata per riportare i codici di errore in maniera
 automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
-\func{perror}, il cui prototipo è:
+\funcd{perror}, il cui prototipo è:
 \begin{prototype}{stdio.h}{void perror(const char *message)} 
   Stampa il messaggio di errore relativo al valore corrente di \var{errno}
-  sullo standard error; preceduto dalla stringa \var{message}.
+  sullo standard error; preceduto dalla stringa \param{message}.
 \end{prototype}
 
 I messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati
 in \capref{cha:errors}), e, usando il valore corrente di \var{errno}, si
 riferiscono all'ultimo errore avvenuto. La stringa specificata con
-\var{message} viene stampato prime del messaggio d'errore, seguita dai due
+\param{message} viene stampato prima del messaggio d'errore, seguita dai due
 punti e da uno spazio, il messaggio è terminato con un a capo.
 
-Il messaggio può essere riportato anche usando altre variabili globali
-dichiarate in \file{errno.h}:
-\begin{verbatim}
-   const char *sys_errlist[];
-   int sys_nerr;
-\end{verbatim}
-la prima contiene i puntatori alle stringhe di errore indicizzati da
-\var{errno}; la seconda esprime il valore più alto per un codice di errore,
-l'utilizzo di questa stringa è sostanzialmente equivalente a quello di
-\func{strerror}.
+Il messaggio può essere riportato anche usando le due variabili globali:
+\includecodesnip{listati/errlist.c} 
+dichiarate in \file{errno.h}. La prima contiene i puntatori alle stringhe di
+errore indicizzati da \var{errno}; la seconda esprime il valore più alto per
+un codice di errore, l'utilizzo di questa stringa è sostanzialmente
+equivalente a quello di \func{strerror}.
 
 \begin{figure}[!htb]
-  \footnotesize
-  \begin{lstlisting}{}
-    /* convert string to number */
-    err = strtol(argv[optind], NULL, 10);
-    /* testing error condition on conversion */
-    if (err==LONG_MIN) {
-        perror("Underflow on error code");
-        return 1;
-    } else if (err==LONG_MIN) {
-        perror("Overflow on error code");
-        return 1;
-    }
-    /* conversion is fine */
-    if (message) {
-        printf("Error message for %d is %s\n", err, strerror(err));
-    }
-    if (label) {
-        printf("Error label for %d is %s\n", err, err_code[err]);
-    }
-  \end{lstlisting}
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includecodesample{listati/errcode_mess.c}
+  \end{minipage}
+  \normalsize
   \caption{Codice per la stampa del messaggio di errore standard.}
   \label{fig:sys_err_mess}
 \end{figure}
@@ -2513,7 +2371,7 @@ messaggi con maggiore informazione; ad esempio negli standard di
 programmazione GNU si richiede che ogni messaggio di errore sia preceduto dal
 nome del programma, ed in generale si può voler stampare il contenuto di
 qualche variabile; per questo le \acr{glibc} definiscono la funzione
-\func{error}, il cui prototipo è:
+\funcd{error}, il cui prototipo è:
 \begin{prototype}{stdio.h}
 {void error(int status, int errnum, const char *format, ...)} 
 
@@ -2545,9 +2403,9 @@ il valore 
 un'altra variabile globale, \var{error\_message\_count}, che tiene conto di
 quanti errori ci sono stati.
 
-Un'altra funzione per la stampa degli errori, ancora più sofisticata, è
-\func{error\_at\_line}, che prende due argomenti aggiuntivi per indicare linea
-e file su cui è avvenuto l'errore; il suo prototipo è:
+Un'altra funzione per la stampa degli errori, ancora più sofisticata, che
+prende due argomenti aggiuntivi per indicare linea e file su cui è avvenuto
+l'errore è \funcd{error\_at\_line}; il suo prototipo è:
 \begin{prototype}{stdio.h}
 {void error\_at\_line(int status, int errnum, const char *fname, 
   unsigned int lineno, const char *format, ...)}