Nuova macro per i prototipi delle funzioni che usa boxedminipage.
[gapil.git] / filedir.tex
index 7627aaf2e1cda708f1e31cd6cdbffff6e36af997..00ea801fa27a88149109b387f762efa063bda381 100644 (file)
@@ -5,7 +5,7 @@ In questo capitolo tratteremo in dettaglio le modalit
 file e directory, iniziando dalle funzioni di libreria che si usano per
 copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che
 permette la manipolazione dei vari attributi di file e directory ed alla
-finefaremo una trattazione dettagliata su come è strutturato il sistema base
+fine faremo una trattazione dettagliata su come è strutturato il sistema base
 di protezioni e controllo di accesso ai file e sulle funzioni che ne
 permettono la gestione. Tutto quello che riguarda invece la manipolazione del
 contenuto dei file è lasciato ai capitoli successivi.
@@ -29,7 +29,7 @@ capitolo precedente.
 
 Una caratteristica comune a diversi sistemi operativi è quella di poter creare
 dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows) che
-permettono di fare riferiremento allo stesso file chiamandolo con nomi diversi
+permettono di fare riferimento allo stesso file chiamandolo con nomi diversi
 o accedendovi da directory diverse.
 
 Questo è possibile anche in ambiente unix, dove tali collegamenti sono
@@ -57,23 +57,23 @@ principali, come risultano dalla man page, sono le seguenti:
   Crea un nuovo collegamento diretto al file indicato da \var{oldpath}
   dandogli nome \var{newpath}.
   
-  La funzione restituisce zero in caso di successo e -1 in caso di errore. La
-  variabile \var{errno} viene settata opportunamente, i principali codici di
-  errore sono:
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 in
+    caso di errore. La variabile \var{errno} viene settata
+    opportunamente, i principali codici di errore sono:
   \begin{errlist}
-  \item \macro{EXDEV} \var{oldpath} e \var{newpath} non sono sullo
+  \item[\macro{EXDEV}] \var{oldpath} e \var{newpath} non sono sullo
     stesso filesystem.
-  \item \macro{EPERM} il filesystem che contiene \var{oldpath} e
+  \item[\macro{EPERM}] il filesystem che contiene \var{oldpath} e
     \macro{newpath} non supporta i link diretti o è una directory.
-  \item \macro{EEXIST} un file (o una directory) con quel nome esiste di
+  \item[\macro{EEXIST}] un file (o una directory) con quel nome esiste di
     già.
-  \item \macro{EMLINK} ci sono troppi link al file \var{oldpath} (il
+  \item[\macro{EMLINK}] ci sono troppi link al file \var{oldpath} (il
     numero massimo è specificato dalla variabile \macro{LINK\_MAX}, vedi
-    \secref{sec:xxx_limits}).
+    \secref{sec:sys_limits}).
   \end{errlist}
   ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOTDIR},
   \macro{EFAULT}, \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP},
-  \macro{ENOSPC}, \macro{EIO}.
+  \macro{ENOSPC}, \macro{EIO}.}
 \end{prototype}
 
 La creazione di un nuovo collegamento diretto non copia il contenuto del file,
@@ -86,7 +86,7 @@ essere cos
 Per quanto dicevamo in \secref{sec:file_filesystem} la creazione di un
 collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
 filesystem; inoltre il filesystem deve supportare i collegamenti diretti (il
-mneccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
+meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
 Windows). 
 
 La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
@@ -115,21 +115,21 @@ suo prototipo 
   dispositivo rimuove il nome, ma come per i file i processi che hanno aperto
   uno di questi oggetti possono continuare ad utilizzarlo.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso il file non viene toccato. La variabile \var{errno} viene
-  settata secondo i seguenti codici di errore:
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso il file non viene toccato. La variabile
+    \var{errno} viene settata secondo i seguenti codici di errore:
   \begin{errlist}
-  \item \macro{EISDIR} \var{pathname} si riferisce ad una directory
+  \item[\macro{EISDIR}] \var{pathname} si riferisce ad una directory
     (valore specifico ritornato da Linux che non consente l'uso di
     \var{unlink} con le directory, e non conforme allo standard POSIX, che
     prescrive invece l'uso di \macro{EPERM} in caso l'operazione non sia
     consentita o il processo non abbia privilegi sufficienti).
