Aggiornamenti del copyright all'anno nuovo, e risistemazione delle
[gapil.git] / system.tex
index 1a95e3fd8b2746c48919f9f8e668db42c6da075d..f2569bf90a08beaedfe5654b421cbfe5fd784a78 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
-%% Copyright (C) 2000-2005 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2007 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -8,6 +8,7 @@
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %%
+
 \chapter{La gestione del sistema, del tempo e degli errori}
 \label{cha:system}
 
@@ -149,7 +150,7 @@ sez.~\ref{sec:sys_file_limits}.
 
 Purtroppo la sezione dello standard che tratta questi argomenti è una delle
 meno chiare\footnote{tanto che Stevens, in \cite{APUE}, la porta come esempio
-  di ``standardese''.}. Lo standard prevede che ci siano 13 macro che
+  di ``\textsl{standardese}''.}. Lo standard prevede che ci siano 13 macro che
 descrivono le caratteristiche del sistema (7 per le caratteristiche generiche,
 riportate in tab.~\ref{tab:sys_generic_macro}, e 6 per le caratteristiche dei
 file, riportate in tab.~\ref{tab:sys_file_macro}).
@@ -218,7 +219,7 @@ riportati in tab.~\ref{tab:sys_posix1_general}.
     \const{\_POSIX\_STREAM\_MAX} &    8& massimo numero di stream aperti per
                                          processo in contemporanea.\\
     \const{\_POSIX\_TZNAME\_MAX} &     & dimensione massima del nome di una
-                                         \texttt{timezone} (vedi
+                                         \textit{timezone} (vedi
                                          sez.~\ref{sec:sys_date}). \\ 
     \const{\_POSIX\_NGROUPS\_MAX}&    0& numero di gruppi supplementari per
                                          processo (vedi 
@@ -316,40 +317,52 @@ relative spiegazioni, si pu
       \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
       \hline
       \hline
-      \texttt{\_SC\_ARG\_MAX} &\const{ARG\_MAX}&
-      La dimensione massima degli argomenti passati ad una funzione
-      della famiglia \func{exec}.\\
-      \texttt{\_SC\_CHILD\_MAX}&\const{\_CHILD\_MAX}&
-      Il numero massimo di processi contemporanei che un utente può
-      eseguire.\\
-      \texttt{\_SC\_OPEN\_MAX}&\const{\_OPEN\_MAX}&
-      Il numero massimo di file che un processo può mantenere aperti in
-      contemporanea.\\
+      \texttt{\_SC\_ARG\_MAX}   & \const{ARG\_MAX}&
+                                  La dimensione massima degli argomenti passati
+                                  ad una funzione della famiglia \func{exec}.\\
+      \texttt{\_SC\_CHILD\_MAX} & \const{\_CHILD\_MAX}&
+                                  Il numero massimo di processi contemporanei
+                                  che un utente può eseguire.\\
+      \texttt{\_SC\_OPEN\_MAX}  & \const{\_OPEN\_MAX}&
+                                  Il numero massimo di file che un processo può
+                                  mantenere aperti in contemporanea.\\
       \texttt{\_SC\_STREAM\_MAX}& \const{STREAM\_MAX}&
-      Il massimo numero di stream che un processo può mantenere aperti in
-      contemporanea. Questo limite previsto anche dallo standard ANSI C, che
-      specifica la macro {FOPEN\_MAX}.\\
-      \texttt{\_SC\_TZNAME\_MAX}&\const{TZNAME\_MAX}&
-      La dimensione massima di un nome di una \texttt{timezone} (vedi
-      sez.~\ref{sec:sys_date}).\\ 
+                                  Il massimo numero di stream che un processo
+                                  può mantenere aperti in contemporanea. Questo
+                                  limite previsto anche dallo standard ANSI C,
+                                  che specifica la macro {FOPEN\_MAX}.\\
+      \texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}&
+                                  La dimensione massima di un nome di una
+                                  \texttt{timezone} (vedi
+                                  sez.~\ref{sec:sys_date}).\\
       \texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}&
-      Massimo numero di gruppi supplementari che può avere un processo (vedi
-      sez.~\ref{sec:proc_access_id}).\\ 
-      \texttt{\_SC\_SSIZE\_MAX}&\const{SSIZE\_MAX}& 
-      valore massimo del tipo di dato \type{ssize\_t}.\\
-      \texttt{\_SC\_CLK\_TCK}& \const{CLK\_TCK} &
-      Il numero di \textit{clock tick} al secondo, cioè l'unità di misura del
-      \textit{process time} (vedi sez.~\ref{sec:sys_unix_time}).\\
+                                  Massimo numero di gruppi supplementari che
+                                  può avere un processo (vedi
+                                  sez.~\ref{sec:proc_access_id}).\\
+      \texttt{\_SC\_SSIZE\_MAX} & \const{SSIZE\_MAX}& 
+                                  Valore massimo del tipo di dato
+                                  \type{ssize\_t}.\\ 
+      \texttt{\_SC\_CLK\_TCK}   & \const{CLK\_TCK} &
+                                  Il numero di \textit{clock tick} al secondo,
+                                  cioè l'unità di misura del
+                                  \itindex{process~time} \textit{process
+                                    time} (vedi
+                                  sez.~\ref{sec:sys_unix_time}).\\  
       \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
-      Indica se è supportato il \textit{job control} (vedi
-      sez.~\ref{sec:sess_job_control}) in stile POSIX.\\
-      \texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
-      Indica se il sistema supporta i \textit{saved id} (vedi
-      sez.~\ref{sec:proc_access_id}).\\ 
-      \texttt{\_SC\_VERSION}& \const{\_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.\\
+                                  Indica se è supportato il \textit{job
+                                    control} (vedi
+                                  sez.~\ref{sec:sess_job_control}) in stile
+                                  POSIX.\\ 
+      \texttt{\_SC\_SAVED\_IDS} & \macro{\_POSIX\_SAVED\_IDS}&
+                                  Indica se il sistema supporta i
+                                  \textit{saved id} (vedi
+                                  sez.~\ref{sec:proc_access_id}).\\  
+      \texttt{\_SC\_VERSION}    & \const{\_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}.}
@@ -359,7 +372,7 @@ relative spiegazioni, si pu
 In generale ogni limite o caratteristica del sistema per cui è definita una
 macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può
 essere ottenuto attraverso una chiamata a \func{sysconf}. Il valore si otterrà
-specificando come valore del parametro \param{name} il nome ottenuto
+specificando come valore dell'argomento \param{name} il nome ottenuto
 aggiungendo \code{\_SC\_} ai nomi delle macro definite dai primi due, o
 sostituendolo a \code{\_POSIX\_} per le macro definite dagli gli altri due.
 
