Aggiunte varie.
[gapil.git] / system.tex
index 7a44a3591fef0b448ff58681ebd8fdff5f539fba..145b1a0d92fccb130c11a8e14f5c1523cd87bd1b 100644 (file)
-\chapter{La gestione del sistema}
+\chapter{La gestione del sistema, delle risorse, e degli errori}
 \label{cha:system}
 
 \label{cha:system}
 
+In questo capitolo tratteremo varie interfacce che attengono agli aspetti più
+generali del sistema, come quelle per la gestione di parametri e
+configurazione, quelle per la lettura dei limiti e delle carattistiche dello
+stesso, quelle per il controllo dell'uso delle risorse da parte dei processi,
+quelle per la gestione dei tempi e degli errori.
 
 
 
 
+\section{La configurazione del sistema}
+\label{sec:sys_config}
+
+In questa sezione esamineremo le macro e le funzioni che permettono di
+conoscere e settare i parametri di configurazione del sistema, di ricavarme
+limiti e caratteristiche, e di controllare i filesystem disponibili, montarli
+e rimuoverli da programma.
+
+
+\subsection{Limiti e parametri di sistema}
+\label{sec:sys_limits}
+
+In qualunque sistema sono presenti un gran numero di parametri e costanti il
+cui valore può essere definito dall'architettura dell'hardware,
+dall'implementazione del sistema, dalle opzioni con cui si sono compilati il
+kernel e le librerie o anche configurabili dall'amministratore all'avvio del
+sistema o durente le sue attività.
+
+Chiaramente per scrivere programmi portabili occorre poter determinare opzioni
+disponibili e caratteristiche del sistema (come i valori massimi e minimi dei
+vari tipi di variabili, o la presenza del supporto del supporto per
+l'operazione che interessa). Inoltre alcuni di questi limiti devono poter
+essere determinabili anche in corso di esecuzione del programma, per non dover
+ricompilare tutti i programmi quando si usa una nuova versione del kernel o si
+cambia una delle configurazioni del sistema. Per tutto questo sono necessari
+due tipi di funzionalità:
+\begin{itemize*}
+\item la possibilità di determinare limiti ed opzioni al momento della
+  compilazione.
+\item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
+\end{itemize*}
+
+La prima funzionalità si può ottenere includendo gli opportuni header file,
+mentre per la seconda sono ovviamante necessarie delle funzioni; la situazione
+è complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti
+sono fissi in una implementazione mentre possono variare in un altra.
+Quando i limiti sono fissi vengono definiti come macro nel file
+\file{limits.h}, se invece possono variare, il loro valore sarà ottenibile
+tramite la funzione \func{sysconf}. 
+
+Lo standard ANSI C definisce dei limiti che sono tutti fissi e pertanto
+disponibili al momanto della compilazione; un elenco è riportato in
+\tabref{tab:sys_ansic_macro}, come ripreso da \file{limits.h}; come si vede
+per la maggior parte attengono alle dimensioni dei tipi dei dati interi, le
+informazioni analoghe per i dati in virgola mobile sono definite a parte e
+accessibili includendo \file{float.h}. Un'altra costante prevista dallo
+standard (l'unica che può non essere fissa e che pertanto non è definita in
+\file{limits.h}) è \macro{FOPEN\_MAX}, essa deve essere definita in
+\file{stdio.h} ed avere un valore minimo di 8.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|r|l|}
+    \hline
+    \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+    \hline
+    \hline
+    \macro{MB\_LEN\_MAX}&       16  & massima dimensione di un 
+                                      carattere multibyte\\
+    \macro{CHAR\_BIT} &          8  & bit di \type{char}\\
+    \macro{UCHAR\_MAX}&        255  & massimo di \type{unsigned char}\\
+    \macro{SCHAR\_MIN}&       -128  & minimo di \type{signed char}\\
+    \macro{SCHAR\_MAX}&        127  & massimo di \type{signed char}\\
+    \macro{CHAR\_MIN} &\footnotemark& minimo di \type{char}\\
+    \macro{CHAR\_MAX} &\footnotemark& massimo di \type{char}\\
+    \macro{SHRT\_MIN} &     -32768  & minimo di \type{short}\\
+    \macro{SHRT\_MAX} &      32767  & massimo di \type{short}\\
+    \macro{USHRT\_MAX}&      65535  & massimo di \type{unsigned short}\\
+    \macro{INT\_MAX}  & 2147483647  & minimo di \type{int}\\
+    \macro{INT\_MIN}  &-2147483648  & minimo di \type{int}\\
+    \macro{UINT\_MAX} & 4294967295  & massimo di \type{unsigned int}\\
+    \macro{LONG\_MAX} & 2147483647  & massimo di \type{long}\\
+    \macro{LONG\_MIN} &-2147483648  & minimo di \type{long}\\
+    \macro{ULONG\_MAX}& 4294967295  & massimo di \type{unsigned long}\\
+    \hline                
+  \end{tabular}
+  \caption{Macro definite in \file{limits.h} in conformità allo standard
+    ANSI C.}
+  \label{tab:sys_ansic_macro}
+\end{table}
+
+\footnotetext[1]{il valore può essere 0 o \macro{SCHAR\_MIN} a seconda che il
+  sistema usi caratteri con segno o meno.} 
+
+\footnotetext[2]{il valore può essere \macro{UCHAR\_MAX} o \macro{SCHAR\_MAX}
+  a seconda che il sistema usi caratteri con segno o meno.}
+
+A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
+\type{long long} introdotto con il nuovo standard, i relativi valori sono in
+\tabref{tab:sys_isoc90_macro}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|r|l|}
+    \hline
+    \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+    \hline
+    \hline
+    \macro{LLONG\_MAX}& 9223372036854775807&massimo di \type{long long}\\
+    \macro{LLONG\_MIN}&-9223372036854775808&minimo di \type{long long}\\
+    \macro{ULLONG\_MAX}&18446744073709551615&
+    massimo di \type{unsigned long long}\\
+    \hline                
+  \end{tabular}
+  \caption{Macro definite in \file{limits.h} in conformità allo standard
+    ISO C90.}
+  \label{tab:sys_isoc90_macro}
+\end{table}
+
+Lo standard POSIX.1 definisce 33 diversi limiti o costanti, 15 delle quali,
+riportate in \secref{tab:sys_posix1_base}, devono essere sempre dichiarate,
+in quanto definiscono dei valori minimi che qualunque implementazione che sia
+conforme allo standard deve avere; molti di questi valori sono di scarsa
+utilità, essendo troppo ristretti ed ampiamente superati in tutte le
+implementazioni dello standard.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|r|p{8cm}|}
+    \hline
+    \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+    \hline
+    \hline
+    \macro{\_POSIX\_ARG\_MAX} &4096  & dimensione massima degli argomenti
+                                       passati ad una funzione della famiglia
+                                       \func{exec}.\\ 
+    \macro{\_POSIX\_CHILD\_MAX}  &6  & numero massimo di processi contemporanei
+                                       che un utente può eseguire.\\
+    \macro{\_POSIX\_LINK\_MAX}   &8  & numero massimo di link a un file\\
+    \macro{\_POSIX\_MAX\_CANON}&255  & spazio disponibile nella coda di input
+                                       canonica del terminale\\
+    \macro{\_POSIX\_MAX\_INPUT}&255  & spazio disponibile nella coda di input 
+                                       del terminale\\
+    \macro{\_POSIX\_NGROUPS\_MAX}&0  & numero di gruppi supplementari per
+                                     processo.\\
+    \macro{\_POSIX\_OPEN\_MAX}  &16  & numero massimo di file che un processo
+                                       può mantenere aperti in contemporanea.\\
+    \macro{\_POSIX\_NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
+    \macro{\_POSIX\_PATH\_MAX}& 256  & lunghezza in byte di pathname.\\
+    \macro{\_POSIX\_PIPE\_BUF}& 512  & byte scrivibili atomicamente in una
+                                       pipe\\
+    \macro{\_POSIX\_SSIZE\_MAX}&32767& valore massimo del tipo 
+                                       \type{ssize\_t}.\\
+    \macro{\_POSIX\_STREAM\_MAX}&8   & massimo numero di stream aperti per
+                                       processo in contemporanea.\\
+    \macro{\_POSIX\_TZNAME\_MAX}&    & dimensione massima del nome di una
+                                       \texttt{timezone} (vedi ).\\ 
+    \hline                
+  \end{tabular}
+  \caption{Costanti fisse, definite in \file{limits.h}, richieste
+    obbligatoriamente allo standard POSIX.1.}
+  \label{tab:sys_posix1_base}
+\end{table}
+
+Oltre a questi valori lo standard ne definisce altri a riguardo
+
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|r|p{8cm}|}
+    \hline
+    \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+    \hline
+    \hline
+    \macro{\_POSIX\_AIO\_LISTIO\_MAX}&  2& \\
+    \macro{\_POSIX\_AIO\_MAX}&  1& \\
+    \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
+    \macro{\_POSIX\_MQ\_OPEN\_MAX}&  8& \\
+    \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
+    \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
+    \macro{\_POSIX\_NAME\_MAX}&  14& \\
+    \macro{\_POSIX\_PATH\_MAX}& 256& \\
+    \macro{\_POSIX\_PIPE\_BUF}& 512& \\
+    \macro{\_POSIX\_SSIZE\_MAX}& 32767& \\
+    \macro{\_POSIX\_STREAM\_MAX}&8 & \\
+    \macro{\_POSIX\_TZNAME\_MAX}& 6& \\
+    \hline                
+  \end{tabular}
+  \caption{Macro definite in \file{limits.h} in conformità allo standard
+    POSIX.1.}
+  \label{tab:sys_posix1_macro}
+\end{table}
+
+Lo standard ANSI C definisce dei limiti solo sulle dimensioni dei tipi dei
+dati, che sono ovviamente fissi, gli standard POSIX.1 e POSIX.2 definiscono
+molti altri limiti attinenti a varie caratteristiche del sistema (come il
+numero massimo di figli, la lunghezza di un pathname, ecc.) che possono essere
+fissi o meno: quando sono fissi vengono definiti come macro nel file
+\file{limits.h}, se invece possono variare, il loro valore sarà ottenibile
+tramite la funzione \func{sysconf}.
+
+
+\subsection{La funzione \func{sysconf}}
+\label{sec:sys_sysconf}
+
+Come accennato in \secref{sec:sys_limits} quando uno dei limiti o delle
+carateristiche del sistema può variare, per evitare di dover 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 cui prototipo è:
+\begin{prototype}{unistd.h}{long sysconf(int name)}
+  Restituisce il valore del parametro di sistema \param{name}.
+  
+  \bodydesc{La funzione restituisce indietro il valore del parametro
+    richiesto, o 1 se si tratta di un'opzione disponibile, 0 se l'opzione non
+    è disponibile e -1 in caso di errore (ma \var{errno} non viene settata).}
+\end{prototype}
+
+La funzione prende come argomento un intero che specifica quale dei limiti si
+vuole conoscere; uno specchietto contentente tutti quelli disponibili in
+Linux, e la corrispondente macro di \func{limits.h}, è riportato in \ntab.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+    \begin{tabular}[c]{|l|l|p{9cm}|}
+      \hline
+      \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
+      \hline
+      \hline
+      \texttt{\_SC\_ARG\_MAX} &\macro{ARG\_MAX}&
+      La dimensione massima degli argomenti passati ad una funzione
+      della famiglia \func{exec}.\\
+      \texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}&
+      Il numero massimo di processi contemporanei che un utente può
+      eseguire.\\
+      \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
+      Il numero di \textit{clock tick} al secondo, cioè la frequenza delle
+      interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\
+      \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
+      Il massimo numero di stream che un processo può mantenere aperti in
+      contemporanea. Questo liminte previsto anche dallo standard ANSI C, che
+      specifica la macro {FOPEN\_MAX}.\\
+      \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
+      La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\
+      \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
+      Il numero massimo di file che un processo può mantenere aperti in
+      contemporanea.\\
+      \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
+      Indica se è supportato il \textit{job conotrol} (vedi
+      \secref{sec:sess_xxx}) in stile POSIX.\\
+      \texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
+      Indica se il sistema supporta i \textit{saved id} (vedi
+      \secref{sec:proc_access_id}).\\ 
+      \texttt{\_SC\_VERSION}& \macro{\_POSIX\_VERSION} &
+      Indica il mese e l'anno di approvazione della revisione dello standard
+      POSIX.1 a cui il sistema fa riferimento, nel formato YYYYMML, la
+      revisione più recente è 199009L, che indica il Settembre 1990.\\
+     \hline
+    \end{tabular}
+  \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
+  \label{tab:sys_sysconf_par}
+\end{table}
+
+
+
+\subsection{Opzioni e configurazione del sistema}
+\label{sec:sys_sys_config}
+
+La funzione \func{sysctl} ...
+
+
+
+\subsection{La configurazione dei filesystem}
+\label{sec:sys_file_config}
+
+La funzione \func{statfs} ...
+
+La funzione \func{pathconf} ...
+
+
+
+
+\section{Limitazione ed uso delle risorse}
+\label{sec:sys_res_limits}
+
+In questa sezione esamimeremo le funzioni che permettono di esaminare e
+controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
+utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
+sul loro utilizzo.
+
+
+
+\subsection{L'uso delle risorse}
+\label{sec:sys_resource_use}
+
+
+\subsection{Limiti sulle risorse}
+\label{sec:sys_resource_limit}
+
+
+\subsection{Le risorse di memoria}
+\label{sec:sys_memory_res}
+
+
+\subsection{Le risorse di processore}
+\label{sec:sys_cpu_load}
+
+
+
+\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}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \var{rusage} per la lettura delle informazioni dei 
+    delle risorse usate da un processo.}
+  \label{fig:sys_rusage_struct}
+\end{figure}
+
+
+
+
+\var{tms\_utime}, \var{tms\_stime}, \var{tms\_cutime}, \var{tms\_uetime}
+
+
+
+\section{La gestione dei tempi del sistema}
+\label{sec:sys_time}
+
+In questa sezione tratteremo le varie funzioni per la gestione delle
+date e del tempo in un sistema unix-like, e quelle per convertire i vari
+tempi nelle differenti rappresentazioni che vengono utilizzate.
 
 
 \subsection{La misura del tempo in unix}
 
 
 \subsection{La misura del tempo in unix}