-  \item \macro{EROFS} \var{pathname} è su un filesystem montato in sola
+  \item[\macro{EROFS}] \var{pathname} è su un filesystem montato in sola
   lettura.
-  \item \macro{EISDIR} \var{pathname} fa riferimento a una directory.
+  \item[\macro{EISDIR}] \var{pathname} fa riferimento a una directory.
   \end{errlist}
   ed inoltre: \macro{EACCES}, \macro{EFAULT}, \macro{ENOENT}, \macro{ENOTDIR},
-  \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, \macro{EIO}.
+  \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP}, \macro{EIO}.}
 \end{prototype}
 
 Per cancellare una voce in una directory è necessario avere il permesso di
@@ -142,9 +142,9 @@ restrizioni 
 
 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
 della nome dalla directory e l'incremento/decremento del numero di riferimenti
-nell'inode deve essere una operazione atomica (cioè non interrompibile da
-altri processi), per questo entrambe queste funzioni sono realizzate tramite
-una singola system call.
+nell'inode deve essere una operazione atomica (si veda
+\secref{sec:proc_atom_oper}), per questo entrambe queste funzioni sono
+realizzate tramite una singola system call.
 
 Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
 i riferimenti ad esso sono stati cancellati, solo quando il \textit{link
@@ -176,9 +176,10 @@ directory 
   Cancella un nome dal filesystem. Usa \func{unlink} per i file e
   \func{rmdir} per le directory.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso il file non viene toccato. Per i codici di errore vedi quanto
-  riportato nelle descrizioni di \func{unlink} e \func{rmdir}.
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso il file non viene toccato. Per i codici di
+    errore vedi quanto riportato nelle descrizioni di \func{unlink} e
+    \func{rmdir}.}
 \end{prototype}
 
 Per cambiare nome ad un file o a una directory (che devono comunque essere
@@ -188,32 +189,32 @@ nello stesso filesystem) si usa invece la funzione \func{rename}\footnote{la
 \begin{prototype}{stdio.h}
   {int rename(const char *oldpath, const char *newpath)} 
   
-  Rinomina \var{oldpath} in \var{newpth}, eseguendo se necessario lo
+  Rinomina \var{oldpath} in \var{newpath}, eseguendo se necessario lo
   spostamento di un file fra directory diverse. Eventuali altri link diretti
   allo stesso file non vengono influenzati.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso il file non viene toccato. La variabile \var{errno} viene settata
-  secondo i seguenti codici di errore:
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso il file non viene toccato. La variabile
+    \var{errno} viene settata secondo i seguenti codici di errore:
   \begin{errlist} 
-  \item \macro{EISDIR} \var{newpath} è una directory mentre \var{oldpath} non
+  \item[\macro{EISDIR}] \var{newpath} è una directory mentre \var{oldpath} non
     è una directory.
-  \item \macro{EXDEV} \var{oldpath} e \var{newpath} non sono sullo stesso
+  \item[\macro{EXDEV}] \var{oldpath} e \var{newpath} non sono sullo stesso
     filesystem.
-  \item \macro{ENOTEMPTY} \var{newpath} è una directory già esistente e non
+  \item[\macro{ENOTEMPTY}] \var{newpath} è una directory già esistente e non
     vuota.
-  \item \macro{EBUSY} o \var{oldpath} o \var{newpath} sono in uso da parte di
+  \item[\macro{EBUSY}] o \var{oldpath} o \var{newpath} sono in uso da parte di
     qualche processo (come directory di lavoro o come radice) o del sistema
     (come mount point).
-  \item \macro{EINVAL} \var{newpath} contiene un prefisso di \var{oldpath} o
+  \item[\macro{EINVAL}] \var{newpath} contiene un prefisso di \var{oldpath} o
     più in generale si è cercato di creare una directory come sottodirectory
     di se stessa.
-  \item \macro{ENOTDIR} Uno dei componenti dei pathname non è una directory o
+  \item[\macro{ENOTDIR}] Uno dei componenti dei pathname non è una directory o
     \var{oldpath} è una directory e \var{newpath} esiste e non è una
     directory.
   \end{errlist} 
   ed inoltre \macro{EACCESS}, \macro{EPERM}, \macro{EMLINK}, \macro{ENOENT},
-  \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP} e \macro{ENOSPC}.
+  \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP} e \macro{ENOSPC}.}
 \end{prototype}
 
 Il comportamento della funzione è diverso a seconda che si voglia rinominare