@@ -391,7 +404,7 @@ riportate in tab.~\ref{tab:sys_file_macro}.
     \const{LINK\_MAX}   &8  & numero massimo di link a un file\\
     \const{NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
     \const{PATH\_MAX}& 256  & lunghezza in byte di un
-                              \index{\textit{pathname}}\textit{pathname}.\\
+                              \itindex{pathname} \textit{pathname}.\\
     \const{PIPE\_BUF}&4096  & byte scrivibili atomicamente in una pipe
                               (vedi sez.~\ref{sec:ipc_pipes}).\\
     \const{MAX\_CANON}&255  & dimensione di una riga di terminale in modo 
@@ -422,7 +435,7 @@ le analoghe di tab.~\ref{tab:sys_posix1_general}.
     \const{\_POSIX\_LINK\_MAX}   &8  & numero massimo di link a un file.\\
     \const{\_POSIX\_NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
     \const{\_POSIX\_PATH\_MAX}& 256  & lunghezza in byte di un 
-                                  \index{\textit{pathname}}\textit{pathname}.\\
+                                  \itindex{pathname} \textit{pathname}.\\
     \const{\_POSIX\_PIPE\_BUF}& 512  & byte scrivibili atomicamente in una
     pipe.\\
     \const{\_POSIX\_MAX\_CANON}&255  & dimensione di una riga di
@@ -461,17 +474,17 @@ con la funzione \funcd{pathconf}, il cui prototipo 
     degli errori possibili relativi all'accesso a \param{path}).}
 \end{prototype}
 
-E si noti come la funzione in questo caso richieda un parametro che specifichi
+E si noti come la funzione in questo caso richieda un argomento 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,
 \funcd{fpathconf}, opera su un file descriptor invece che su un
-\index{\textit{pathname}}\textit{pathname}. Il suo prototipo è:
+\itindex{pathname} \textit{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}.
   
   \bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor
-    invece di un \index{\textit{pathname}}\textit{pathname}; pertanto gli
-    errori restituiti cambiano di conseguenza.}
+    invece di un \itindex{pathname} \textit{pathname}; pertanto gli errori
+    restituiti cambiano di conseguenza.}
 \end{prototype}
 \noindent ed il suo comportamento è identico a quello di \func{pathconf}.
 
@@ -589,8 +602,8 @@ maniera gerarchica all'interno di un albero;\footnote{si tenga presente che
   occorrerà includere anche i file \file{linux/unistd.h} e
   \file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un
 cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene
-per la risoluzione di un \index{\textit{pathname}}\textit{pathname} (da cui
-l'uso alternativo del filesystem \file{/proc}, che vedremo dopo).
+per la risoluzione di un \itindex{pathname} \textit{pathname} (da cui l'uso
+alternativo del filesystem \file{/proc}, che vedremo dopo).
 
 Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che
 arriva ad identificare un parametro specifico è passato alla funzione
@@ -633,11 +646,11 @@ forma di file alcune delle strutture interne del kernel stesso.
 
 In particolare l'albero dei valori di \func{sysctl} viene presentato in forma
 di file nella directory \file{/proc/sys}, cosicché è possibile accedervi
-specificando un \index{\textit{pathname}}\textit{pathname} e leggendo e
-scrivendo sul file corrispondente al parametro scelto.  Il kernel si occupa di
-generare al volo il contenuto ed i nomi dei file corrispondenti, e questo ha
-il grande vantaggio di rendere accessibili i vari parametri a qualunque
-comando di shell e di permettere la navigazione dell'albero dei valori.
+specificando un \itindex{pathname} \textit{pathname} e leggendo e scrivendo sul
+file corrispondente al parametro scelto.  Il kernel si occupa di generare al
+volo il contenuto ed i nomi dei file corrispondenti, e questo ha il grande
+vantaggio di rendere accessibili i vari parametri a qualunque comando di shell
+e di permettere la navigazione dell'albero dei valori.
 
 Alcune delle corrispondenze dei file presenti in \file{/proc/sys} con i valori
 di \func{sysctl} sono riportate nei commenti del codice che può essere trovato
@@ -689,7 +702,7 @@ sulla directory \param{target}.
     \textit{mount point} o di spostarlo quando \param{target} non è un
     \textit{mount point} o è \file{/}.
   \item[\errcode{EACCES}] non si ha il permesso di accesso su uno dei
-    componenti del \index{\textit{pathname}}\textit{pathname}, o si è cercato
+    componenti del \itindex{pathname} \textit{pathname}, o si è cercato
     di montare un filesystem disponibile in sola lettura senza averlo
     specificato o il device \param{source} è su un filesystem montato con
     l'opzione \const{MS\_NODEV}.
@@ -753,24 +766,27 @@ valori riportati in tab.~\ref{tab:sys_mount_flags}.
     \textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
     \hline
     \hline
-    \const{MS\_RDONLY}     &  1 & monta in sola lettura\\
-    \const{MS\_NOSUID}     &  2 & ignora i bit \acr{suid} e \acr{sgid}\\
-    \const{MS\_NODEV}      &  4 & impedisce l'accesso ai file di dispositivo\\
-    \const{MS\_NOEXEC}     &  8 & impedisce di eseguire programmi \\
-    \const{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona \\
-    \const{MS\_REMOUNT}    & 32 & rimonta il filesystem cambiando i flag\\
-    \const{MS\_MANDLOCK}   & 64 & consente il \textit{mandatory locking} (vedi
-                                  sez.~\ref{sec:file_mand_locking})\\
-    \const{S\_WRITE}      & 128 & scrive normalmente \\
-    \const{S\_APPEND}     & 256 & consente la scrittura solo in \textit{append
-                                  mode} (vedi sez.~\ref{sec:file_sharing})\\
-    \const{S\_IMMUTABLE}  & 512 & impedisce che si possano modificare i file \\
+    \const{MS\_RDONLY}     &  1 & monta in sola lettura.\\
+    \const{MS\_NOSUID}     &  2 & ignora i bit \itindex{suid~bit} \acr{suid} e
+                                  \itindex{sgid~bit} \acr{sgid}.\\ 
+    \const{MS\_NODEV}      &  4 & impedisce l'accesso ai file di dispositivo.\\
+    \const{MS\_NOEXEC}     &  8 & impedisce di eseguire programmi.\\
+    \const{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona.\\
+    \const{MS\_REMOUNT}    & 32 & rimonta il filesystem cambiando le opzioni.\\
+    \const{MS\_MANDLOCK}   & 64 & consente il \textit{mandatory locking} 
+                                  \itindex{mandatory~locking} (vedi
+                                  sez.~\ref{sec:file_mand_locking}).\\
+    \const{S\_WRITE}      & 128 & scrive normalmente.\\
+    \const{S\_APPEND}     & 256 & consente la scrittura solo in
+                                  \itindex{append~mode} \textit{append mode} 
+                                  (vedi sez.~\ref{sec:file_sharing}).\\
+    \const{S\_IMMUTABLE}  & 512 & impedisce che si possano modificare i file.\\
     \const{MS\_NOATIME}   &1024 & non aggiorna gli \textit{access time} (vedi
-                                  sez.~\ref{sec:file_file_times})\\
+                                  sez.~\ref{sec:file_file_times}).\\
     \const{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
-                                  directory\\
-    \const{MS\_BIND}      &4096 & monta il filesystem altrove\\
-    \const{MS\_MOVE}      &8192 & sposta atomicamente il punto di montaggio \\
+                                  directory.\\
+    \const{MS\_BIND}      &4096 & monta il filesystem altrove.\\
+    \const{MS\_MOVE}      &8192 & sposta atomicamente il punto di montaggio.\\
     \hline
   \end{tabular}
   \caption{Tabella dei codici dei flag di montaggio di un filesystem.}
@@ -897,12 +913,13 @@ semplice invocare direttamente il programma \cmd{mount}, per cui ne
 tralasceremo la trattazione, rimandando al manuale delle \acr{glibc}
 \cite{glibc} per la documentazione completa.
 
+% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C)
 
 \subsection{La gestione delle informazioni su utenti e gruppi}
 \label{sec:sys_user_group}
 
 Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
-(password, corripondenze fra nomi simbolici e user-id, home directory, ecc.)
+(password, corrispondenze fra nomi simbolici e user-id, home directory, ecc.)
 venivano registrate all'interno dei due file di testo \file{/etc/passwd} ed
 \file{/etc/group},\footnote{in realtà oltre a questi nelle distribuzioni più
   recenti è stato introdotto il sistema delle \textit{shadow password} che
@@ -933,11 +950,11 @@ dall'altra con il diffondersi delle reti la necessit
 informazioni degli utenti e dei gruppi per insiemi di macchine, in modo da
 mantenere coerenti i dati, ha portato anche alla necessità di poter recuperare
 e memorizzare dette informazioni su supporti diversi, introducendo il sistema
-del \textit{Name Service Switch} che tratteremo brevemente più avanti (in
-sez.~\ref{sec:sock_resolver}) dato che la maggior parte delle sua applicazioni
-sono relative alla risoluzioni di nomi di rete.
+del \itindex{Name~Service~Switch} \textit{Name Service Switch} che tratteremo
+brevemente più avanti (in sez.~\ref{sec:sock_resolver}) dato che la maggior
+parte delle sua applicazioni sono relative alla risoluzioni di nomi di rete.
 
-In questo paragrafo ci limiteremo comunque a trattere le funzioni classiche
+In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche
 per la lettura delle informazioni relative a utenti e gruppi tralasciando
 completamente quelle relative all'autenticazione. 
 %  Per questo non tratteremo
@@ -1067,15 +1084,15 @@ fig.~\ref{fig:sys_group_struct}.
 
 Le funzioni viste finora sono in grado di leggere le informazioni sia
 direttamente dal file delle password in \file{/etc/passwd} che tramite il
-sistema del \textit{Name Service Switch} e sono completamente generiche. Si
-noti però che non c'è una funzione che permetta di impostare direttamente una
-password.\footnote{in realtà questo può essere fatto ricorrendo a PAM, ma
-  questo è un altro discorso.} Dato che POSIX non prevede questa possibilità
-esiste un'altra interfaccia che lo fa, derivata da SVID le cui funzioni sono
-riportate in tab.~\ref{tab:sys_passwd_func}. Questa però funziona soltanto
-quando le informazioni sono mantenute su un apposito file di \textsl{registro}
-di utenti e gruppi, con il formato classico di \file{/etc/passwd} e
-\file{/etc/group}.
+sistema del \itindex{Name~Service~Switch} \textit{Name Service Switch} e
+sono completamente generiche. Si noti però che non c'è una funzione che
+permetta di impostare direttamente una password.\footnote{in realtà questo può
+  essere fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che
+POSIX non prevede questa possibilità esiste un'altra interfaccia che lo fa,
+derivata da SVID le cui funzioni sono riportate in
+tab.~\ref{tab:sys_passwd_func}. Questa però funziona soltanto quando le
+informazioni sono mantenute su un apposito file di \textsl{registro} di utenti
+e gruppi, con il formato classico di \file{/etc/passwd} e \file{/etc/group}.
 
 \begin{table}[htb]
   \footnotesize
@@ -1319,7 +1336,7 @@ argomenti \param{line}, \param{name} e \param{host} per costruire la voce che
 poi aggiunge chiamando \func{updwtmp}.
 
 
-\section{Limitazione ed uso delle risorse}
+\section{Il controllo dell'uso delle risorse}
 \label{sec:sys_res_limits}
 
 
@@ -1352,24 +1369,24 @@ di tipo \struct{rusage}, la cui definizione (che si trova in
 \end{figure}
 
 La definizione della struttura in fig.~\ref{fig:sys_rusage_struct} è ripresa
-da BSD 4.3,\footnote{questo non ha a nulla a che fare con il \textit{BSD
-    accounting} che si trova nelle opzioni di compilazione del kernel (e di
-  norma è disabilitato) che serve per mantenere una contabilità delle risorse
-  usate da ciascun processo in maniera molto più dettagliata.} ma attualmente
-(con i kernel della serie 2.4.x e 2.6.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.
+da BSD 4.3,\footnote{questo non ha a nulla a che fare con il cosiddetto
+  \textit{BSD accounting} (vedi sez. \ref{sec:sys_bsd_accounting}) che si trova
+  nelle opzioni di compilazione del kernel (e di norma è disabilitato) che
+  serve per mantenere una contabilità delle risorse usate da ciascun processo
+  in maniera molto più dettagliata.} ma attualmente (con i kernel della serie
+2.4.x e 2.6.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
-\textit{page fault}\index{\textit{page~fault}} (vedi
-sez.~\ref{sec:proc_mem_gen}) avvenuti senza richiedere I/O su disco (i
-cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O
-su disco (detti invece \textit{major page fault}) ed al numero di volte che il
-processo è stato completamente tolto dalla memoria per essere inserito nello
-swap.
+\itindex{page~fault} \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen})
+avvenuti senza richiedere I/O su disco (i cosiddetti \textit{minor page
+  fault}), a quelli che invece han richiesto I/O su disco (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ù strettamente
 necessario, ma aumenta la portabilità, e serve comunque quando, come nella
@@ -1405,42 +1422,137 @@ ricevuto lo stato di terminazione.
 \subsection{Limiti sulle risorse}
 \label{sec:sys_resource_limit}
 
-Come accennato nell'introduzione oltre a mantenere i dati relativi all'uso
-delle risorse da parte dei vari processi, il kernel mette anche a disposizione
-delle funzioni con cui si possono imporre dei limiti sulle risorse che essi
-possono utilizzare.  In generale ad ogni processo vengono associati due
-diversi limiti per ogni risorsa; questi sono detti il \textsl{limite corrente}
-(o \textit{current limit}) che esprime il valore massimo che attualmente il
-processo non può superare, ed il \textsl{limite massimo} (o \textit{maximum
-  limit}) che esprime il valore massimo che può assumere il \textsl{limite
-  corrente}.
+Come accennato nell'introduzione il kernel mette a disposizione delle
+funzionalità che permettono non solo di mantenere dati statistici relativi
+all'uso delle risorse, ma anche di imporre dei limiti precisi sul loro
+utilizzo da parte dei vari processi o degli utenti.
+
+Per far questo esistono una serie di risorse e ad ogni processo vengono
+associati due diversi limiti per ciascuna di esse; questi sono il
+\textsl{limite corrente} (o \textit{current limit}) che esprime un valore
+massimo che il processo non può superare ad un certo momento, ed il
+\textsl{limite massimo} (o \textit{maximum limit}) che invece esprime il
+valore massimo che può assumere il \textsl{limite corrente}. In generale il
+primo viene chiamato anche \textit{soft limit} dato che il suo valore può
+essere aumentato dal processo stesso durante l'esecuzione, ciò può però essere
+fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
+  limit}.
 
-\begin{figure}[!htb]
+\begin{table}[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}
-
-In generale il primo viene chiamato anche \textsl{limite soffice} (o
-\textit{soft limit}) dato che il suo valore può essere aumentato fino al
-valore del secondo, mentre il secondo è detto \textsl{limite duro} (o
-\textit{hard limit}), in quanto un processo normale può solo diminuirne il
-valore. Il valore di questi due limiti è mantenuto in una struttura
-\struct{rlimit}, la cui definizione è riportata in
-fig.~\ref{fig:sys_rlimit_struct}, ed i cui campi corrispondono appunto a
-limite corrente e limite massimo.
+  \begin{tabular}[c]{|l|p{12cm}|}
+    \hline
+    \textbf{Valore} & \textbf{Significato}\\
+    \hline
+    \hline
+    \const{RLIMIT\_AS}     &  La dimensione massima della memoria virtuale di
+                              un processo, il cosiddetto \textit{Address
+                                Space}, (vedi sez.~\ref{sec:proc_mem_gen}). Se
+                              il limite viene superato dall'uso di funzioni
+                              come \func{brk}, \func{mremap} o \func{mmap}
+                              esse falliranno con un errore di
+                              \errcode{ENOMEM}, mentre se il superamento viene
+                              causato dalla crescita dello \itindex{stack}
+                              stack il processo riceverà un segnale di
+                              \const{SIGSEGV}. \\  
+    \const{RLIMIT\_CORE}   &  La massima dimensione per di un file di
+                              \itindex{core~dump} \textit{core dump} (vedi
+                              sez.~\ref{sec:sig_prog_error}) creato nella
+                              terminazione di un processo; file di dimensioni 
+                              maggiori verranno troncati a questo valore,
+                              mentre con un valore si bloccherà la creazione
+                              dei \itindex{core~dump} \textit{core dump}.\\ 
+    \const{RLIMIT\_CPU}    &  Il massimo tempo di CPU (vedi
+                              sez.~\ref{sec:sys_cpu_times}) che il processo può
+                              usare. Il superamento del limite corrente
+                              comporta l'emissione di un segnale di
+                              \const{SIGXCPU} la cui azione predefinita (vedi
+                              sez.~\ref{sec:sig_classification}) è terminare
+                              il processo. Il superamento del limite massimo
+                              comporta l'emissione di un segnale di
+                              \const{SIGKILL}.\footnotemark\\
+    \const{RLIMIT\_DATA}   &  La massima dimensione del \index{segmento!dati}
+                              segmento dati di un 
+                              processo (vedi sez.~\ref{sec:proc_mem_layout}).
+                              Il tentativo di allocare più memoria di quanto
+                              indicato dal limite corrente causa il fallimento
+                              della funzione di allocazione (\func{brk} o
+                              \func{sbrk}) con un errore di \errcode{ENOMEM}.\\
+    \const{RLIMIT\_FSIZE}  &  La massima dimensione di un file che un processo
+                              può creare. Se il processo cerca di scrivere
+                              oltre questa dimensione riceverà un segnale di
+                              \const{SIGXFSZ}, che di norma termina il
+                              processo; se questo viene intercettato la
+                              system call che ha causato l'errore fallirà con
+                              un errore di \errcode{EFBIG}.\\
+    \const{RLIMIT\_LOCKS}&    È un limite presente solo nelle prime versioni
+                              del kernel 2.4 sul numero massimo di
+                              \index{file!locking} \textit{file lock} (vedi
+                              sez.~\ref{sec:file_locking}) che un
+                              processo poteva effettuare.\\ 
+    \const{RLIMIT\_MEMLOCK}&  L'ammontare massimo di memoria che può essere
+                              bloccata in RAM da un processo (vedi
+                              sez.~\ref{sec:proc_mem_lock}). Dal kernel 2.6.9
+                              questo limite comprende anche la memoria che può
+                              essere bloccata da ciascun utente nell'uso della
+                              memoria condivisa (vedi
+                              sez.~\ref{sec:ipc_sysv_shm}) che viene
+                              contabilizzata separatamente ma sulla quale
+                              viene applicato questo stesso limite.\\ 
+    \const{RLIMIT\_NOFILE} &  Il numero massimo di file che il processo può
+                              aprire. L'apertura di un ulteriore file farà
+                              fallire la funzione (\func{open}, \func{dup} o
+                              \func{pipe}) con un errore \errcode{EMFILE}.\\
+    \const{RLIMIT\_NPROC}  &  Il numero massimo di processi che possono essere
+                              creati sullo stesso user id real. Se il limite
+                              viene raggiunto \func{fork} fallirà con un
+                              \errcode{EAGAIN}.\\
+    \const{RLIMIT\_SIGPENDING}& Il numero massimo di segnali che possono
+                              essere mantenuti in coda per ciascun utente,
+                              considerando sia i segnali normali che real-time
+                              (vedi sez.~\ref{sec:sig_real_time}). Il limite è
+                              attivo solo per \func{sigqueue}, con \func{kill}
+                              si potrà sempre inviare un segnale che non sia
+                              già presente su una coda.\footnotemark\\
+    \const{RLIMIT\_STACK}  &  La massima dimensione dello \itindex{stack}
+                              stack del 
+                              processo. Se il processo esegue operazioni che
+                              estendano lo stack oltre questa dimensione
+                              riceverà un segnale di \const{SIGSEGV}.\\
+    \const{RLIMIT\_RSS}    &  L'ammontare massimo di pagine di memoria dato al
+                              \index{segmento!testo} testo del processo. Il
+                              limite è solo una indicazione per il kernel,
+                              qualora ci fosse un surplus di memoria questa
+                              verrebbe assegnata.\\ 
+% TODO integrare con la roba di madvise
+    \hline
+  \end{tabular}
+  \caption{Valori possibili dell'argomento \param{resource} delle funzioni
+    \func{getrlimit} e \func{setrlimit}.} 
+  \label{tab:sys_rlimit_values}
+\end{table}
 
-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
-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:
+\footnotetext[18]{questo è quanto avviene per i kernel dalla serie 2.2 fino ad
+  oggi (la 2.6.x); altri kernel possono avere comportamenti diversi per quanto
+  avviene quando viene superato il \textit{soft limit}; perciò per avere
+  operazioni portabili è sempre opportuno intercettare \const{SIGXCPU} e
+  terminare in maniera ordinata il processo.}
+
+\footnotetext{il limite su questa risorsa è stato introdotto con il kernel
+  2.6.8.}
+
+In generale il superamento di un limite corrente\footnote{di norma quanto
+  riportato in tab.~\ref{tab:sys_rlimit_values} fa riferimento a quanto
+  avviene al superamento del limite corrente, con l'eccezione
+  \const{RLIMIT\_CPU} in cui si ha in comportamento diverso per il superamento
+  dei due limiti.}  comporta o l'emissione di un segnale o il fallimento della
+system call che lo ha provocato;\footnote{si nuovo c'è una eccezione per
+  \const{RLIMIT\_CORE} che influenza soltanto la dimensione (o l'eventuale
+  creazione) dei file di \itindex{core~dump} \textit{core dump}.} per
+permettere di leggere e di impostare i limiti di utilizzo delle risorse da
+parte di un processo sono previste due funzioni, \funcd{getrlimit} e
+\funcd{setrlimit}, i cui prototipi sono:
 \begin{functions}
   \headdecl{sys/time.h} 
   \headdecl{sys/resource.h} 
@@ -1470,73 +1582,34 @@ Entrambe le funzioni permettono di specificare, attraverso l'argomento
 questo argomento sono elencati in tab.~\ref{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}.
+\param{rlim}, la cui definizione è riportata in
+fig.~\ref{fig:sys_rlimit_struct}, ed i cui campi corrispondono appunto a
+limite corrente e limite massimo.
 
-\begin{table}[htb]
+
+\begin{figure}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{12cm}|}
-    \hline
-    \textbf{Valore} & \textbf{Significato}\\
-    \hline
-    \hline
-    \const{RLIMIT\_CPU}    &  Il massimo tempo di CPU che il processo può
-                              usare. Il superamento del limite comporta
-                              l'emissione di un segnale di \const{SIGXCPU}.\\
-    \const{RLIMIT\_FSIZE}  &  La massima dimensione di un file che un processo
-                              può usare. Se il processo cerca di scrivere
-                              oltre questa dimensione riceverà un segnale di
-                              \const{SIGXFSZ}.\\
-    \const{RLIMIT\_DATA}   &  La massima dimensione della memoria dati di un
-                              processo. Il tentativo di allocare più memoria
-                              causa il fallimento della funzione di
-                              allocazione. \\
-    \const{RLIMIT\_STACK}  &  La massima dimensione dello stack del
-                              processo. Se il processo esegue operazioni che
-                              estendano lo stack oltre questa dimensione
-                              riceverà un segnale di \const{SIGSEGV}.\\
-    \const{RLIMIT\_CORE}   &  La massima dimensione di un file di \textit{core
-                              dump} creato da un processo. Nel caso le 
-                              dimensioni dovessero essere maggiori il file non
-                              verrebbe generato.\footnotemark\\
-    \const{RLIMIT\_RSS}    &  L'ammontare massimo di memoria fisica dato al
-                              processo. Il limite è solo una indicazione per
-                              il kernel, qualora ci fosse un surplus di
-                              memoria questa verrebbe assegnata.\\
-    \const{RLIMIT\_NPROC}  &  Il numero massimo di processi che possono essere
-                              creati sullo stesso user id. Se il limite viene
-                              raggiunto \func{fork} fallirà con un
-                              \errcode{EAGAIN}.\\
-    \const{RLIMIT\_NOFILE} &  Il numero massimo di file che il processo può
-                              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 in RAM senza
-                              paginazione\index{paginazione} (vedi
-                              sez.~\ref{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},
-                              \func{malloc} o \func{mmap} falliranno. \\
-    \hline
-  \end{tabular}
-  \caption{Valori possibili dell'argomento \param{resource} delle funzioni
-    \func{getrlimit} e \func{setrlimit}.} 
-  \label{tab:sys_rlimit_values}
-\end{table}
+  \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}
 
-\footnotetext{Impostare questo limite a zero è la maniera più semplice per
-  evitare la creazione di \file{core} file (al proposito si veda
-  sez.~\ref{sec:sig_prog_error}).}
 
 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 sez.~\ref{sec:proc_fork}) e
-mantenuti per gli altri programmi eseguiti attraverso una \func{exec} (vedi
-sez.~\ref{sec:proc_exec}).
+amministratore\footnote{per essere precisi in questo caso quello che serve è
+  la \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_RESOURCE}.}
+può innalzare un limite al di sopra del valore corrente del limite massimo ed
+usare un valore qualsiasi per entrambi i limiti. Si tenga conto infine che
+tutti i limiti vengono ereditati dal processo padre attraverso una \func{fork}
+(vedi sez.~\ref{sec:proc_fork}) e mantenuti per gli altri programmi eseguiti
+attraverso una \func{exec} (vedi sez.~\ref{sec:proc_exec}).
 
 
 \subsection{Le risorse di memoria e processore}
@@ -1544,7 +1617,7 @@ sez.~\ref{sec:proc_exec}).
 
 La gestione della memoria è già stata affrontata in dettaglio in
 sez.~\ref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il
-meccanismo della memoria virtuale\index{memoria~virtuale} attraverso la
+meccanismo della \index{memoria~virtuale} memoria virtuale attraverso la
 divisione della memoria fisica in pagine.
 
 In genere tutto ciò è del tutto trasparente al singolo processo, ma in certi
@@ -1552,7 +1625,7 @@ casi, come per l'I/O mappato in memoria (vedi sez.~\ref{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 che si sta allocando
-con il meccanismo della paginazione\index{paginazione}.
+con il meccanismo della \index{paginazione} paginazione.
 
 Di solito la dimensione delle pagine di memoria è fissata dall'architettura
 hardware, per cui il suo valore di norma veniva mantenuto in una costante che
@@ -1563,9 +1636,10 @@ scelta di dimensioni, 
 
 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 è:
+\func{sysconf}, \footnote{nel caso specifico si dovrebbe utilizzare il
+  parametro \const{\_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.
   
@@ -1577,13 +1651,15 @@ La funzione 
 standard la etichetta come obsoleta, mentre lo standard POSIX 1003.1-2001 la
 ha eliminata. In Linux è implementata come una system call nelle architetture
 in cui essa è necessaria, ed in genere restituisce il valore del simbolo
-\const{PAGE\_SIZE} del kernel, anche se le versioni delle librerie del C
-precedenti le \acr{glibc} 2.1 implementavano questa funzione restituendo
-sempre un valore statico.
+\const{PAGE\_SIZE} del kernel, che dipende dalla architettura hardware, anche
+se le versioni delle librerie del C precedenti le \acr{glibc} 2.1
+implementavano questa funzione restituendo sempre un valore statico.
+
+% TODO verificare meglio la faccenda di const{PAGE\_SIZE} 
 
-Le \acr{glibc} forniscono, come specifica estensione GNU, altre due funzioni,
-\funcd{get\_phys\_pages} e \funcd{get\_avphys\_pages} che permettono di
-ottenere informazioni riguardo la memoria; i loro prototipi sono:
+Le \textsl{glibc} forniscono, come specifica estensione GNU, altre due
+funzioni, \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} 
   
@@ -1622,12 +1698,73 @@ Il suo prototipo 
 \end{prototype}
 
 La funzione restituisce in ciascun elemento di \param{loadavg} il numero medio
-di processi attivi sulla coda dello scheduler\index{\textit{scheduler}},
-calcolato su un diverso intervalli di tempo.  Il numero di intervalli che si
-vogliono leggere è specificato da \param{nelem}, dato che nel caso di Linux il
-carico viene valutato solo su tre intervalli (corrispondenti a 1, 5 e 15
-minuti), questo è anche il massimo valore che può essere assegnato a questo
-argomento.
+di processi attivi sulla coda dello \itindex{scheduler} scheduler, calcolato
+su diversi intervalli di tempo.  Il numero di intervalli che si vogliono
+leggere è specificato da \param{nelem}, dato che nel caso di Linux il carico
+viene valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti),
+questo è anche il massimo valore che può essere assegnato a questo argomento.
+
+
+\subsection{La \textsl{contabilità} in stile BSD}
+\label{sec:sys_bsd_accounting}
+
+Una ultima modalità per monitorare l'uso delle risorse è, se si è compilato il
+kernel con il relativo supporto,\footnote{se cioè si è abilitata l'opzione di
+  compilazione \texttt{CONFIG\_BSD\_PROCESS\_ACCT}.} quella di attivare il
+cosiddetto \textit{BSD accounting}, che consente di registrare su file una
+serie di informazioni\footnote{contenute nella struttura \texttt{acct}
+  definita nel file \texttt{include/linux/acct.h} dei sorgenti del kernel.}
+riguardo alla \textsl{contabilità} delle risorse utilizzate da ogni processo
+che viene terminato.
+
+Linux consente di salvare la contabilità delle informazioni relative alle
+risorse utilizzate dai processi grazie alla funzione \funcd{acct}, il cui
+prototipo è:
+\begin{prototype}{unistd.h}{int acct(const char *filename)}
+  Abilita il \textit{BSD accounting}.
+  
+  \bodydesc{La funzione ritorna 0 in caso di successo o $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
+    \begin{errlist}
+    \item[\errcode{EACCESS}] non si hanno i permessi per accedere a
+      \param{pathname}.
+    \item[\errcode{EPERM}] Il processo non ha privilegi sufficienti ad
+      abilitare il \textit{BSD accounting}.
+    \item[\errcode{ENOSYS}] il kernel non supporta il \textit{BSD accounting}.
+    \item[\errcode{EUSER}] non sono disponibili nel kernel strutture per il
+      file o si è finita la memoria.
+    \end{errlist}
+    ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
+    \errval{ENAMETOOLONG}, \errval{ENFILE}, \errval{ENOENT}, \errval{ENOMEM},
+    \errval{ENOTDIR}, \errval{EROFS}.}
+\end{prototype}
+
+La funzione attiva il salvataggio dei dati sul file indicato dal pathname
+contenuti nella stringa puntata da \param{filename}; la funzione richiede che
+il processo abbia i privilegi di amministratore (è necessaria la
+\itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
+sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \const{NULL} per
+\param{filename} il \textit{BSD accounting} viene invece disabilitato. Un
+semplice esempio per l'uso di questa funzione è riportato nel programma
+\texttt{AcctCtrl.c} dei sorgenti allegati alla guida.
+
+Quando si attiva la contabilità, il file che si indica deve esistere; esso
+verrà aperto in sola scrittura;\footnote{si applicano al pathname indicato da
+  \param{filename} tutte le restrizioni viste in cap.~\ref{cha:file_intro}.}
+le informazioni verranno registrate in \itindex{append~mode} \textit{append}
+in coda al file tutte le volte che un processo termina. Le informazioni
+vengono salvate in formato binario, e corrispondono al contenuto della
+apposita struttura dati definita all'interno del kernel.
+
+Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
+parametro di sistema, modificabile attraverso \file{/proc/sys/kernel/acct} (o
+tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi, il
+primo indica la percentuale di spazio disco libero sopra il quale viene
+ripresa una registrazione che era stata sospesa per essere scesi sotto il
+minimo indicato dal secondo valore (sempre in percentuale di spazio disco
+libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve
+essere controllata detta percentuale.
+
 
 
 
@@ -1647,25 +1784,25 @@ gestione di data e ora.
 
 Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di
 dati per la misure dei tempi all'interno del sistema: essi sono
-rispettivamente chiamati \textit{calendar time} e \textit{process time},
-secondo le definizioni:
+rispettivamente chiamati \itindend{calendar~time} \textit{calendar time} e
+\itindex{process~time} \textit{process time}, secondo le definizioni:
 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{calendar time}] detto anche \textsl{tempo di calendario}. È il
-  numero di secondi dalla mezzanotte del primo gennaio 1970, in tempo
-  universale coordinato (o UTC), data che viene usualmente indicata con
-  00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the Epoch}. Questo tempo viene
-  anche chiamato anche GMT (Greenwich Mean Time) dato che l'UTC corrisponde
-  all'ora locale di Greenwich.  È il tempo su cui viene mantenuto l'orologio
-  del kernel, 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 \type{time\_t}.
-\item[\textit{process time}] detto talvolta \textsl{tempo di processore}.
-  Viene misurato in \textit{clock tick}. Un tempo questo corrispondeva al
-  numero di interruzioni effettuate dal timer di sistema, adesso lo standard
-  POSIX richiede che esso sia pari al valore della costante
-  \const{CLOCKS\_PER\_SEC}, che deve essere definita come 1000000, qualunque
-  sia la risoluzione reale dell'orologio di sistema e la frequenza delle
-  interruzioni del timer.\footnote{quest'ultima, come accennato in
+\item[\textit{calendar time}] \itindend{calendar~time} detto anche
+  \textsl{tempo di calendario}. È il numero di secondi dalla mezzanotte del
+  primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
+  usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
+    Epoch}. Questo tempo viene anche chiamato anche GMT (Greenwich Mean Time)
+  dato che l'UTC corrisponde all'ora locale di Greenwich.  È il tempo su cui
+  viene mantenuto l'orologio del kernel, 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 \type{time\_t}.
+\item[\textit{process time}] \itindex{process~time} detto talvolta
+  \textsl{tempo di processore}.  Viene misurato in \textit{clock tick}. Un
+  tempo questo corrispondeva al numero di interruzioni effettuate dal timer di
+  sistema, adesso lo standard POSIX richiede che esso sia pari al valore della
+  costante \const{CLOCKS\_PER\_SEC}, che deve essere definita come 1000000,
+  qualunque sia la risoluzione reale dell'orologio di sistema e la frequenza
+  delle interruzioni del timer.\footnote{quest'ultima, come accennato in
     sez.~\ref{sec:proc_hierarchy}, è invece data dalla costante \const{HZ}.}
   Il dato primitivo usato per questo tempo è \type{clock\_t}, che ha quindi
   una risoluzione del microsecondo. Il numero di tick al secondo può essere
@@ -1674,10 +1811,10 @@ secondo le definizioni:
   considerato obsoleto.
 \end{basedescript}
 
-In genere si usa il \textit{calendar time} per esprimere le date dei file e le
-informazioni analoghe che riguardano i cosiddetti \textsl{tempi di orologio},
-che vengono usati ad esempio per i demoni che compiono lavori amministrativi
-ad ore definite, come \cmd{cron}. 
+In genere si usa il \itindend{calendar~time} \textit{calendar time} per
+esprimere le date dei file e le informazioni analoghe che riguardano i
+cosiddetti \textsl{tempi di orologio}, che vengono usati ad esempio per i
+demoni che compiono lavori amministrativi ad ore definite, come \cmd{cron}.
 
 Di solito questo tempo viene convertito automaticamente dal valore in UTC al
 tempo locale, utilizzando le opportune informazioni di localizzazione
@@ -1685,11 +1822,11 @@ tempo locale, utilizzando le opportune informazioni di localizzazione
 mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
 dall'orologio hardware del calcolatore.
 
-Anche il \textit{process time} di solito si esprime in secondi, ma provvede
-una precisione ovviamente superiore al \textit{calendar time} (che è mantenuto
-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:
+Anche il \itindex{process~time} \textit{process time} di solito si esprime in
+secondi, ma fornisce una precisione ovviamente superiore al \textit{calendar
+  time} (che è mantenuto 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{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\textit{clock time}] il tempo \textsl{reale} (viene chiamato anche
   \textit{wall clock time} o \textit{elapsed time}) passato dall'avvio del
@@ -1719,13 +1856,15 @@ del comando \cmd{time}.
 \subsection{La gestione del \textit{process time}}
 \label{sec:sys_cpu_times}
 
+\itindbeg{process~time}
+
 Di norma tutte le operazioni del sistema fanno sempre riferimento al
-\textit{calendar time}, l'uso del \textit{process time} è riservato a quei
-casi in cui serve conoscere i tempi di esecuzione di un processo (ad esempio
-per valutarne l'efficienza). In tal caso infatti fare ricorso al
-\textit{calendar time} è inutile in quanto il tempo può essere trascorso mentre
-un altro processo era in esecuzione o in attesa del risultato di una
-operazione di I/O. 
+\itindend{calendar~time} \textit{calendar time}, l'uso del \textit{process
+  time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione
+di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti
+fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere
+trascorso mentre 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 è
 \funcd{clock}, che da una valutazione approssimativa del tempo di CPU
@@ -1757,10 +1896,10 @@ possono essere letti attraverso la funzione \funcd{times}, il cui prototipo 
     in caso di successo e -1 in caso di errore.}
 \end{prototype}
 
-La funzione restituisce i valori di process time del processo corrente in una
-struttura di tipo \struct{tms}, la cui definizione è riportata in
-fig.~\ref{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
+La funzione restituisce i valori di \textit{process time} del processo
+corrente in una struttura di tipo \struct{tms}, la cui definizione è riportata
+in fig.~\ref{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
 sez.~\ref{sec:sys_unix_time}.
 
@@ -1785,13 +1924,17 @@ ricevuto lo stato di terminazione, e lo stesso vale per \var{tms\_cstime}.
 Si tenga conto che l'aggiornamento di \var{tms\_cutime} e \var{tms\_cstime}
 viene eseguito solo quando una chiamata a \func{wait} o \func{waitpid} è
 ritornata. Per questo motivo se un processo figlio termina prima di ricevere
-lo stato di terminazione di tutti i suoi figli, questi processi ``nipoti'' non
-verranno considerati nel calcolo di questi tempi.
+lo stato di terminazione di tutti i suoi figli, questi processi
+``\textsl{nipoti}'' non verranno considerati nel calcolo di questi tempi.
+
+\itindend{process~time}
 
 
 \subsection{Le funzioni per il \textit{calendar time}}
 \label{sec:sys_time_base}
 
+\itindbeg{calendar~time}
+
 Come anticipato in sez.~\ref{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 elementare (in Linux è definito come \ctyp{long int},
@@ -1874,11 +2017,11 @@ 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
+Il secondo argomento 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 oggi è obsoleto ed in Linux non è mai stato
+locale. Questo argomento 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}.
@@ -1906,7 +2049,7 @@ Questa funzione permette di avere un aggiustamento graduale del tempo di
 sistema in modo che esso sia sempre crescente in maniera monotona. Il valore
 di \param{delta} esprime il valore di cui si vuole spostare l'orologio; se è
 positivo l'orologio sarà accelerato per un certo tempo in modo da guadagnare
-il tempo richiesto, altrimenti sarà rallentato. Il secondo parametro viene
+il tempo richiesto, altrimenti sarà rallentato. Il secondo argomento viene
 usato, se non nullo, per ricevere il valore dell'ultimo aggiustamento
 effettuato.
 
@@ -1955,22 +2098,22 @@ a descrivere in tab.~\ref{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]
+\begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|p{7cm}|}
+  \begin{tabular}[c]{|l|c|p{8.5cm}|}
     \hline
     \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
     \hline
     \hline
     \const{ADJ\_OFFSET}         & 0x0001 & Imposta la differenza fra il tempo
-                                           reale e l'orologio di sistema, che 
+                                           reale e l'orologio di sistema: 
                                            deve essere indicata in microsecondi
                                            nel campo \var{offset} di
                                            \struct{timex}.\\ 
     \const{ADJ\_FREQUENCY}      & 0x0002 & Imposta la differenze in frequenza
                                            fra il tempo reale e l'orologio di
-                                           sistema, che deve essere indicata
+                                           sistema: deve essere indicata
                                            in parti per milione nel campo
                                            \var{frequency} di \struct{timex}.\\
     \const{ADJ\_MAXERROR}       & 0x0004 & Imposta il valore massimo 
@@ -2038,6 +2181,7 @@ un errore; al solito se si cercher
 amministratore si otterrà un errore di \errcode{EPERM}.
 
 
+
 \subsection{La gestione delle date.}
 \label{sec:sys_date}
 
@@ -2064,23 +2208,23 @@ l'ora locale o il tempo universale, a quelle per trasformare il valore di un
 tempo in una stringa contenente data ed ora, i loro prototipi sono:
 \begin{functions}
   \headdecl{time.h}
-  \funcdecl{char *asctime(const struct tm *tm)} 
+  \funcdecl{char *\funcd{asctime}(const struct tm *tm)} 
   Produce una stringa con data e ora partendo da un valore espresso in
   \textit{broken-down time}.
 
-  \funcdecl{char *ctime(const time\_t *timep)} 
+  \funcdecl{char *\funcd{ctime}(const time\_t *timep)} 
   Produce una stringa con data e ora partendo da un valore espresso in
   in formato \type{time\_t}.
   
-  \funcdecl{struct tm *gmtime(const time\_t *timep)} 
+  \funcdecl{struct tm *\funcd{gmtime}(const time\_t *timep)} 
   Converte il \textit{calendar time} dato in formato \type{time\_t} in un
   \textit{broken-down time} espresso in UTC.
 
-  \funcdecl{struct tm *localtime(const time\_t *timep)} 
+  \funcdecl{struct tm *\funcd{localtime}(const time\_t *timep)} 
   Converte il \textit{calendar time} dato in formato \type{time\_t} in un
   \textit{broken-down time} espresso nell'ora locale.
 
-  \funcdecl{time\_t mktime(struct tm *tm)}   
+  \funcdecl{time\_t \funcd{mktime}(struct tm *tm)}   
   Converte il \textit{broken-down time} in formato \type{time\_t}.
   
   \bodydesc{Tutte le funzioni restituiscono un puntatore al risultato in caso
@@ -2111,8 +2255,8 @@ e impostano anche la variabile \var{tzname} con l'informazione della
 \textit{time zone} corrente; \func{ctime} è banalmente definita in termini di
 \func{asctime} come \code{asctime(localtime(t)}. Dato che l'uso di una stringa
 statica rende le funzioni non rientranti POSIX.1c e SUSv2 prevedono due
-sostitute rientranti, il cui nome è al solito ottenuto appendendo un
-\code{\_r}, che prendono un secondo parametro \code{char *buf}, in cui
+sostitute rientranti, il cui nome è al solito ottenuto aggiungendo un
+\code{\_r}, che prendono un secondo argomento \code{char *buf}, in cui
 l'utente deve specificare il buffer su cui la stringa deve essere copiata
 (deve essere di almeno 26 caratteri).
 
@@ -2125,7 +2269,7 @@ locale; \func{mktime} esegue la conversione inversa.
 Anche in questo caso le prime due funzioni restituiscono l'indirizzo di una
 struttura allocata staticamente, per questo sono state definite anche altre
 due versioni rientranti (con la solita estensione \code{\_r}), che prevedono
-un secondo parametro \code{struct tm *result}, fornito dal chiamante, che deve
+un secondo argomento \code{struct tm *result}, fornito dal chiamante, che deve
 preallocare la struttura su cui sarà restituita la conversione.
 
 Come mostrato in fig.~\ref{fig:sys_tm_struct} il \textit{broken-down time}
@@ -2240,6 +2384,7 @@ viene utilizzato come modificatore; alcuni\footnote{per la precisione quelli
 in tab.~\ref{tab:sys_strftime_format}. La funzione tiene conto anche della
 presenza di una localizzazione per stampare in maniera adeguata i vari nomi.
 
+\itindend{calendar~time}
 
 
 \section{La gestione degli errori}
@@ -2325,7 +2470,7 @@ valido verr
 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,
+In generale \func{strerror} viene usata passando \var{errno} come argomento,
 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.
@@ -2334,7 +2479,7 @@ La funzione utilizza una stringa statica che non deve essere modificata dal
 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
+non rientrante, per cui 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
@@ -2403,7 +2548,7 @@ errore e le costanti usate per identificare i singoli errori; il sorgente
 completo del programma è allegato nel file \file{ErrCode.c} e contiene pure la
 gestione delle opzioni e tutte le definizioni necessarie ad associare il
 valore numerico alla costante simbolica. In particolare si è riportata la
-sezione che converte la stringa passata come parametro in un intero
+sezione che converte la stringa passata come argomento in un intero
 (\texttt{\small 1--2}), controllando con i valori di ritorno di \func{strtol}
 che la conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi
 stampa, a seconda dell'opzione scelta il messaggio di errore (\texttt{\small
@@ -2446,7 +2591,7 @@ Stampa un messaggio di errore formattato.
 
 La funzione fa parte delle estensioni GNU per la gestione degli errori,
 l'argomento \param{format} prende la stessa sintassi di \func{printf}, ed i
-relativi parametri devono essere forniti allo stesso modo, mentre
+relativi argomenti devono essere forniti allo stesso modo, mentre
 \param{errnum} indica l'errore che si vuole segnalare (non viene quindi usato
 il valore corrente di \var{errno}); la funzione stampa sullo standard error il
 nome del programma, come indicato dalla variabile globale \var{program\_name},
@@ -2492,3 +2637,51 @@ che errori relativi alla stessa linea non vengano ripetuti.
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+
+% LocalWords:  filesystem like kernel saved header limits sysconf sez tab float
+% LocalWords:  FOPEN stdio MB LEN CHAR char UCHAR unsigned SCHAR MIN signed INT
+% LocalWords:  SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG
+% LocalWords:  Stevens exec CHILD STREAM stream TZNAME timezone NGROUPS SSIZE
+% LocalWords:  ssize LISTIO JOB CONTROL job control IDS VERSION YYYYMML bits bc
+% LocalWords:  dall'header posix lim nell'header glibc run unistd name errno SC
+% LocalWords:  NGROUP CLK TCK clock tick process PATH pathname BUF CANON path
+% LocalWords:  pathconf fpathconf descriptor fd uname sys struct utsname info
+% LocalWords:  EFAULT fig SOURCE NUL LENGTH DOMAIN NMLN UTSLEN system call proc
+% LocalWords:  domainname sysctl BSD nlen void oldval size oldlenp newval EPERM
+% LocalWords:  newlen ENOTDIR EINVAL ENOMEM linux l'array oldvalue paging stack
+% LocalWords:  TCP shell Documentation ostype hostname osrelease version mount
+% LocalWords:  const source filesystemtype mountflags ENODEV ENOTBLK block read
+% LocalWords:  device EBUSY only superblock point EACCES NODEV ENXIO major xC
+% LocalWords:  number EMFILE dummy ENAMETOOLONG ENOENT ELOOP virtual devfs MGC
+% LocalWords:  magic MSK RDONLY NOSUID suid sgid NOEXEC SYNCHRONOUS REMOUNT MNT
+% LocalWords:  MANDLOCK mandatory locking WRITE APPEND append IMMUTABLE NOATIME
+% LocalWords:  access NODIRATIME BIND MOVE umount flags FORCE statfs fstatfs ut
+% LocalWords:  buf ENOSYS EIO EBADF type fstab mntent home shadow username uid
+% LocalWords:  passwd PAM Pluggable Authentication Method Service Switch pwd ru
+% LocalWords:  getpwuid getpwnam NULL buflen result ERANGE getgrnam getgrgid AS
+% LocalWords:  grp group gid SVID fgetpwent putpwent getpwent setpwent endpwent
+% LocalWords:  fgetgrent putgrent getgrent setgrent endgrent accounting init HZ
+% LocalWords:  runlevel Hierarchy logout setutent endutent utmpname utmp paths
+% LocalWords:  WTMP getutent getutid getutline pututline LVL OLD DEAD EMPTY dev
+% LocalWords:  line libc XPG utmpx getutxent getutxid getutxline pututxline who
+% LocalWords:  setutxent endutxent wmtp updwtmp logwtmp wtmp host rusage utime
+% LocalWords:  minflt majflt nswap fault swap timeval wait getrusage usage SELF
+% LocalWords:  CHILDREN current limit soft RLIMIT Address brk mremap mmap dump
+% LocalWords:  SIGSEGV SIGXCPU SIGKILL sbrk FSIZE SIGXFSZ EFBIG LOCKS lock dup
+% LocalWords:  MEMLOCK NOFILE NPROC fork EAGAIN SIGPENDING sigqueue kill RSS tv
+% LocalWords:  resource getrlimit setrlimit rlimit rlim INFINITY capabilities
+% LocalWords:  capability CAP l'I Sun Sparc PAGESIZE getpagesize SVr SUSv get
+% LocalWords:  phys pages avphys NPROCESSORS CONF ONLN getloadavg stdlib double
+% LocalWords:  loadavg nelem scheduler CONFIG ACCT acct filename EACCESS EUSER
+% LocalWords:  ENFILE EROFS PACCT AcctCtrl cap calendar UTC Jan the Epoch GMT
+% LocalWords:  Greenwich Mean l'UTC timer CLOCKS SEC cron wall elapsed times tz
+% LocalWords:  tms dell' cutime cstime waitpid gettimeofday settimeofday timex
+% LocalWords:  timespec adjtime olddelta adjtimex David Mills nell' RFC NTP ntp
+% LocalWords:  nell'RFC ADJ FREQUENCY frequency MAXERROR maxerror ESTERROR PLL
+% LocalWords:  esterror TIMECONST constant SINGLESHOT MOD INS insert leap OOP
+% LocalWords:  second delete progress has occurred BAD broken tm gmtoff asctime
+% LocalWords:  ctime timep gmtime localtime mktime tzname tzset daylight format
+% LocalWords:  strftime thread EOF modifiable lvalue app errcode strerror LC at
+% LocalWords:  perror string errnum MESSAGES error message ErrCode strtol log
+% LocalWords:  program invocation argv printf print progname exit count fname
+% LocalWords:  lineno one  standardese Di