Risistemata flock, aggiunta figura sulla struttura del sistema
[gapil.git] / system.tex
index 1e5a20f878d802c0e87002f56354df4d592b8d25..c474854e8924c5c96d5244e898a14fdd93fd7bed 100644 (file)
@@ -10,7 +10,7 @@ e degli errori.
 
 
 
-\section{La lettura delle caratteristiche del sistema}
+\section{Capacità e caratteristiche del sistema}
 \label{sec:sys_characteristics}
 
 In questa sezione tratteremo le varie modalità con cui un programma può
@@ -21,11 +21,11 @@ l'architettura hardware, l'implementazione del kernel e delle librerie, le
 opzioni di configurazione.
 
 La definizione di queste caratteristiche ed il tentativo di provvedere dei
-meccanismi generali che i programmi potessero usare per ricavarle è uno degli
+meccanismi generali che i programmi possono usare per ricavarle è uno degli
 aspetti più complessi e controversi con cui le diverse standardizzazioni si
 sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari.
-Proveremo comunque a dare una descrizione dei principali metodi previsti dai
-vari standard per ricavare sia le caratteristiche specifiche del sistema, che
+Daremo comunque una descrizione dei principali metodi previsti dai vari
+standard per ricavare sia le caratteristiche specifiche del sistema, che
 quelle della gestione dei file.
 
 
@@ -35,11 +35,11 @@ quelle della gestione dei file.
 Quando si devono determinare le 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 dei \textit{saved
-  id}), altre invece possono dipendere dalle opzioni con cui si è costruito
-il sistema (ad esempio da come si è compilato il kernel), o dalla
-configurazione del medesimo; per questo motivo in generale sono necessari due
-tipi diversi di funzionalità:
+interi), o dal sistema operativo (come la presenza o meno del gruppo degli
+identificatori \textit{saved}), altre invece possono dipendere dalle opzioni
+con cui si è costruito il sistema (ad esempio da come si è compilato il
+kernel), o dalla configurazione del medesimo; per questo motivo in generale
+sono necessari due tipi diversi di funzionalità:
 \begin{itemize*}
 \item la possibilità di determinare limiti ed opzioni al momento della
   compilazione.
@@ -162,7 +162,8 @@ file, riportate in \tabref{tab:sys_file_macro}).
     \macro{STREAM\_MAX}&   8& massimo numero di stream aperti per
                               processo in contemporanea.\\
     \macro{TZNAME\_MAX}&   6& dimensione massima del nome di una
-                              \texttt{timezone} (vedi ).\\ 
+                              \texttt{timezone} (vedi
+                              \secref{sec:sys_time_base})).\\  
     \macro{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
                               processo (vedi \secref{sec:proc_access_id}).\\
     \macro{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
@@ -207,7 +208,8 @@ riportati in \tabref{tab:sys_posix1_general}.
     \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 ).\\ 
+                                         \texttt{timezone} (vedi
+                                         \secref{sec:sys_date}). \\ 
     \macro{\_POSIX\_NGROUPS\_MAX}&    0& numero di gruppi supplementari per
                                          processo (vedi 
                                          \secref{sec:proc_access_id}).\\
@@ -239,9 +241,10 @@ valori ottenuti da \func{sysconf}.
     \hline
     \macro{\_POSIX\_JOB\_CONTROL}& il sistema supporta il 
                                    \textit{job control} (vedi 
-                                   \secref{sec:sess_xxx}).\\
-    \macro{\_POSIX\_SAVED\_IDS}  & il sistema supporta i \textit{saved id} 
-                                   (vedi \secref{sec:proc_access_id}). 
+                                   \secref{sec:sess_job_control}).\\
+    \macro{\_POSIX\_SAVED\_IDS}  & il sistema supporta gli identificatori del 
+                                   gruppo \textit{saved} (vedi 
+                                   \secref{sec:proc_access_id})
                                    per il controllo di accesso dei processi\\
     \macro{\_POSIX\_VERSION}     & fornisce la versione dello standard POSIX.1
                                    supportata nel formato YYYYMML (ad esempio 
@@ -261,15 +264,15 @@ incluso automaticamente all'interno di \file{limits.h}). Di questi vale la
 pena menzionare alcune macro di uso comune, (riportate in
 \tabref{tab:sys_posix1_other}), che non indicano un valore specifico, ma
 denotano la presenza di alcune funzionalità nel sistema (come il supporto del
-\textit{job control} o dei \textit{saved id}).
+\textit{job control} o degli identificatori del gruppo \textit{saved}).
 
 Oltre allo standard POSIX.1, anche lo standard POSIX.2 definisce una serie di
 altre costanti. Siccome queste sono principalmente attinenti a limiti relativi
 alle applicazioni di sistema presenti (come quelli su alcuni parametri delle
 espressioni regolari o del comando \cmd{bc}), non li tratteremo
 esplicitamente, se ne trova una menzione completa nell'header file
-\file{bits/posix2\_lim.h}, e alcuni di loro sono descritti nella man page di
-\func{sysconf} e nel manuale delle \acr{glibc}.
+\file{bits/posix2\_lim.h}, e alcuni di loro sono descritti nella pagina di
+manuale di \func{sysconf} e nel manuale delle \acr{glibc}.
 
 
 \subsection{La funzione \func{sysconf}}
@@ -286,7 +289,7 @@ prototipo di questa funzione 
   
   \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).}
+    è disponibile e -1 in caso di errore (ma \var{errno} non viene impostata).}
 \end{prototype}
 
 La funzione prende come argomento un intero che specifica quale dei limiti si
@@ -317,7 +320,8 @@ relative spiegazioni, si pu
       contemporanea. Questo limite 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 ).\\