@@ -255,7 +256,7 @@ riferimento allo stesso file.
 
 Come abbiamo visto in \secref{sec:file_link} la funzione \func{link} crea
 riferimenti agli inodes, pertanto può funzionare soltanto per file che
-risiedono sullo stesso filesysteme e solo per un filesystem di tipo unix.
+risiedono sullo stesso filesystem e solo per un filesystem di tipo unix.
 Inoltre abbiamo visto che in Linux non è consentito eseguire un link diretto
 ad una directory.
 
@@ -278,19 +279,20 @@ specificato. La funzione che permette di creare un nuovo link simbolico 
   Crea un nuovo link simbolico di nome \func{newpath} il cui contenuto è
   \func{oldpath}.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso la variabile \var{errno} restituisce i valori:
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso la variabile \var{errno} restituisce i valori:
   \begin{errlist}
-  \item \macro{EPERM} il filesystem che contiene \var{newpath} non supporta i
+  \item[\macro{EPERM}] il filesystem che contiene \var{newpath} non supporta i
     link simbolici.
-  \item \macro{ENOENT} una componente di \var{newpath} non esiste o
+  \item[\macro{ENOENT}] una componente di \var{newpath} non esiste o
     \func{oldpath} è una stringa vuota.
-  \item \macro{EEXIST} esiste già un file \var{newpath}.
-  \item \macro{EROFS} \var{newpath} è su un filesystem montato in sola lettura.
+  \item[\macro{EEXIST}] esiste già un file \var{newpath}.
+  \item[\macro{EROFS}] \var{newpath} è su un filesystem montato in sola
+    lettura.
   \end{errlist}
   ed inoltre \macro{EFAULT}, \macro{EACCES}, \macro{ENAMETOOLONG},
   \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{ENOSPC} e
-  \macro{EIO}.
+  \macro{EIO}.}
 \end{prototype}
 
 Si tenga presente che la funzione non effettua nessun controllo sull'esistenza
@@ -356,18 +358,20 @@ la funzione \func{readlink}, il cui prototipo 
   Legge il contenuto del link simbolico indicato da \var{path} nel buffer
   \var{buff} di dimensione \var{size}.
   
-  La funzione restituisce il numero di caratteri letti dentro \var{buff} o -1
-  per un errore, nel qual caso la variabile \var{errno} viene settata a:
+  \bodydesc{La funzione restituisce il numero di caratteri letti dentro
+    \var{buff} o -1 per un errore, nel qual caso la variabile
+    \var{errno} viene settata a:
   \begin{errlist}
-  \item \macro{EINVAL} \var{file} non è un link simbolico o \var{size} non è
+  \item[\macro{EINVAL}] \var{file} non è un link simbolico o \var{size} non è
     positiva. 
-  \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
+  \item[\macro{EROFS}] La directory su cui si vuole inserire il nuovo link è
     su un filesystem montato in sola lettura.
-  \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
+  \item[\macro{ENOSPC}] La directory o il filesystem in cui si vuole creare il
     link è piena e non c'è ulteriore spazio disponibile.
   \end{errlist}
   ed inoltre \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
-  \macro{EACCES}, \macro{ELOOP}, \macro{EIO}, \macro{EFAULT} e \macro{ENOMEM}.
+  \macro{EACCES}, \macro{ELOOP}, \macro{EIO}, \macro{EFAULT} e
+  \macro{ENOMEM}.}
 \end{prototype}
 
 La funzione apre il link simbolico, ne legge il contenuto, lo scrive nel
