Prova di endianess
[gapil.git] / system.tex
index a8174dbe2a0649c0377406baed13076c76df14e9..2427feeb025ab0cccce6365e17ae4600aedc606e 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
 %% 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",
 %% 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",
@@ -42,7 +42,7 @@ quelle della gestione dei file.
 \subsection{Limiti e parametri di sistema}
 \label{sec:sys_limits}
 
 \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
 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{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
     \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{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
     \hline
     \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
     \hline
@@ -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:
 
 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}.
 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}.
@@ -521,18 +506,7 @@ solo definendo \macro{\_GNU\_SOURCE}.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \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 \structd{utsname}.} 
   \end{minipage}
   \normalsize 
   \caption{La struttura \structd{utsname}.} 
@@ -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
 \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
   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
 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 è
 \ctyp{void}.
 
 L'indirizzo a cui il valore corrente del parametro deve essere letto è
@@ -896,20 +870,7 @@ genere 
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \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 \structd{statfs}.} 
   \end{minipage}
   \normalsize 
   \caption{La struttura \structd{statfs}.} 
@@ -983,17 +944,7 @@ il significato dei vari campi.
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
   \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 \structd{passwd} contenente le informazioni relative ad
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{passwd} contenente le informazioni relative ad
@@ -1070,14 +1021,7 @@ in questo caso le informazioni vengono restituite in una struttura di tipo
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
   \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 \structd{group} contenente le informazioni relative ad
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{group} contenente le informazioni relative ad
@@ -1161,16 +1105,16 @@ 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}.
 
 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
 
 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.
 \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.