+      La dimensione massima di un nome di una \texttt{timezone} (vedi
+      \secref{sec:sys_date}).\\ 
       \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
       Massimo numero di gruppi supplementari che può avere un processo (vedi
       \secref{sec:proc_access_id}).\\ 
@@ -328,7 +332,7 @@ relative spiegazioni, si pu
       \textit{process time} (vedi \secref{sec:sys_unix_time}).\\
       \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
       Indica se è supportato il \textit{job control} (vedi
-      \secref{sec:sess_xxx}) in stile POSIX.\\
+      \secref{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
       \secref{sec:proc_access_id}).\\ 
@@ -384,19 +388,20 @@ riportate in \tabref{tab:sys_file_macro}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|r|p{8cm}|}
+  \begin{tabular}[c]{|l|r|l|}
     \hline
     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
     \hline
     \hline                
-    \macro{NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
-    \macro{PATH\_MAX}& 256  & lunghezza in byte di pathname.\\
-    \macro{PIPE\_BUF}& 512  & byte scrivibili atomicamente in una pipe\\
     \macro{LINK\_MAX}   &8  & numero massimo di link a un file\\
-    \macro{MAX\_CANON}&255  & spazio disponibile nella coda di input
-                              canonica del terminale\\
+    \macro{NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
+    \macro{PATH\_MAX}& 256  & lunghezza in byte di un pathname.\\
+    \macro{PIPE\_BUF}&4096  & byte scrivibili atomicamente in una pipe
+                              (vedi \secref{sec:ipc_pipes}).\\
+    \macro{MAX\_CANON}&255  & dimensione di una riga di terminale in modo 
+                              canonico (vedi \secref{sec:term_design}).\\
     \macro{MAX\_INPUT}&255  & spazio disponibile nella coda di input 
-                              del terminale\\
+                              del terminale (vedi \secref{sec:term_design}).\\
     \hline                
   \end{tabular}
   \caption{Macro per i limiti sulle caratteristiche dei file.}
@@ -412,21 +417,20 @@ analoghe di \tabref{tab:sys_posix1_general}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|r|p{8cm}|}
+  \begin{tabular}[c]{|l|r|l|}
     \hline
     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
     \hline
     \hline
-    \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
-    \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\_LINK\_MAX}   &8  & numero massimo di link a un file.\\
     \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\_PATH\_MAX}& 256  & lunghezza in byte di un pathname.\\
     \macro{\_POSIX\_PIPE\_BUF}& 512  & byte scrivibili atomicamente in una
-                                       pipe\\
+                                       pipe.\\
+    \macro{\_POSIX\_MAX\_CANON}&255  & dimensione di una riga di
+                                       terminale in modo canonico.\\
+    \macro{\_POSIX\_MAX\_INPUT}&255  & spazio disponibile nella coda di input 
+                                       del terminale.\\
 %    \macro{\_POSIX\_MQ\_OPEN\_MAX}&  8& \\
 %    \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
 %    \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
@@ -455,7 +459,7 @@ con la funzione \func{pathconf}, il cui prototipo 
   Restituisce il valore del parametro \param{name} per il file \param{path}.
   
   \bodydesc{La funzione restituisce indietro il valore del parametro
-    richiesto, o -1 in caso di errore (ed \var{errno} viene settata ad uno
+    richiesto, o -1 in caso di errore (ed \var{errno} viene impostata ad uno
     degli errori possibili relativi all'accesso a \param{path}).}
 \end{prototype}
 
@@ -484,7 +488,7 @@ suo prototipo 
   Restituisce informazioni sul sistema nella struttura \param{info}.
   
   \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
-  fallimento, nel qual caso \var{errno} viene settata a \macro{EFAULT}.}
+    fallimento, nel qual caso \var{errno} assumerà il valore \macro{EFAULT}.}
 \end{prototype}
 
 La funzione, che viene usata dal comando \cmd{uname}, restituisce le
@@ -501,7 +505,7 @@ indicano rispettivamente:
 \item il nome del domino.
 \end{itemize*}
 l'ultima informazione è stata aggiunta di recente e non è prevista dallo
-standard POSIX, essa è accessibile, come mostrato in \figref{fig:sig_stack_t},
+standard POSIX, essa è accessibile, come mostrato in \figref{fig:sys_utsname},
 solo definendo \macro{\_GNU\_SOURCE}.
 
 \begin{figure}[!htb]
@@ -531,11 +535,11 @@ In generale si tenga presente che le dimensioni delle stringe di una
 \macro{\_UTSNAME\_LENGTH} per i campi standard e
 \macro{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
 altri sistemi usano nomi diversi come \macro{SYS\_NMLN} o \macro{\_SYS\_NMLN}
-or \macro{UTSLEN} che possono avere valori diversi. Nel caso di Linux
+o \macro{UTSLEN} che possono avere valori diversi.\footnote{Nel caso di Linux
 \func{uname} corrisponde in realtà a 3 system call diverse, le prime due usano
 rispettivamente delle lunghezze delle stringhe di 9 e 65 byte; la terza usa
 anch'essa 65 byte, ma restituisce anche l'ultimo campo, \var{domainname}, con
-una lunghezza di 257 byte.
+una lunghezza di 257 byte.}
 
 
 \section{Opzioni e configurazione del sistema}
@@ -551,54 +555,55 @@ Inoltre, al di la di quelli che possono essere limiti caratteristici previsti
 da uno standard, ogni sistema può avere una sua serie di altri parametri di
 configurazione, che, non essendo mai fissi e variando da sistema a sistema,
 non sono stati inclusi nella standardizzazione della sezione precedente. Per
-questi occorre, oltre al meccanismo di settaggio, pure un meccanismo di
-lettura.
-
-Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si
-usano per il controllo di altre caratteristiche generali del sistema, come
-quelle per la gestione dei filesystem e di utenti e gruppi.
+questi occorre, oltre al meccanismo di impostazione, pure un meccanismo di
+lettura.  Affronteremo questi argomenti in questa sezione, insieme alle
+funzioni che si usano per il controllo di altre caratteristiche generali del
+sistema, come quelle per la gestione dei filesystem e di utenti e gruppi.
 
 
 \subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
 \label{sec:sys_sysctl}
 
-La funzione che permette la lettura ed il settaggio dei parametri del sistema
-è \func{sysctl}; è una funzione derivata da BSD4.4, ma l'implementazione è
-specifica di Linux; il suo prototipo è:
+La funzione che permette la lettura ed l'impostazione dei parametri del
+sistema è \func{sysctl}; è una funzione derivata da BSD4.4, ma
+l'implementazione è specifica di Linux; il suo prototipo è:
 \begin{functions}
 \headdecl{unistd.h}
-\headdecl{linux/unistd.h}
-\headdecl{linux/sysctl.h}
 \funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void
   *newval, size\_t newlen)}
 
 Legge o scrive uno dei parametri di sistema.
 
 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-  errore, nel qual caso \var{errno} viene settato ai valori:
+  errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei
-    componenti nel cammino specificato per il parametro, o non ha il permesso
-    di accesso al parametro nella modalità scelta.
+  \item[\macro{EPERM}] non si ha il permesso di accedere ad uno dei componenti
+    nel cammino specificato per il parametro, o di accedere al parametro nella
+    modalità scelta.
   \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome
     \param{name}.
-  \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
-    \param{oldval} è non nullo. 
+%  \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
+%    \param{oldval} è non nullo. 
   \item[\macro{EINVAL}] o si è specificato un valore non valido per il
-    parametro che si vuole settare o lo spazio provvisto per il ritorno di un
+    parametro che si vuole impostare o lo spazio provvisto per il ritorno di un
     valore non è delle giuste dimensioni.
   \item[\macro{ENOMEM}] talvolta viene usato più correttamente questo errore
     quando non si è specificato sufficiente spazio per ricevere il valore di un
     parametro.
   \end{errlist}
+  ed inoltre \macro{EFAULT}.
 }
 \end{functions}
 
 I parametri a cui la funzione permettere di accedere sono organizzati in
-maniera gerarchica all'interno un albero; 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 pathname (da cui l'uso alternativo del
-filesystem \file{/proc}, che vedremo dopo).
+maniera gerarchica all'interno 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
+  \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 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
@@ -611,7 +616,7 @@ complessa, per questo motivo il valori vengono passati come puntatori
 L'indirizzo a cui il valore corrente del parametro deve essere letto è
 specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da
 \param{oldlenp} (passato come puntatore per avere indietro la dimensione
-effettiva di quanto letto); il valore che si vuole settare nel sistema è
+effettiva di quanto letto); il valore che si vuole impostare nel sistema è
 passato in \param{newval} e la sua dimensione in \param{newlen}.
 
 Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il
@@ -749,8 +754,8 @@ significativi sono un \textit{magic number}\footnote{cio
   costante \macro{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
   riservata al \textit{magic number}.} mentre i 16 meno significativi sono
 usati per specificare le opzioni; essi sono usati come maschera binaria e
-vanno settati con un OR aritmetico della costante \macro{MS\_MGC\_VAL} con i
-valori riportati in \ntab.
+vanno impostati con un OR aritmetico della costante \macro{MS\_MGC\_VAL} con i
+valori riportati in \tabref{tab:sys_mount_flags}.
 
 \begin{table}[htb]
   \footnotesize
@@ -784,7 +789,7 @@ valori riportati in \ntab.
   \label{tab:sys_mount_flags}
 \end{table}
 
-Per il settaggio delle caratteristiche particolari di ciascun filesystem si
+Per l'impostazione delle caratteristiche particolari di ciascun filesystem si
 usa invece l'argomento \param{data} che serve per passare le ulteriori
 informazioni necessarie, che ovviamente variano da filesystem a filesystem.
 
@@ -792,7 +797,7 @@ La funzione \func{mount} pu
 \textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo
 alcune delle caratteristiche di funzionamento (ad esempio passare da sola
 lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei
-bit di \param{mountflags}, \macro{MS\_REMOUNT}, che se settato specifica che
+bit di \param{mountflags}, \macro{MS\_REMOUNT}, che se impostato specifica che
 deve essere effettuato il rimontaggio del filesystem (con le opzioni
 specificate dagli altri bit), anche in questo caso il valore di \param{source}
 viene ignorato.
@@ -804,7 +809,7 @@ Una volta che non si voglia pi
   Smonta il filesystem montato sulla directory \param{target}.
   
   \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
-    fallimento, nel qual caso \var{errno} viene settata a:
+    fallimento, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
   \item[\macro{EBUSY}]  \param{target} è la directory di lavoro di qualche
@@ -859,7 +864,7 @@ informazioni riguardo al filesystem su cui si trova un certo file, sono
   posto il file specificato.
   
   \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} viene settato ai valori:
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\macro{ENOSYS}] il filesystem su cui si trova il file specificato non
   supporta la funzione.
@@ -873,7 +878,7 @@ Queste funzioni permettono di ottenere una serie di informazioni generali
 riguardo al filesystem su cui si trova il file specificato; queste vengono
 restituite una struttura \param{buf} di tipo \type{statfs} definita come in
 \ref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in