@@ -378,7 +382,7 @@ stringa con un carattere nullo e la tronca alla dimensione specificata da
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=5cm]{img/link_loop.eps}
+  \includegraphics[width=5cm]{img/link_loop}
   \caption{Esempio di loop nel filesystem creato con un link simbolico.}
   \label{fig:file_link_loop}
 \end{figure}
@@ -437,24 +441,24 @@ prototipo della prima 
   assegnandole i permessi indicati da \var{mode}. Il nome può essere indicato
   con il pathname assoluto o relativo.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso \var{errno} assumerà i valori:
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
-  \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di già. 
-  \item \macro{EACCESS} 
+  \item[\macro{EEXIST}] Un file (o una directory) con quel nome esiste di già. 
+  \item[\macro{EACCESS}] 
     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
     la nuova directory.
-  \item \macro{EMLINK} La directory in cui si vuole creare la nuova directory
+  \item[\macro{EMLINK}] La directory in cui si vuole creare la nuova directory
     contiene troppi file. Sotto Linux questo normalmente non avviene perché il
     filesystem standard consente la creazione di un numero di file maggiore di
-    quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
+    quelli che possono essere contenuti nel disco, ma potendo avere a che
     fare anche con filesystem di altri sistemi questo errore può presentarsi.
-  \item \macro{ENOSPC} Non c'è abbastanza spazio sul file system per creare
+  \item[\macro{ENOSPC}] Non c'è abbastanza spazio sul file system per creare
     la nuova directory o si è esaurita la quota disco dell'utente.
   \end{errlist}
   ed inoltre anche \macro{EPERM}, \macro{EFAULT}, \macro{ENAMETOOLONG},
   \macro{ENOENT}, \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP},
-  \macro{EROFS}.
+  \macro{EROFS}.}
 \end{prototype}
  
 La funzione crea una nuova directory vuota (che contiene solo le due voci
@@ -473,23 +477,23 @@ suo prototipo 
   deve essere vuota.  Il nome può essere indicato con il pathname assoluto o
   relativo.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso \var{errno} assumerà i valori:
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
-  \item \macro{EPERM} Il filesystem non supporta la cancellazione di
+  \item[\macro{EPERM}] Il filesystem non supporta la cancellazione di
     directory, oppure la directory che contiene \var{dirname} ha lo sticky bit
     settato e l'\textit{effective user id} del processo non corrisponde al
     proprietario della directory. 
-  \item \macro{EACCESS} Non c'è il permesso di scrittura per la directory che
+  \item[\macro{EACCESS}] Non c'è il permesso di scrittura per la directory che
     contiene la directory che si vuole cancellare, o non c'è il permesso di
     attraversare (esecuzione) una delle directory specificate in
     \var{dirname}.
-  \item \macro{EBUSY} La directory specificata è la directory di lavoro o la
+  \item[\macro{EBUSY}] La directory specificata è la directory di lavoro o la
     radice di qualche processo.
-  \item \macro{ENOTEMPTY} La directory non è vuota.
+  \item[\macro{ENOTEMPTY}] La directory non è vuota.
   \end{errlist}
   ed inoltre anche \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT},
-  \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{EROFS}.
+  \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{EROFS}.}
 \end{prototype}
 
 La modalità con cui avviene la cancellazione è analoga a quella di
@@ -546,23 +550,23 @@ apposita funzione di libreria,  \func{getcwd}, il cui prototipo 
   stringa puntata da \var{buffer}, che deve essere precedentemente
   allocata, per una dimensione massima di \var{size}.
   