@@ -1206,6 +1150,18 @@ standard \const{\_PATH\_UTMP} (che 
 corrispondenti ai file \file{/var/run/utmp} e \file{/var/log/wtmp} visti in
 precedenza.
 
 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 \funcd{getutent}, \funcd{getutid}, \funcd{getutline}
 e \funcd{pututline}, i cui prototipi sono:
 Una volta aperto il file si può eseguire una scansione leggendo o scrivendo
 una voce con le funzioni \funcd{getutent}, \funcd{getutid}, \funcd{getutline}
 e \funcd{pututline}, i cui prototipi sono:
@@ -1230,39 +1186,11 @@ e \funcd{pututline}, i cui prototipi sono:
 \end{functions}
 
 Tutte queste funzioni fanno riferimento ad una struttura di tipo \struct{utmp},
 \end{functions}
 
 Tutte queste funzioni fanno riferimento ad una struttura di tipo \struct{utmp},
-la cui definizione in Linux è riportata in \secref{fig:sys_utmp_struct}. Le
+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.
 
 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 \structd{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
 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
@@ -1291,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{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
     \hline
   \end{tabular}
   \caption{Classificazione delle voci del database di accounting a seconda dei
@@ -1343,9 +1271,6 @@ 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.
   \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 \struct{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
 \end{functions}
 
 La prima funzione permette l'aggiunta di una voce a \file{wmtp} specificando
@@ -1377,26 +1302,7 @@ di tipo \struct{rusage}, la cui definizione (che si trova in
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
   \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 \structd{rusage} per la lettura delle informazioni dei 
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{rusage} per la lettura delle informazioni dei 
@@ -1467,24 +1373,7 @@ 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 \struct{rlimit}, la cui definizione è riportata in
 \figref{fig:sys_rlimit_struct}, ed i cui campi corrispondono appunto a limite
 può modificarne il valore. Il valore di questi limiti è mantenuto in una
 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 \structd{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 permettere di leggere
 
 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 permettere di leggere
@@ -1514,6 +1403,20 @@ prototipi sono:
   ed \errval{EFAULT}.}
 \end{functions}
 
   ed \errval{EFAULT}.}
 \end{functions}
 
+\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
 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
@@ -1578,13 +1481,13 @@ poi effettuato attraverso la struttura \struct{rlimit} puntata da
   evitare la creazione di \file{core} file (al proposito si veda
   \secref{sec:sig_prog_error}).}
 
   evitare la creazione di \file{core} file (al proposito si veda
   \secref{sec:sig_prog_error}).}
 
-Nello specificare un limite, oltre a 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 per gli
-altri programmi eseguiti attraverso una \func{exec} (vedi
+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 per gli altri programmi eseguiti attraverso una \func{exec} (vedi
 \secref{sec:proc_exec}).
 
 
 \secref{sec:proc_exec}).
 
 
@@ -1808,14 +1711,7 @@ struttura di tipo \struct{tms}, la cui definizione 
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
   \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 \structd{tms} dei tempi di processore associati a un
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{tms} dei tempi di processore associati a un
@@ -1836,7 +1732,6 @@ lo stato di terminazione di tutti i suoi figli, questi processi ``nipoti'' non
 verranno considerati nel calcolo di questi tempi.
 
 
 verranno considerati nel calcolo di questi tempi.
 
 
-
 \subsection{Le funzioni per il \textit{calendar time}}
 \label{sec:sys_time_base}
 
 \subsection{Le funzioni per il \textit{calendar time}}
 \label{sec:sys_time_base}
 
@@ -1845,8 +1740,8 @@ mantenuto dal kernel in una variabile di tipo \type{time\_t}, che usualmente
 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
 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 in nel suddetto formato; il
-suo prototipo è:
+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}.
   
 \begin{prototype}{time.h}{time\_t time(time\_t *t)}
   Legge il valore corrente del \textit{calendar time}.
   
@@ -1909,17 +1804,7 @@ nanosecondo.\footnote{la precisione 
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \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 \structd{timeval} e \structd{timespec} usate per una
   \end{minipage} 
   \normalsize 
   \caption{Le strutture \structd{timeval} e \structd{timespec} usate per una
@@ -1972,29 +1857,7 @@ effettuato.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \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}
+    \includestruct{listati/timex.h}
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{timex} per il controllo dell'orologio di
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{timex} per il controllo dell'orologio di
@@ -2025,15 +1888,15 @@ 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}.
 
 devono essere specificati come OR binario delle costanti riportate in
 \secref{tab:sys_timex_mode}.
 
-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 \struct{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
 
 \begin{table}[htb]
   \footnotesize
@@ -2129,31 +1992,6 @@ 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.
 
   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.  */
-        const char *tm_zone;    /* Timezone abbreviation.  */
-};
-    \end{lstlisting}
-  \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}
-
 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
 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
@@ -2193,6 +2031,19 @@ tempo in una stringa contenente data ed ora, i loro prototipi sono:
   restituisce direttamente il valore o -1 in caso di errore.}
 \end{functions}
 
   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:
 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:
@@ -2243,11 +2094,7 @@ verr
   \footnotesize
   \centering
   \begin{minipage}[c]{15cm}
   \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
   \end{minipage} 
   \normalsize 
   \caption{Le variabili globali usate per la gestione delle \textit{time
@@ -2404,46 +2251,56 @@ prima funzione che si pu
   Restituisce una stringa con il messaggio di errore relativo ad
   \param{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}
 
 \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
 
 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)} 
   
 \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
 \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}) è
 
 Una seconda funzione usata per riportare i codici di errore in maniera
 automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
@@ -2456,41 +2313,22 @@ automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) 
 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
 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
-\param{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.
 
 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]
 
 \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}
   \caption{Codice per la stampa del messaggio di errore standard.}
   \label{fig:sys_err_mess}
 \end{figure}
@@ -2565,9 +2403,9 @@ il valore 
 un'altra variabile globale, \var{error\_message\_count}, che tiene conto di
 quanti errori ci sono stati.
 
 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, è
-\funcd{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, ...)} 
 \begin{prototype}{stdio.h}
 {void error\_at\_line(int status, int errnum, const char *fname, 
   unsigned int lineno, const char *format, ...)}