-esame sono settati a zero.  I valori del campo \var{f\_type} sono definiti per
+esame sono impostati a zero.  I valori del campo \var{f\_type} sono definiti per
 i vari filesystem nei relativi file di header dei sorgenti del kernel da
 costanti del tipo \macro{XXX\_SUPER\_MAGIC}, dove \macro{XXX} in genere è il
 nome del filesystem stesso.
@@ -989,7 +994,7 @@ struct passwd {
 La struttura usata da entrambe le funzioni è allocata staticamente, per questo
 motivo viene sovrascritta ad ogni nuova invocazione, lo stesso dicasi per la
 memoria dove sono scritte le stringhe a cui i puntatori in essa contenuti
-fanno riferimento. Ovviamente questo implica che dette funzioni non posono
+fanno riferimento. Ovviamente questo implica che dette funzioni non possono
 essere rientranti, per cui ne esistono anche due versioni alternative
 (denotate dalla solita estensione \code{\_r}), i cui prototipi sono:
 \begin{functions}
@@ -1006,7 +1011,7 @@ essere rientranti, per cui ne esistono anche due versioni alternative
   Restituiscono le informazioni relative all'utente specificato.
   
   \bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
-    altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
+    altrimenti, nel qual caso \var{errno} sarà impostata opportunamente.}
 \end{functions}
 
 In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
@@ -1018,7 +1023,7 @@ campi di \param{password}. Infine all'indirizzo puntato da \param{result}
 viene restituito il puntatore ai dati ottenuti, cioè \param{buffer} nel caso
 l'utente esista, o \macro{NULL} altrimenti.  Qualora i dati non possano essere
 contenuti nei byte specificati da \param{buflen}, la funzione fallirà
-restituendo \macro{ERANGE} (e \param{result} sarà comunque settato a
+restituendo \macro{ERANGE} (e \param{result} sarà comunque impostato a
 \macro{NULL}).
 
 Del tutto analoghe alle precedenti sono le funzioni \func{getgrnam} e
@@ -1042,7 +1047,7 @@ loro prototipi sono:
   Restituiscono le informazioni relative al gruppo specificato.
   
   \bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
-    altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
+    altrimenti, nel qual caso \var{errno} sarà impostata opportunamente.}
 \end{functions}
 
 Il comportamento di tutte queste funzioni è assolutamente identico alle
@@ -1072,7 +1077,7 @@ struct group {
 Le funzioni viste finora sono in grado di leggere le informazioni sia dal file
 delle password in \file{/etc/passwd} che con qualunque altro metodo sia stato
 utilizzato per mantenere il database degli utenti. Non permettono però di
-settare direttamente le password; questo è possibile con un'altra interfaccia
+impostare direttamente le password; questo è possibile con un'altra interfaccia
 al database degli utenti, derivata da SVID, che però funziona soltanto con un
 database che sia tenuto su un file che abbia il formato classico di
 \file{/etc/passwd}.
@@ -1119,7 +1124,8 @@ capacit
 completa. Per questo motivo l'uso di queste funzioni è deprecato in favore
 dell'uso di PAM, ci limiteremo pertanto ad elencarle in
 \tabref{tab:sys_passwd_func}, rimandando chi fosse interessato alle rispettive
-man page e al manuale delle \acr{glibc} per i dettagli del loro funzionamento.
+pagine di manuale e al manuale delle \acr{glibc} per i dettagli del loro
+funzionamento.
 
 
 
@@ -1252,8 +1258,8 @@ riportati in \tabref{tab:sys_ut_type}, quando assume i valori
 \macro{RUN\_LVL}, \macro{BOOT\_TIME}, \macro{OLD\_TIME}, \macro{NEW\_TIME},
 verrà restituito la prima voce che corrisponde al tipo determinato; quando
 invece assume i valori \macro{INIT\_PROCESS}, \macro{LOGIN\_PROCESS},
-\macro{USER\_PROCESS} o \macro{DEAD\_PROCESS} verrà restiuita la prima voce
-corripondente al valore del campo \var{ut\_id} specificato in \param{ut}.
+\macro{USER\_PROCESS} o \macro{DEAD\_PROCESS} verrà restituita la prima voce
+corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}.
 
 \begin{table}[htb]
   \footnotesize
@@ -1309,7 +1315,7 @@ staticamente rende le funzioni di lettura non rientranti; per questo motivo le
 \acr{glibc} forniscono anche delle versioni rientranti: \func{getutent\_r},
 \func{getutid\_r}, \func{getutline\_r}, che invece di restituire un puntatore
 restituiscono un intero e prendono due argomenti aggiuntivi. Le funzioni si
-comportano esattamente come le analoge non rientranti, solo che restituiscono
+comportano esattamente come le analoghe non rientranti, solo che restituiscono
 il risultato all'indirizzo specificato dal primo argomento aggiuntivo (di tipo
 \code{struct utmp *buffer}) mentre il secondo (di tipo \code{struct utmp
   **result)} viene usato per restituire il puntatore allo stesso buffer.