-\label{sec:intro_unix_time}
+\label{sec:sys_unix_time}
 
 
-Storicamente i sistemi unix-like hanno sempre mantenuto due distinti valori
-per i tempi all'interno del sistema, essi sono rispettivamente chiamati
-\textit{calendar time} e \textit{process time}, secondo le definizioni:
+Storicamente i sistemi unix-like hanno sempre mantenuto due distinti
+valori per i tempi all'interno del sistema, essi sono rispettivamente
+chiamati \textit{calendar time} e \textit{process time}, secondo le
+definizioni:
 \begin{itemize}
 \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
   primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
 \begin{itemize}
 \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
   primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
@@ -19,17 +373,17 @@ per i tempi all'interno del sistema, essi sono rispettivamente chiamati
   dato che l'UTC corrisponde all'ora locale di Greenwich.  È il tempo su cui
   viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per
   indicare le date di modifica dei file o quelle di avvio dei processi. Per
   dato che l'UTC corrisponde all'ora locale di Greenwich.  È il tempo su cui
   viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per
   indicare le date di modifica dei file o quelle di avvio dei processi. Per
-  memorizzare questo tempo è stato riservato il tipo primitivo \func{time\_t}.
+  memorizzare questo tempo è stato riservato il tipo primitivo \type{time\_t}.
 \item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato
   in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate
   dal timer di sistema, e che per Linux avvengono ogni centesimo di
   secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni
     millesimo di secondo}. Il dato primitivo usato per questo tempo è
 \item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato
   in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate
   dal timer di sistema, e che per Linux avvengono ogni centesimo di
   secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni
     millesimo di secondo}. Il dato primitivo usato per questo tempo è