-  La funzione restituisce il puntatore \var{buffer} se riesce, \macro{NULL} se
-  fallisce, in quest'ultimo caso la variabile \var{errno} è settata con i
-  seguenti codici di errore:
+  \bodydesc{La funzione restituisce il puntatore \var{buffer} se riesce,
+    \macro{NULL} se fallisce, in quest'ultimo caso la variabile
+    \var{errno} è settata con i seguenti codici di errore:
   \begin{errlist}
-  \item \macro{EINVAL} L'argomento \var{size} è zero e \var{buffer} non
+  \item[\macro{EINVAL}] L'argomento \var{size} è zero e \var{buffer} non
     è nullo.
-  \item \macro{ERANGE} L'argomento \var{size} è più piccolo della
+  \item[\macro{ERANGE}] L'argomento \var{size} è più piccolo della
     lunghezza del pathname. 
-  \item \macro{EACCESS} Manca il permesso di lettura o di ricerca su uno dei
+  \item[\macro{EACCESS}] Manca il permesso di lettura o di ricerca su uno dei
     componenti del pathname (cioè su una delle directory superiori alla
     corrente).
-  \end{errlist}
+  \end{errlist}}
 \end{prototype}
 
 Il buffer deve essere sufficientemente lungo da poter contenere il pathname
 completo più lo zero di terminazione della stringa. Qualora esso ecceda le
-dimensioni specificate con \var{size} la funzione restituiece un errore.  Si
+dimensioni specificate con \var{size} la funzione restituisce un errore.  Si
 può anche specificare un puntatore nullo come \var{buffer}\footnote{questa è
   una estensione allo standard POSIX.1, supportata da Linux}, nel qual caso la
 stringa sarà allocata automaticamente per una dimensione pari a \var{size}
@@ -574,7 +578,7 @@ Di questa funzione esiste una versione \func{char * getwd(char * buffer)}
 fatta per compatibilità all'indietro con BSD, che non consente di specificare
 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
 dimensione superiore a \macro{PATH\_MAX} (di solito 256 byte, vedi
-\secref{sec:xxx_limits}); il problema è che in Linux non esiste una dimensione
+\secref{sec:sys_limits}); il problema è che in Linux non esiste una dimensione
 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
 contenere il nome del file, e questa è la ragione principale per cui questa
 funzione è deprecata.
@@ -601,17 +605,17 @@ non solo tramite il filename, i prototipi di queste funzioni sono:
   \funcdecl{int fchdir (int fd)} Analoga alla precedente, ma
   usa un file descriptor invece del pathname.
   
-  Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
-  errore, in caso di errore \var{errno} viene settata per \func{chdir} ai
-  valori:
+  \bodydesc{Entrambe le funzioni restituiscono zero in caso di successo
+    e -1 per un errore, in caso di errore \var{errno} viene settata per
+    \func{chdir} ai valori:
   \begin{errlist}
-  \item \macro{ENOTDIR} Uno dei componenti di \var{path} non è una directory. 
-  \item \macro{EACCESS} Manca il permesso di ricerca su uno dei componenti di
+  \item[\macro{ENOTDIR}] Uno dei componenti di \var{path} non è una directory. 
+  \item[\macro{EACCESS}] Manca il permesso di ricerca su uno dei componenti di
     \func{path}.
   \end{errlist}
   ed inoltre \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT},
   \macro{ENOMEM}, \macro{ELOOP} e \macro{EIO}. Per \func{fchdir} invece gli
-  errori sono \macro{EBADF} e \macro{EACCES}.
+  errori sono \macro{EBADF} e \macro{EACCES}.}
 \end{functions}
 
 
@@ -654,10 +658,11 @@ queste funzioni sono i seguenti:
   eccetto che si usa con un file aperto, specificato tramite il suo file
   descriptor \var{filedes}.
   
-  Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
-  caso di errore \var{errno} può assumere uno dei valori: \macro{EBADF},
-  \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP}, \macro{EFAULT},
-  \macro{EACCESS}, \macro{ENOMEM}, \macro{ENAMETOOLONG}.
+  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
+    un errore, in caso di errore \var{errno} può assumere uno dei
+    valori: \macro{EBADF}, \macro{ENOENT}, \macro{ENOTDIR},
+    \macro{ELOOP}, \macro{EFAULT}, \macro{EACCESS}, \macro{ENOMEM},
+    \macro{ENAMETOOLONG}.}
 \end{functions}
 
 La struttura \var{stat} è definita nell'header \file{sys/stat.h} e in
@@ -835,22 +840,22 @@ dimensione si possono usare le due funzioni:
   eccetto che si usa con un file aperto, specificato tramite il suo file
   descriptor \var{fd}.
   
-  Le funzioni restituiscono zero in caso di successo e -1 per un errore, nel
-  qual caso \var{errno} viene settato opportunamente; per \func{ftruncate} si
-  hanno i valori:
+  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
+    un errore, nel qual caso \var{errno} viene settato opportunamente;
+    per \func{ftruncate} si hanno i valori:
   \begin{errlist}
-  \item \macro{EBADF} \var{fd}  non è un file descriptor.
-  \item \macro{EINVAL} \var{fd} è un riferimento ad un socket, non a un file
+  \item[\macro{EBADF}] \var{fd}  non è un file descriptor.
+  \item[\macro{EINVAL}] \var{fd} è un riferimento ad un socket, non a un file
     o non è aperto in scrittura.
   \end{errlist}
   per \func{truncate} si hanno:
   \begin{errlist}
-  \item \macro{EACCES} il file non ha permesso di scrittura o non si ha il
+  \item[\macro{EACCES}] il file non ha permesso di scrittura o non si ha il
     permesso di esecuzione una delle directory del pathname. 
-  \item \macro{ETXTBSY} Il file è un programma in esecuzione.
+  \item[\macro{ETXTBSY}] Il file è un programma in esecuzione.
   \end{errlist}
   ed anche \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
-  \macro{EROFS}, \macro{EIO}, \macro{EFAULT}, \macro{ELOOP}.
+  \macro{EROFS}, \macro{EIO}, \macro{EFAULT}, \macro{ELOOP}.}
 \end{functions}
 
 Se il file è più lungo della lunghezza specificata i dati in eccesso saranno
@@ -867,7 +872,8 @@ Il sistema mantiene per ciascun file tre tempi. Questi sono registrati
 nell'inode insieme agli altri attributi del file e possono essere letti
 tramite la funzione \func{stat}, che li restituisce attraverso tre campi della
 struttura \var{stat} di \figref{fig:file_stat_struct}. Il significato di detti
-tempi e dei relativi campi è riportato nello schema in \ntab:
+tempi e dei relativi campi è riportato nello schema in \ntab, dove si è anche
+riportato un esempio delle funzioni che effettuano cambiamenti su di essi.
 
 \begin{table}[htb]
   \centering
@@ -878,8 +884,10 @@ tempi e dei relativi campi 
     & \textbf{Opzione} \\
     \hline
     \hline
-    \var{st\_atime}& ultimo accesso ai dati del file &\func{read}& \cmd{-u}\\ 
-    \var{st\_mtime}& ultima modifica ai dati del file &\func{write}& default\\ 
+    \var{st\_atime}& ultimo accesso ai dati del file &\func{read}, 
+    \func{utime} & \cmd{-u}\\ 
+    \var{st\_mtime}& ultima modifica ai dati del file &\func{write}, 
+    \func{utime} & default\\ 
     \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, 
     \func{utime} & \cmd{-c} \\ 
     \hline
@@ -997,7 +1005,9 @@ quest'ultimo.
 
 Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
 creazione del file, usato in molti altri sistemi operativi, ma che in unix non
-esiste.
+esiste. Per questo motivo quando si copia un file, a meno di preservare
+esplicitamente i tempi (ad esempio con l'opzione \cmd{-p} di \cmd{cp}) esso
+avrà sempre il tempo corrente come data di ultima modifica.
 
 
 \subsection{La funzione \func{utime}}
@@ -1012,12 +1022,12 @@ Cambia i tempi di ultimo accesso e modifica dell'inode specificato da
 \var{filename} secondo i campi \var{actime} e \var{modtime} di \var{times}. Se
 questa è \macro{NULL} allora viene usato il tempo corrente.
 
-La funzione restituisce zero in caso di successo e -1 in caso di errore, nel
-qual caso \var{errno} è settata opportunamente.
+\bodydesc{La funzione restituisce zero in caso di successo e -1 in caso
+  di errore, nel qual caso \var{errno} è settata opportunamente.
 \begin{errlist}
-\item \macro{EACCESS} non si ha il permesso di scrittura sul file.
-\item \macro{ENOENT} \var{filename} non esiste.
-\end{errlist}
+\item[\macro{EACCESS}] non si ha il permesso di scrittura sul file.
+\item[\macro{ENOENT}] \var{filename} non esiste.
+\end{errlist}}
 \end{prototype}
  
 La struttura \var{utimebuf} usata da \func{utime} è definita come:
@@ -1249,19 +1259,19 @@ corrispondono dell'utente con cui si 
 Se però il file del programma\footnote{per motivi di sicurezza il kernel
   ignora i bit \acr{suid} e \acr{sgid} per gli script eseguibili} (che
 ovviamente deve essere eseguibile) ha il bit \acr{suid} settato, il kernel
-assegnerà come \textit{effective user id} al nuovo processo l'uid del
-proprietario del file al posto dell'uid del processo originario.  Avere il bit
-\acr{sgid} settato ha lo stesso effetto sull'\textit{effective group id} del
-processo.
-
-I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti
-normali di usare programmi che abbisognano di privilegi speciali; l'esempio
-classico è il comando \cmd{passwd} che ha la necessità di modificare il file
-delle password, quest'ultimo ovviamente può essere scritto solo
-dall'amministratore, ma non è necessario chiamare l'amministratore per
-cambiare la propria password. Infatti il comando \cmd{passwd} appartiene a
-root ma ha il bit suid settato per cui quando viene lanciato da un utente
-normale parte con i privilegi di root.
+assegnerà come \textit{effective user id} al nuovo processo l'\acr{uid} del
+proprietario del file al posto dell'\acr{uid} del processo originario.  Avere
+il bit \acr{sgid} settato ha lo stesso effetto sull'\textit{effective group
+  id} del processo.
+
+I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti normali
+di usare programmi che abbisognano di privilegi speciali; l'esempio classico è
+il comando \cmd{passwd} che ha la necessità di modificare il file delle
+password, quest'ultimo ovviamente può essere scritto solo dall'amministratore,
+ma non è necessario chiamare l'amministratore per cambiare la propria
+password. Infatti il comando \cmd{passwd} appartiene a root ma ha il bit
+\acr{suid} settato per cui quando viene lanciato da un utente normale parte
+con i privilegi di root.
 
 Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe
 normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di
@@ -1288,7 +1298,7 @@ Infine Linux utilizza il bit \acr{sgid} per una ulteriore estensione
 mutuata da SVR4. Il caso in cui il file abbia il bit \acr{sgid} settato ma
 non il corrispondente bit di esecuzione viene utilizzato per attivare per
 quel file il \textit{mandatory locking} (argomento che affronteremo nei
-dettagli in \secref{sec:xxx_mandatory_lock}).
+dettagli in \secref{sec:file_mand_locking}).
 
 
 \subsection{Il bit \textsl{sticky}}
@@ -1353,11 +1363,11 @@ invece prevede due diverse possibilit
 \begin{itemize}
 \item il \acr{gid} del file corrisponde all'\textit{effective group id} del
   processo.
-\item il \acr{gid} del file corrisponde al gid della directory in cui esso è
-  creato.
+\item il \acr{gid} del file corrisponde al \acr{gid} della directory in cui
+  esso è creato.
 \end{itemize}
 in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
-semantica BSD. Linux invece segue quella che viene chiamata semantica SVR4; di
+semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
 norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
 \acr{gid} del processo, se però la directory in cui viene creato il file ha il
 bit \acr{sgid} settato allora viene usata la seconda opzione.
@@ -1386,14 +1396,14 @@ la funzione \func{access}, il cui prototipo 
 \begin{prototype}{unistd.h}
 {int access(const char *pathname, int mode)}
 
-  La funzione verifica i permessi di accesso, indicati da \var{mode}, per il
-  file indicato da \var{pathname}. 
+Verifica i permessi di accesso, indicati da \var{mode}, per il file indicato
+da \var{pathname}.
   
-  La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in
-  quest'ultimo caso la variabile \var{errno} viene settata secondo i codici
-  di errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL},
+\bodydesc{La funzione ritorna 0 se l'accesso è consentito, -1 altrimenti; in
+  quest'ultimo caso la variabile \var{errno} viene settata secondo i codici di
+  errore: \macro{EACCES}, \macro{EROFS}, \macro{EFAULT}, \macro{EINVAL},
   \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOTDIR}, \macro{ELOOP},
-  \macro{EIO}.
+  \macro{EIO}.}
 \end{prototype}
 
 I valori possibili per il parametro \var{mode} sono esprimibili come
@@ -1450,16 +1460,16 @@ i loro prototipi sono:
   \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa
   il file descriptor \var{fd} per indicare il file.
   
-  Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
-  caso di errore \var{errno} può assumere i valori:
+  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
+    un errore, in caso di errore \var{errno} può assumere i valori:
   \begin{errlist}
-  \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello
+  \item[\macro{EPERM}] L'\textit{effective user id} non corrisponde a quello
     del proprietario del file o non è zero.
   \end{errlist}
   ed inoltre \macro{EROFS} e \macro{EIO}; \func{chmod} restituisce anche
   \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM},
   \macro{ENOTDIR}, \macro{EACCES}, \macro{ELOOP}; \func{fchmod} anche
-  \macro{EBADF}.
+  \macro{EBADF}.}
 \end{functions}
 
 I valori possibili per \var{mode} sono indicati in \ntab. I valori possono
@@ -1470,7 +1480,7 @@ divisibili in gruppi di tre). Ad esempio i permessi standard assegnati ai
 nuovi file (lettura e scrittura per il proprietario, sola lettura per il
 gruppo e gli altri) sono corrispondenti al valore ottale $0644$, un programma
 invece avrebbe anche il bit di esecuzione attivo, con un valore di $0755$, se
-si volesse attivare il bit suid il valore da fornire sarebbe $4755$.
+si volesse attivare il bit \acr{suid} il valore da fornire sarebbe $4755$.
 
 \begin{table}[!htb]
   \centering
@@ -1544,8 +1554,8 @@ funzione \func{umask}, il cui prototipo 
   Setta la maschera dei permessi dei bit al valore specificato da \var{mask}
   (di cui vengono presi solo i 9 bit meno significativi).
   
-  La funzione ritorna il precedente valore della maschera. È una delle poche
-  funzioni che non restituisce codici di errore.
+  \bodydesc{La funzione ritorna il precedente valore della maschera. È una
+    delle poche funzioni che non restituisce codici di errore.}
 \end{prototype}
 
 Questa maschera è una caratteristica di ogni processo e viene utilizzata per
@@ -1568,6 +1578,7 @@ login a $022$, e di norma gli utenti non hanno motivi per modificarlo. Se per
 si vuole che un processo possa creare un file che chiunque possa leggere
 allora occorrerà cambiare il valore di \func{umask}.
 
+
 \subsection{Le funzioni \func{chown}, \func{fchown} e \func{lchown}}
 \label{sec:file_chown}
 
@@ -1584,17 +1595,17 @@ sono tre e i loro prototipi sono i seguenti:
 
   Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
   specificati dalle variabili \var{owner} e \var{group}. 
-
-  Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
-  caso di errore \texttt{errno} viene settato ai valori:
+  
+  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
+    un errore, in caso di errore \texttt{errno} viene settato ai valori:
   \begin{errlist}
-  \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello
+  \item[\macro{EPERM}] L'\textit{effective user id} non corrisponde a quello
     del proprietario del file o non è zero, o utente e gruppo non sono validi
   \end{errlist}
   Oltre a questi entrambe restituiscono gli errori \macro{EROFS} e
   \macro{EIO}; \func{chown} restituisce anche \macro{EFAULT},
   \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM}, \macro{ENOTDIR},
-  \macro{EACCES}, \macro{ELOOP}; \func{fchown} anche \macro{EBADF}.
+  \macro{EACCES}, \macro{ELOOP}; \func{fchown} anche \macro{EBADF}.}
 \end{functions}
 
 In Linux soltanto l'amministratore può cambiare il proprietario di un file,