@@ -1394,12 +1400,13 @@ 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 e
-corrispondono rispettivamente al numero di \textit{page fault}\index{page
-  fault} (vedi \secref{sec:proc_mem_gen}) avvenuti senza richiedere I/O (i
-cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O
-(detti invece \textit{major page fault}) ed al numero di volte che il processo
-è stato completamente tolto dalla memoria per essere inserito nello swap.
+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{page fault} (vedi \secref{sec:proc_mem_gen})
+avvenuti senza richiedere I/O (i cosiddetti \textit{minor page fault}), a
+quelli che invece han richiesto I/O (detti invece \textit{major page fault})
+ed al numero di volte che il processo è stato completamente tolto dalla
+memoria per essere inserito nello swap.
 
 In genere includere esplicitamente \file{<sys/time.h>} non è più necessario,
 ma aumenta la portabilità, e serve comunque quando, come nella maggior parte
@@ -1468,7 +1475,7 @@ struct rlimit {
 \end{figure}
 
 In genere il superamento di un limite comporta o l'emissione di un segnale o
-il fallimento della system call che lo ha provocato; per far leggere o settare
+il fallimento della system call che lo ha provocato; per far leggere o impostare
 i limiti di utilizzo delle risorse da parte di un processo le \acr{glibc}
 prevedono due funzioni, \func{getrlimit} e \func{setrlimit}, i cui prototipi
 sono:
@@ -1483,12 +1490,12 @@ sono:
   
   \funcdecl{int setrlimit(int resource, const struct rlimit *rlim)} 
   
-  Setta il limite per la risorsa \param{resource}.
+  Imposta il limite per la risorsa \param{resource}.
   
   \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} viene settata ai valori:
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
     \begin{errlist}
-    \item[\macro{INVAL}] I valori per \param{resource} non sono validi.
+    \item[\macro{EINVAL}] I valori per \param{resource} non sono validi.
     \item[\macro{EPERM}] Un processo senza i privilegi di amministratore ha
     cercato di innalzare i propri limiti.
     \end{errlist}
@@ -1516,7 +1523,7 @@ specificarne i valori.
                               oltre questa dimensione riceverà un segnale di
                               \macro{SIGXFSZ}.\\
     \macro{RLIMIT\_DATA}   &  La massima dimensione della memoria dati di un
-                              processo. Il tentatico di allocare più memoria
+                              processo. Il tentativo di allocare più memoria
                               causa il fallimento della funzione di
                               allocazione. \\
     \macro{RLIMIT\_STACK}  &  La massima dimensione dello stack del
@@ -1551,7 +1558,7 @@ specificarne i valori.
   \label{tab:sys_rlimit_values}
 \end{table}
 
-\footnotetext{Settare questo limite a zero è la maniera più semplice per
+\footnotetext{Impostare questo limite a zero è la maniera più semplice per
   evitare la creazione di \file{core} file.}
 
 È inoltre definita la costante \macro{RLIM\_INFINITY} che permette di
@@ -1567,12 +1574,12 @@ mantenuti attraverso una \func{exec} (vedi \secref{sec:proc_exec}).
 
 La gestione della memoria è già stata affrontata in dettaglio in
 \secref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il
-meccanismo della memoria virtuale attraverso la divisione della memoria fisica
-in pagine.
+meccanismo della memoria virtuale\index{memoria virtuale} attraverso la
+divisione della memoria fisica in pagine.
 
 In genere questo è del tutto trasparente al singolo processo, ma in certi
-casi, come per l'I/O mappato in memoria (vedi \ref{sec:file_memory_map}) che
-usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
+casi, come per l'I/O mappato in memoria (vedi \secref{sec:file_memory_map})
+che usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
 dimensioni delle pagine usate dal kernel. Lo stesso vale quando si vuole
 gestire in maniera ottimale l'interazione della memoria allocata con il
 meccanismo della paginazione.
@@ -1585,7 +1592,7 @@ dover fornire binari diversi per ogni possibile modello, 
 utilizzare una funzione. 
 
 In genere questa dimensione può essere ottenuta attraverso una chiamata a
-\func{sysconf} come \func{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
+\func{sysconf} come \code{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
 introdotta una apposita funzione, \func{getpagesize}, che restituisce la
 dimensione delle pagine di memoria; il suo prototipo è:
 \begin{prototype}{unistd.h}{int getpagesize(void)}
@@ -1626,7 +1633,7 @@ rispettivamente con i parametri \macro{\_SC\_PHYS\_PAGES} e
 corrispondenti alla RAM della macchina; la seconda invece la memoria
 effettivamente disponibile per i processi.
 
-Le \acr{glibc} supportano inoltre, come estenzioni GNU, due funzioni che
+Le \acr{glibc} supportano inoltre, come estensioni GNU, due funzioni che
 restituiscono il numero di processori della macchina (e quello dei processori
 attivi); anche queste sono informazioni comunque ottenibili attraverso
 \func{sysconf} utilizzando rispettivamente i parametri
@@ -1754,7 +1761,7 @@ La funzione restituisce il tempo in tick, quindi se si vuole il tempo in
 secondi occorre moltiplicare il risultato per la costante
 \macro{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard ANSI C,
   POSIX richiede che \macro{CLOCKS\_PER\_SEC} sia definito pari a 1000000
-  indipendetemente dalla risoluzione del timer di sistema.} In genere
+  indipendentemente dalla risoluzione del timer di sistema.} In genere
 \type{clock\_t} viene rappresentato come intero a 32 bit, il che comporta un
 valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore
 riprenderà lo stesso valore iniziale.
@@ -1805,7 +1812,7 @@ 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 teminazione di tutti i suoi figli, questi processi ``nipoti'' non
+lo stato di terminazione di tutti i suoi figli, questi processi ``nipoti'' non
 verranno considerati nel calcolo di questi tempi.
 
 
@@ -1829,10 +1836,10 @@ in nel suddetto formato; il suo prototipo 
 variabile su cui duplicare il valore di ritorno.
 
 Analoga a \func{time} è la funzione \func{stime} che serve per effettuare
-l'operazione inversa, e cioè per settare il tempo di sistema qualora questo
+l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo
 sia necessario; il suo prototipo è:
 \begin{prototype}{time.h}{int stime(time\_t *t)}
-  Setta a \param{t} il valore corrente del \textit{calendar time}.
+  Imposta a \param{t} il valore corrente del \textit{calendar time}.
   
   \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
     che può essere \macro{EFAULT} o \macro{EPERM}.}
@@ -1861,10 +1868,10 @@ sono:
   \funcdecl{int settimeofday(const struct timeval *tv, const struct timezone
     *tz)}
   
-  Setta il tempo di sistema.
+  Imposta il tempo di sistema.
   
   \bodydesc{Entrambe le funzioni restituiscono 0 in caso di successo e -1 in
-    caso di errore, nel qual caso \var{errno} può assumere il valori
+    caso di errore, nel qual caso \var{errno} può assumere i valori
     \macro{EINVAL} \macro{EFAULT} e per \func{settimeofday} anche
     \macro{EPERM}.}
 \end{functions}
@@ -1904,18 +1911,18 @@ vada a modificare l'orologio di sistema, come quelle che tratteremo in
 seguito) può essere utilizzata solo da un processo coi privilegi di
 amministratore.  Il secondo parametro di entrambe le funzioni è una struttura
 \var{timezone}, che storicamente veniva utilizzata per specificare appunto la
-\textit{timezone}, cioè l'insieme del fuso orario e delle convenzioni per
+\textit{time zone}, cioè l'insieme del fuso orario e delle convenzioni per
 l'ora legale che permettevano il passaggio dal tempo universale all'ora
 locale. Questo parametro è obsoleto e in Linux non è mai stato utilizzato e
 non è supportato né dalle vecchie \textsl{libc5}, né dalle \textsl{glibc}:
-pertanto deve essere sempre settato a \macro{NULL}.
+pertanto deve essere sempre impostato a \macro{NULL}.
 
 Modificare l'orologio di sistema con queste funzioni è comunque problematico,
 in quanto esse effettuano un cambiamento immediato. Questo può creare dei
 buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con
 conseguenze indesiderate; ad esempio se si porta avanti l'orologio si possono
 perdere delle esecuzioni di \cmd{cron} programmate nell'intervallo che si è
-saltato. Per questo motivo la modalità più corretta per settare l'ora è quella
+saltato. Per questo motivo la modalità più corretta per impostare l'ora è quella
 di usare la funzione \func{adjtime}, il cui prototipo è:
 \begin{prototype}{sys/time.h}
 {int adjtime(const struct timeval *delta, struct timeval *olddelta)} 
@@ -1932,7 +1939,7 @@ 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
 usato, se non nullo, per ricevere il valore dell'ultimo aggiustamento
-effettuto.
+effettuato.
 
 Linux poi prevede un'altra funzione, \func{adjtimex}, che consente un
 aggiustamento molto più dettagliato, permettendo ad esempio anche di
@@ -1951,7 +1958,7 @@ La funzione richiede una struttura di tipo \var{timex}, la cui definizione,
 così come effettuata in \file{sys/timex.h}, è riportata in
 \figref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore del
 campo \var{mode}, che specifica quale parametro dell'orologio di sistema,
-specificato in un opportuno campo di \var{timex}, deve essere settato. Un
+specificato in un opportuno campo di \var{timex}, deve essere impostato. Un
 valore nullo serve per leggere i parametri correnti; i valori diversi da zero
 devono essere specificati come OR binario delle costanti riportate in
 \secref{tab:sys_timex_mode}.
@@ -2006,37 +2013,37 @@ essere ritrovato in \cite{glibc}.
     \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
     \hline
     \hline
-    \macro{ADJ\_OFFSET}         & 0x0001 & Setta la differenza fra il tempo
+    \macro{ADJ\_OFFSET}         & 0x0001 & Imposta la differenza fra il tempo
                                            reale e l'orologio di sistema, che 
                                            deve essere indicata in microsecondi
                                            nel campo \var{offset} di
                                            \var{timex}.\\ 
-    \macro{ADJ\_FREQUENCY}      & 0x0002 & Setta la differenze in frequenza
+    \macro{ADJ\_FREQUENCY}      & 0x0002 & Imposta la differenze in frequenza
                                            fra il tempo reale e l'orologio di
                                            sistema, che deve essere indicata
                                            in parti per milione nel campo
                                            \var{frequency} di \var{timex}.\\
-    \macro{ADJ\_MAXERROR}       & 0x0004 & Setta il valore massimo dell'errore
+    \macro{ADJ\_MAXERROR}       & 0x0004 & Imposta il valore massimo dell'errore
                                            sul tempo, espresso in microsecondi 
                                            nel campo \var{maxerror} di
                                            \var{timex}.\\ 
-    \macro{ADJ\_ESTERROR}       & 0x0008 & Setta la stima dell'errore
+    \macro{ADJ\_ESTERROR}       & 0x0008 & Imposta la stima dell'errore
                                            sul tempo, espresso in microsecondi 
                                            nel campo \var{esterror} di
                                            \var{timex}.\\
-    \macro{ADJ\_STATUS}         & 0x0010 & Setta alcuni
+    \macro{ADJ\_STATUS}         & 0x0010 & Imposta alcuni
                                            valori di stato interni usati dal
                                            sistema nella gestione
                                            dell'orologio specificati nel campo
                                            \var{status} di \var{timex}.\\ 
-    \macro{ADJ\_TIMECONST}      & 0x0020 & Setta la larghezza di banda del PLL
+    \macro{ADJ\_TIMECONST}      & 0x0020 & Imposta la larghezza di banda del PLL
                                            implementato dal kernel,
                                            specificato nel campo
                                            \var{constant} di \var{timex}.\\ 
-    \macro{ADJ\_TICK}           & 0x4000 & Setta il valore dei tick del timer
+    \macro{ADJ\_TICK}           & 0x4000 & Imposta il valore dei tick del timer
                                            in microsecondi, espresso nel campo
                                            \var{tick} di \var{timex}.\\ 
-    \macro{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Setta uno spostamento una tantum 
+    \macro{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Imposta uno spostamento una tantum 
                                            dell'orologio secondo il valore del
                                            campo \var{offset} simulando il
                                            comportamento di \func{adjtime}.\\ 
@@ -2121,9 +2128,9 @@ definizione 
 struttura che si utilizza quando si deve specificare un tempo a partire dai
 dati naturali (ora e data), dato che essa consente anche di trattare la
 gestione del fuso orario e dell'ora legale.\footnote{in realtà i due campi
-  \var{tm\_gmtoff} e \var{tm\_zone} sono estensioni previste per da BSD e
-  dalle \acr{glibc}, che, quando è definita \macro{\_BSD\_SOURCE}, hanno la
-  forma in \figref{fig:sys_tm_struct}.}
+  \var{tm\_gmtoff} e \var{tm\_zone} sono estensioni previste da BSD e dalle
+  \acr{glibc}, che, quando è definita \macro{\_BSD\_SOURCE}, hanno la forma in
+  \figref{fig:sys_tm_struct}.}
 
 Le funzioni per la gestione del \textit{broken-down time} sono varie e vanno
 da quelle usate per convertire gli altri formati in questo, usando o meno
@@ -2152,7 +2159,7 @@ tempo in una stringa contenente data ed ora, i loro prototipi sono:
   
   \bodydesc{Tutte le funzioni restituiscono un puntatore al risultato in caso
   di successo e \macro{NULL} in caso di errore, tranne che \func{mktime} che
-  restitusce direttamente il valore o -1 in caso di errore.}
+  restituisce direttamente il valore o -1 in caso di errore.}
 \end{functions}
 
 Le prime due funzioni, \func{asctime} e \func{ctime} servono per poter
@@ -2161,7 +2168,7 @@ stringa, allocata staticamente, nella forma:
 \begin{verbatim}
 "Wed Jun 30 21:49:08 1993\n"
 \end{verbatim}
-e settano anche la variabile \var{tzname} con l'infomazione della \textit{time
+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
@@ -2185,19 +2192,19 @@ preallocare la struttura su cui sar
 Come mostrato in \figref{fig:sys_tm_struct} il \textit{broken-down time}
 permette di tenere conto anche della differenza fra tempo universale e ora
 locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre
-variabli globali mostrate in \figref{fig:sys_tzname}, cui si accede quando si
-include \file{time.h}. Queste variabili vengono settate quando si chiama una
+variabili globali mostrate in \figref{fig:sys_tzname}, cui si accede quando si
+include \file{time.h}. Queste variabili vengono impostate quando si chiama una
 delle precedenti funzioni di conversione, oppure invocando direttamente la
 funzione \func{tzset}, il cui prototipo è:
 \begin{prototype}{sys/timex.h}
 {void tzset(void)} 
   
-  Setta le variabili globali della \textit{time zone}.
+  Imposta le variabili globali della \textit{time zone}.
   
   \bodydesc{La funzione non ritorna niente e non dà errori.}
 \end{prototype}
 
-La funzione inizializza le varaibili di \figref{fig:sys_tzname} a partire dal
+La funzione inizializza le variabili di \figref{fig:sys_tzname} a partire dal
 valore della variabile di ambiente \macro{TZ}, se quest'ultima non è definita
 verrà usato il file \file{/etc/localtime}.
 
@@ -2224,6 +2231,79 @@ solare, la seconda per l'ora legale.\footnote{anche se sono indicati come
 \var{timezone} indica la differenza di fuso orario in secondi, mentre
 \var{daylight} indica se è attiva o meno l'ora legale. 
 
+Benché la funzione \func{asctime} fornisca la modalità più immediata per
+stampare un tempo o una data, la flessibilità non fa parte delle sue
+caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il
+gionrno) di un tempo si può ricorrere alla più sofisticata \func{strftime}, il
+cui prototipo è:
+\begin{prototype}{time.h}
+{size\_t strftime(char *s, size\_t max, const char *format, 
+  const struct tm *tm)}
+  
+Stampa il tempo \param{tm} nella stringa \param{s} secondo il formato
+\param{format}.
+  
+  \bodydesc{La funzione ritorna il numero di caratteri stampati in \param{s},
+  altrimenti restuisce 0.}
+\end{prototype}
+
+La funzione converte opportunamente il tempo \param{tm} in una stringa di
+testo da salvare in \param{s}, purché essa sia di dimensione, indicata da
+\param{size}, sufficiente. I caratteri generati dalla funzione vengono
+restituiti come valore di ritorno, ma non tengono conto del terminatore
+finale, che invece viene considerato nel computo della dimensione; se
+quest'ultima è eccessiva viene restituito 0 e lo stato di \param{s} è
+indefinito.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|c|l|p{6cm}|}
+    \hline
+    \textbf{Modificatore} & \textbf{Esempio} & \textbf{Significato}\\
+    \hline
+    \hline
+    \macro{\%a}&\texttt{Wed}        & Nome del giorno, abbreviato.\\ 
+    \macro{\%A}&\texttt{Wednesday}  & Nome del giorno, completo.\\ 
+    \macro{\%b}&\texttt{Apr}        & Nome del mese, abbreviato.\\ 
+    \macro{\%B}&\texttt{April}      & Nome del mese, completo.\\ 
+    \macro{\%c}&\texttt{Wed Apr 24 18:40:50 2002}& Data e ora.\\ 
+    \macro{\%d}&\texttt{24}         & Giorno del mese.\\ 
+    \macro{\%H}&\texttt{18}         & Ora del giorno, da 0 a 24.\\ 
+    \macro{\%I}&\texttt{06}         & Ora del giorno, da 0 a 12.\\ 
+    \macro{\%j}&\texttt{114}        & Giorno dell'anno.\\ 
+    \macro{\%m}&\texttt{04}         & Mese dell'anno.\\ 
+    \macro{\%M}&\texttt{40}         & Minuto.\\ 
+    \macro{\%p}&\texttt{PM}         & AM/PM.\\ 
+    \macro{\%S}&\texttt{50}         & Secondo.\\ 
+    \macro{\%U}&\texttt{16}         & Settimana dell'anno (partendo dalla
+                                      domenica).\\ 
+    \macro{\%w}&\texttt{3}          & Giorno della settimana.  \\ 
+    \macro{\%W}&\texttt{16}         & Settimana dell'anno (partendo dal
+                                      lunedì).\\ 
+    \macro{\%x}&\texttt{04/24/02}   & La data.\\ 
+    \macro{\%X}&\texttt{18:40:50}   & L'ora.\\ 
+    \macro{\%y}&\texttt{02}         & Anno nel secolo.\\ 
+    \macro{\%Y}&\texttt{2002}       & Anno.\\ 
+    \macro{\%Z}&\texttt{CEST}       & Nome della \textit{timezone}.\\ 
+    \macro{\%\%}&\texttt{\%}        & Il carattere \%.\\ 
+    \hline
+  \end{tabular}
+  \caption{Valori previsti dallo standard ANSI C per modificatore della
+    stringa di formato di \func{strftime}.}  
+  \label{tab:sys_strftime_format}
+\end{table}
+
+Il risultato della funzione è controllato dalla stringa di formato
+\param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che
+viene utilizzato come modificatore; alcuni\footnote{per la precisione quelli
+  definiti dallo standard ANSI C, che sono anche quelli riportati da POSIX.1;
+  le \acr{glibc} provvedono tutte le estensioni introdotte da POSIX.2 per il
+  comando \cmd{date}, i valori introdotti da SVID3 e ulteriori estensioni GNU;
+  l'elenco completo dei possibili valori è riportato nella pagina di manuale
+  della funzione.} dei possibili valori che esso può assumere sono ripotati in
+\tabref{tab:sys_strftime_format}. La funzione tiene conto anche della presenza
+di una localizzazione per stampare in maniera adeguata i vari nomi.
 
 
 \section{La gestione degli errori}
@@ -2268,8 +2348,8 @@ sempre riferimento a tali valori, quando descriveremo i possibili errori
 restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
 codice relativo ad un valore numerico con l'opzione \cmd{-l}.
 
-Il valore di \var{errno} viene sempre settato a zero all'avvio di un
-programma, gran parte delle funzioni di libreria settano \var{errno} ad un
+Il valore di \var{errno} viene sempre impostato a zero all'avvio di un
+programma, gran parte delle funzioni di libreria impostano \var{errno} ad un
 valore diverso da zero in caso di errore. Il valore è invece indefinito in
 caso di successo, perché anche se una funzione ha successo, può chiamarne
 altre al suo interno che falliscono, modificando così \var{errno}.
@@ -2295,8 +2375,8 @@ prima funzione che si pu
   
   \bodydesc{La funzione ritorna il puntatore alla stringa col messaggio di
     errore in caso di successo e \macro{NULL} in caso di errore, nel qual caso
-    \var{errno} sarà settata a \macro{EINVAL} se si è specificato un numero di
-    errore non valido.}
+    \var{errno} assumerà il valore \macro{EINVAL} se si è specificato un
+    numero di errore non valido.}
 \end{prototype}
 
 In generale \func{strerror} viene usata passando \var{errno} come parametro;
@@ -2311,7 +2391,7 @@ programma e che 
 \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 man page), che
+  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:
 \begin{prototype}{string.h}
@@ -2320,7 +2400,7 @@ thread 
   Analoga a \func{strerror} ma usa il buffer \param{buf} di lunghezza massima
   (compreso il terminatore) \param{size}.
   
-  \bodydesc{La funzione restitusce il puntatore alla stringa; in caso di
+  \bodydesc{La funzione restituisce il puntatore alla stringa; in caso di
     errore \var{errno} oltre a \macro{EINVAL} può assumere anche il valore
     \macro{ERANGE} per indicare che non c'è sufficiente memoria per contenere
     la stringa di descrizione.}
@@ -2406,7 +2486,7 @@ Le precedenti funzioni sono quelle definite ed usate nei vari standard; le
 forniscono alcune funzionalità aggiuntive per una gestione degli errori
 semplificata e più efficiente. 
 
-La prima estenzione consiste in due variabili, \code{char *
+La prima estensione consiste in due variabili, \code{char *
   program\_invocation\_name} e \code{char * program\_invocation\_short\_name}
 servono per ricavare il nome del programma; queste sono utili quando si deve
 aggiungere il nome del programma (cosa comune quando si ha un programma che
@@ -2468,7 +2548,9 @@ Stampa un messaggio di errore formattato.
 \noindent ed il suo comportamento è identico a quello di \func{error} se non
 per il fatto che, separati con il solito due punti-spazio, vengono inseriti un
 nome di file indicato da \param{fname} ed un numero di linea subito dopo la
-stampa del nome del programma.
+stampa del nome del programma. Inoltre essa usa un'altra variabile globale,
+\var{error\_one\_per\_line}, che impostata ad un valore diverso da zero fa si
+che errori relativi alla stessa linea non vengano ripetuti.