-  \func{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di
+  \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di
   operazione del timer, e corrisponde dunque al numero di tick al secondo.  Lo
   standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK});
   questo valore può comunque essere ottenuto con \func{sysconf} (vedi
   operazione del timer, e corrisponde dunque al numero di tick al secondo.  Lo
   standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK});
   questo valore può comunque essere ottenuto con \func{sysconf} (vedi
-  \secref{sec:intro_limits}).
+  \secref{sec:sys_limits}).
 \end{itemize}
 
 In genere si usa il \textit{calendar time} per tenere le date dei file e le
 \end{itemize}
 
 In genere si usa il \textit{calendar time} per tenere le date dei file e le
@@ -60,8 +414,10 @@ time viene chiamato \textit{CPU time}.
 
 
 
 
 
 
+
+
 \section{La gestione degli errori}
 \section{La gestione degli errori}
-\label{sec:intro_errors}
+\label{sec:sys_errors}
 
 La gestione degli errori è in genere una materia complessa. Inoltre il modello
 utilizzato dai sistema unix-like è basato sull'architettura a processi, e
 
 La gestione degli errori è in genere una materia complessa. Inoltre il modello
 utilizzato dai sistema unix-like è basato sull'architettura a processi, e
@@ -69,8 +425,8 @@ presenta una serie di problemi nel caso lo si debba usare con i thread.
 Esamineremo in questa sezione le sue caratteristiche principali.
 
 
 Esamineremo in questa sezione le sue caratteristiche principali.
 
 
-\subsection{La variabile \func{errno}}
-\label{sec:intro_errno}
+\subsection{La variabile \var{errno}}
+\label{sec:sys_errno}
 
 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
 riportare condizioni di errore, ed è una buona norma di programmazione
 
 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
 riportare condizioni di errore, ed è una buona norma di programmazione
@@ -86,8 +442,8 @@ Per riportare il tipo di errore il sistema usa la variabile globale
   problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
   anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
   può anche usare una macro, e questo è infatti il modo usato da Linux per
   problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
   anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
   può anche usare una macro, e questo è infatti il modo usato da Linux per
-  renderla locale ai singoli thread }, definita nell'header \file{errno.h}, la
-variabile è in genere definita come \var{volatile} dato che può essere
+  renderla locale ai singoli thread.}, definita nell'header \file{errno.h}; la
+variabile è in genere definita come \type{volatile} dato che può essere
 cambiata in modo asincrono da un segnale (per una descrizione dei segnali si
 veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto
 bene salva e ripristina il valore della variabile, di questo non è necessario
 cambiata in modo asincrono da un segnale (per una descrizione dei segnali si
 veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto
 bene salva e ripristina il valore della variabile, di questo non è necessario
@@ -115,7 +471,7 @@ verificato il fallimento della funzione attraverso il suo codice di ritorno.
 
 
 \subsection{Le funzioni \func{strerror} e \func{perror}}
 
 
 \subsection{Le funzioni \func{strerror} e \func{perror}}
-\label{sec:intro_strerror}
+\label{sec:sys_strerror}
 
 Benché gli errori siano identificati univocamente dal valore numerico di
 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
 
 Benché gli errori siano identificati univocamente dal valore numerico di
 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
@@ -123,8 +479,8 @@ 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 è:
 \begin{prototype}{string.h}{char * strerror(int errnum)} 
 prima funzione che si può usare per ricavare i messaggi di errore è
 \func{strerror}, il cui prototipo è:
 \begin{prototype}{string.h}{char * strerror(int errnum)} 
-  La funzione ritorna una stringa (statica) che descrive l'errore il cui
-  codice è passato come parametro.
+  Ritorna una stringa (statica) che descrive l'errore il cui codice è passato
+  come parametro.
 \end{prototype}
 
 In generale \func{strerror} viene usata passando \var{errno} come parametro;
 \end{prototype}
 
 In generale \func{strerror} viene usata passando \var{errno} come parametro;
@@ -136,10 +492,11 @@ provvista\footnote{questa funzione 
   standard POSIX} una versione apposita:
 \begin{prototype}{string.h}
 {char * strerror\_r(int errnum, char * buff, size\_t size)} 
   standard POSIX} una versione apposita:
 \begin{prototype}{string.h}
 {char * strerror\_r(int errnum, char * buff, size\_t size)} 
-  La funzione è analoga a \func{strerror} ma ritorna il messaggio in un buffer
-  specificato da \var{buff} di lunghezza massima (compreso il terminatore)
-  \var{size}.
+  Analoga a \func{strerror} ma ritorna il messaggio in un buffer
+  specificato da \param{buff} di lunghezza massima (compreso il terminatore)
+  \param{size}.
 \end{prototype}
 \end{prototype}
+\noindent
 che utilizza un buffer che il singolo thread deve allocare, per evitare i
 problemi connessi alla condivisione del buffer statico. Infine, per completare
 la caratterizzazione dell'errore, si può usare anche la variabile
 che utilizza un buffer che il singolo thread deve allocare, per evitare i
 problemi connessi alla condivisione del buffer statico. Infine, per completare
 la caratterizzazione dell'errore, si può usare anche la variabile
@@ -148,11 +505,11 @@ globale\footnote{anche questa 
 attualmente in esecuzione.
 
 Una seconda funzione usata per riportare i codici di errore in maniera
 attualmente in esecuzione.
 
 Una seconda funzione usata per riportare i codici di errore in maniera
-automatizzata sullo standard error (vedi \secref{sec:file_stdfiles}) è
+automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
 \func{perror}, il cui prototipo è:
 \begin{prototype}{stdio.h}{void perror (const char *message)} 
 \func{perror}, il cui prototipo è:
 \begin{prototype}{stdio.h}{void perror (const char *message)} 
-  La funzione stampa il messaggio di errore relativo al valore corrente di
-  \var{errno} sullo standard error; preceduto dalla stringa \var{message}.
+  Stampa il messaggio di errore relativo al valore corrente di \var{errno}
+  sullo standard error; preceduto dalla stringa \var{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
 \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
@@ -205,10 +562,15 @@ o la macro (\texttt{\small 15--17}) associate a quel codice.
     }
   \end{lstlisting}
   \caption{Codice per la stampa del messaggio di errore standard.}
     }
   \end{lstlisting}
   \caption{Codice per la stampa del messaggio di errore standard.}
-  \label{fig:intro_err_mess}
+  \label{fig:sys_err_mess}
 \end{figure}
 
 
 \end{figure}
 
 
-\subsection{Valori e limiti del sistema}
-\label{sec:sys_limits}
+\section{La gestione di utenti e gruppi}
+\label{sec:sys_user_group}
+
 
 
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: