Sanitizzazione nome delle funzioni degli esempi, e dei relativi file e
[gapil.git] / filedir.tex
index 9c2e4859327c457bb39bdaf1a567131715f95893..fb148de7c34620adb7c708430f031b0dd3d5168a 100644 (file)
@@ -100,6 +100,7 @@ relativi campi con i dati specifici di quel filesystem, ed in particolare si
 dovrà creare anche la relativa versione della funzione \code{mount}.
 
 \itindbeg{pathname}
+\itindbeg{pathname~resolution}
 
 Come illustrato in fig.~\ref{fig:kstruct_file_system_type} questa funzione
 restituisce una \textit{dentry}, abbreviazione che sta per \textit{directory
@@ -137,7 +138,7 @@ questo punto verrà inserita nella cache.
 
 Dato che tutte le volte che si monta un filesystem la funzione \texttt{mount}
 della corrispondente \kstruct{file\_system\_type} inserisce la \textit{dentry}
-iniziale nel \itindex{mount~point} \textit{mount point} dello stesso si avrà
+iniziale nel \itindex{mount~point} \textit{mount point} dello stesso, si avrà
 comunque un punto di partenza. Inoltre essendo questa \textit{dentry} relativa
 a quel tipo di filesystem essa farà riferimento ad un \textit{inode} di quel
 filesystem, e come vedremo questo farà sì che venga eseguita una
@@ -145,6 +146,7 @@ filesystem, e come vedremo questo farà sì che venga eseguita una
 filesystem.
 
 \itindend{pathname}
+\itindend{pathname~resolution}
 
 % Un secondo effetto della chiamata funzione \texttt{mount} di
 % \kstruct{file\_system\_type} è quello di allocare una struttura
@@ -213,11 +215,11 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
     \textsl{\code{create}} & Chiamata per creare un nuovo file (vedi
                              sez.~\ref{sec:file_open}).\\ 
     \textsl{\code{link}}   & Crea un \textit{hard link} (vedi
-                             sez.~\ref{sec:file_link}).\\
+                             sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{unlink}} & Cancella un \textit{hard link} (vedi
-                             sez.~\ref{sec:file_link}).\\
-    \textsl{\code{symlink}}& Crea un link simbolico (vedi
-                             sez.~\ref{sec:file_symlink}).\\
+                             sez.~\ref{sec:link_symlink_rename}).\\
+    \textsl{\code{symlink}}& Crea un collegamento simbolico (vedi
+                             sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{mkdir}}  & Crea una directory (vedi
                              sez.~\ref{sec:file_dir_creat_rem}).\\
     \textsl{\code{rmdir}}  & Rimuove una directory (vedi
@@ -225,7 +227,7 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti.
     \textsl{\code{mknod}}  & Crea un file speciale (vedi
                              sez.~\ref{sec:file_mknod}).\\
     \textsl{\code{rename}} & Cambia il nome di un file (vedi
-                             sez.~\ref{sec:file_remove}).\\
+                             sez.~\ref{sec:link_symlink_rename}).\\
     \textsl{\code{lookup}}&  Risolve il nome di un file.\\
     \hline
   \end{tabular}
@@ -254,11 +256,11 @@ Si noti però come in tab.~\ref{tab:file_inode_operations} non sia presente la
 funzione \texttt{open} che invece è citata in
 tab.~\ref{tab:file_file_operations}.\footnote{essa può essere comunque
   invocata dato che nella struttura \kstruct{inode} è presente anche il
-  puntatore \func{i\_fop} alla struttura \kstruct{file\_operation} che
-  fornisce detta funzione.} Questo avviene perché su Linux l'apertura di un
-file richiede comunque un'altra operazione che mette in gioco l'omonimo
-oggetto del VFS: l'allocazione di una struttura di tipo \kstruct{file} che
-viene associata ad ogni file aperto nel sistema.
+  puntatore \var{i\_fop} alla struttura \kstruct{file\_operation} che fornisce
+  detta funzione.} Questo avviene perché su Linux l'apertura di un file
+richiede comunque un'altra operazione che mette in gioco l'omonimo oggetto del
+VFS: l'allocazione di una struttura di tipo \kstruct{file} che viene associata
+ad ogni file aperto nel sistema.
 
 I motivi per cui viene usata una struttura a parte sono diversi, anzitutto,
 come illustrato in sez.~\ref{sec:file_fd}, questa è necessaria per le
@@ -289,8 +291,8 @@ di dati) dovrà invece ricorrere a quelle fornite dal driver del dispositivo.
 Come si può notare dall'estratto di fig.~\ref{fig:kstruct_file}, la struttura
 \kstruct{file} contiene, oltre ad alcune informazioni usate dall'interfaccia
 dei file descriptor il cui significato emergerà più avanti, il puntatore
-\struct{f\_op} ad una struttura \kstruct{file\_operation}. Questa è l'analoga
-per i file di \kstruct{inode\_operation}, e definisce le operazioni generiche
+\var{f\_op} ad una struttura \kstruct{file\_operation}. Questa è l'analoga per
+i file di \kstruct{inode\_operation}, e definisce le operazioni generiche
 fornite dal VFS per i file. Si sono riportate in
 tab.~\ref{tab:file_file_operations} le più significative.
 
@@ -446,9 +448,10 @@ opportuno tenere sempre presente che:
     \kstruct{inode} di fig.~\ref{fig:kstruct_inode}.}  Solo quando questo
   contatore si annulla i dati del file possono essere effettivamente rimossi
   dal disco. Per questo la funzione per cancellare un file si chiama
-  \func{unlink} (vedi sez.~\ref{sec:file_link}), ed in realtà non cancella
-  affatto i dati del file, ma si limita ad eliminare la relativa voce da una
-  directory e decrementare il numero di riferimenti nell'\textit{inode}.
+  \func{unlink} (vedi sez.~\ref{sec:link_symlink_rename}), ed in realtà non
+  cancella affatto i dati del file, ma si limita ad eliminare la relativa voce
+  da una directory e decrementare il numero di riferimenti
+  nell'\textit{inode}.
   
 \item All'interno di ogni filesystem ogni \textit{inode} è identificato da un
   numero univoco. Il numero di \textit{inode} associato ad una voce in una
@@ -456,15 +459,16 @@ opportuno tenere sempre presente che:
   che contiene riferimenti ad \textit{inode} relativi ad altri filesystem.
   Questa è la ragione che limita l'uso del comando \cmd{ln}, che crea una
   nuova voce per un file esistente con la funzione \func{link} (vedi
-  sez.~\ref{sec:file_link}) a file nel filesystem corrente.
+  sez.~\ref{sec:link_symlink_rename}), a operare su file nel filesystem
+  corrente.
   
 \item Quando si cambia nome ad un file senza cambiare filesystem il contenuto
   del file non viene spostato fisicamente, viene semplicemente creata una
   nuova voce per l'\textit{inode} in questione e rimossa la precedente, questa
   è la modalità in cui opera normalmente il comando \cmd{mv} attraverso la
-  funzione \func{rename} (vedi sez.~\ref{sec:file_remove}). Questa operazione
-  non modifica minimamente neanche l'\textit{inode} del file, dato che non si
-  opera sul file ma sulla directory che lo contiene.
+  funzione \func{rename} (vedi sez.~\ref{sec:link_symlink_rename}). Questa
+  operazione non modifica minimamente neanche l'\textit{inode} del file, dato
+  che non si opera sul file ma sulla directory che lo contiene.
 
 \item Gli \textit{inode} dei file, che contengono i \textsl{metadati}, ed i
   blocchi di spazio disco, che contengono i dati, sono risorse indipendenti ed
@@ -514,13 +518,13 @@ nativo di diversi filesystem che sono in uso da anni, quello che gli avvicina
 di più è la famiglia di filesystem evolutasi a partire dal \textit{second
   extended filesystem}, o \acr{ext2}. Il filesystem \acr{ext2} ha subito un
 grande sviluppo e diverse evoluzioni, fra cui l'aggiunta del
-\textit{journaling} con \acr{ext3}, probabilmente ancora il filesystem più
-diffuso, ed una serie di ulteriori miglioramento con il successivo \acr{ext4},
-che sta iniziando a sostituirlo gradualmente. In futuro è previsto che questo
-debba essere sostituito da un filesystem completamente diverso, \acr{btrfs},
-che dovrebbe diventare il filesystem standard di Linux, ma questo al momento è
-ancora in fase di sviluppo.\footnote{si fa riferimento al momento dell'ultima
-  revisione di di questo paragrafo, l'inizio del 2012.}
+\textit{journaling} con il passaggio ad \acr{ext3}, che probabilmente è ancora
+il filesystem più diffuso, ed una serie di ulteriori miglioramenti con il
+successivo \acr{ext4}, che sta iniziando a sostituirlo gradualmente. In futuro
+è previsto che questo debba essere sostituito da un filesystem completamente
+diverso, \acr{btrfs}, che dovrebbe diventare il filesystem standard di Linux,
+ma questo al momento è ancora in fase di sviluppo.\footnote{si fa riferimento
+  al momento dell'ultima revisione di di questo paragrafo, l'inizio del 2012.}
 
 Il filesystem \acr{ext2} nasce come filesystem nativo per Linux a partire
 dalle prime versioni del kernel e supporta tutte le caratteristiche di un
@@ -549,8 +553,8 @@ le seguenti:
 \item l'amministratore può scegliere la dimensione dei blocchi del filesystem
   in fase di creazione, a seconda delle sue esigenze: blocchi più grandi
   permettono un accesso più veloce, ma sprecano più spazio disco.
-\item il filesystem implementa link simbolici veloci, in cui il nome del file
-  non è salvato su un blocco, ma tenuto all'interno \itindex{inode}
+\item il filesystem implementa collegamenti simbolici veloci, in cui il nome
+  del file non è salvato su un blocco, ma tenuto all'interno \itindex{inode}
   dell'\textit{inode} (evitando letture multiple e spreco di spazio), non
   tutti i nomi però possono essere gestiti così per limiti di spazio (il
   limite è 60 caratteri).
@@ -608,20 +612,22 @@ indicizzazione tramite hash al posto delle \textit{linked list} che abbiamo
 illustrato, ottenendo un forte guadagno di prestazioni in caso di directory
 contenenti un gran numero di file.
 
-% TODO portare a ext3, ext4 e btrfs ed illustrare le problematiche che si
-% possono incontrare (in particolare quelle relative alla perdita di contenuti
-% in caso di crash del sistema)
+% TODO (bassa priorità) portare a ext3, ext4 e btrfs ed illustrare le
+% problematiche che si possono incontrare (in particolare quelle relative alla
+% perdita di contenuti in caso di crash del sistema)
+% TODO (media priorità) trattare btrfs quando sarà usato come stabile
 
 
 \subsection{La gestione dell'uso dei filesystem}
-\label{sec:sys_file_config}
+\label{sec:filesystem_mounting}
 
 Come accennato in sez.~\ref{sec:file_arch_overview} per poter accedere ai file
-occorre prima rendere disponibile al sistema il filesystem su cui essi sono
-memorizzati; l'operazione di attivazione del filesystem è chiamata
-\textsl{montaggio}, per far questo in Linux si usa la funzione \funcd{mount},
-il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che
-  usa la omonima \textit{system call} e non è portabile.}
+occorre rendere disponibile al sistema il filesystem su cui essi sono
+memorizzati. L'operazione di attivazione del filesystem è chiamata
+\textsl{montaggio} e per far questo in Linux si usa la funzione di sistema
+\funcd{mount}, il cui prototipo è:\footnote{la funzione è una versione
+  specifica di Linux che usa la omonima \textit{system call} e non è
+  portabile.}
 
 \begin{funcproto}{ 
 \fhead{sys/mount.h} 
@@ -635,10 +641,10 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che
   caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EACCES}] non si ha il permesso di accesso su uno dei
-    componenti del \itindex{pathname} \textit{pathname}, o si è cercato di
-    montare un filesystem disponibile in sola lettura senza aver specificato
-    \const{MS\_RDONLY} o il device \param{source} è su un filesystem montato
-    con l'opzione \const{MS\_NODEV}.
+    componenti del \textit{pathname}, o si è cercato di montare un filesystem
+    disponibile in sola lettura senza aver specificato \const{MS\_RDONLY} o il
+    device \param{source} è su un filesystem montato con l'opzione
+    \const{MS\_NODEV}.
   \item[\errcode{EBUSY}] \param{source} è già montato, o non può essere
     rimontato in sola lettura perché ci sono ancora file aperti in scrittura,
     o non può essere montato su \param{target} perché la directory è ancora in
@@ -651,7 +657,7 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che
     \textit{mount point} o è la radice.
   \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point}
     \textit{mount point} su una sottodirectory di \param{source} o si sono
-    incontrati troppi link simolici nella risoluzione di un nome.
+    incontrati troppi collegamenti simbolici nella risoluzione di un nome.
   \item[\errcode{EMFILE}] in caso di filesystem virtuale, la tabella dei
     dispositivi fittizi (chiamati \textit{dummy} nella documentazione inglese)
     è piena.
@@ -672,8 +678,7 @@ La funzione monta sulla directory indicata da \param{target}, detta
 di dispositivo indicato da \param{source}. In entrambi i casi, come daremo per
 assunto da qui in avanti tutte le volte che si parla di directory o file nel
 passaggio di un argomento di una funzione, si intende che questi devono essere
-indicati con la stringa contenente il loro \itindex{pathname}
-\textit{pathname}.
+indicati con la stringa contenente il loro \textit{pathname}.
 
 Normalmente un filesystem è contenuto su un disco o una partizione, ma come
 illustrato in sez.~\ref{sec:file_vfs_work} la struttura del
@@ -707,7 +712,7 @@ Dopo l'esecuzione della funzione il contenuto del filesystem viene resto
 disponibile nella directory specificata come \itindex{mount~point}
 \textit{mount point}, il precedente contenuto di detta directory viene
 mascherato dal contenuto della directory radice del filesystem montato. Fino
-ai kernel della serie 2.2.x non era possibile montare un filesytem se un
+ai kernel della serie 2.2.x non era possibile montare un filesystem se un
 \textit{mount point} era già in uso. 
 
 A partire dal kernel 2.4.x inoltre è divenuto possibile sia spostare
@@ -723,8 +728,8 @@ forma della lista di parole chiave indicata con l'argomento \param{data},
 esistono pure alcune opzioni che si possono applicare in generale, anche se
 non è detto che tutti i filesystem le supportino, che si specificano tramite
 l'argomento \param{mountflags}.  L'argomento inoltre può essere utilizzato per
-modificare il comportamento della funzione, facendole compiere una operazione
-diversa (ad esempio un rimontaggio, invece che un montaggio).
+modificare il comportamento della funzione \func{mount}, facendole compiere
+una operazione diversa (ad esempio un rimontaggio, invece che un montaggio).
 
 In Linux \param{mountflags} deve essere un intero a 32 bit; fino ai kernel
 della serie 2.2.x i 16 più significativi avevano un valore riservato che
@@ -746,14 +751,14 @@ identificati dalle costanti riportate nell'elenco seguente:
   possibile montare una directory di un filesystem in un'altra directory,
   l'opzione è disponibile a partire dai kernel della serie 2.4. In questo caso
   verranno presi in considerazione solo gli argomenti \param{source}, che
-  stavolta indicherà la directory che si vuole montare (e non un file di
-  dispositivo) e \param{target} che indicherà la directory su cui verrà
+  stavolta indicherà la directory che si vuole montare e non un file di
+  dispositivo, e \param{target} che indicherà la directory su cui verrà
   effettuato il \textit{bind mount}. Gli argomenti \param{filesystemtype}
   e \param{data} vengono ignorati.
 
-  In sostanza quello che avviene è che in corrispondenza del \index{pathname}
-  \textit{pathname} indicato da \param{target} viene montato l'\textit{inode}
-  di \param{source}, così che la porzione di albero dei file presente sotto
+  In sostanza quello che avviene è che in corrispondenza del \textit{pathname}
+  indicato da \param{target} viene montato l'\textit{inode} di \param{source},
+  così che la porzione di albero dei file presente sotto
   \param{source} diventi visibile allo stesso modo sotto
   \param{target}. Trattandosi esattamente dei dati dello stesso filesystem,
   ogni modifica fatta in uno qualunque dei due rami di albero sarà visibile
@@ -762,7 +767,7 @@ identificati dalle costanti riportate nell'elenco seguente:
 
   Dal punto di vista del \itindex{Virtual~File~System} VFS l'operazione è
   analoga al montaggio di un filesystem proprio nel fatto che anche in questo
-  caso si inserisce in corripondenza della \textit{dentry} di \texttt{target}
+  caso si inserisce in corrispondenza della \textit{dentry} di \texttt{target}
   un diverso \textit{inode}, che stavolta, invece di essere quello della
   radice del filesystem indicato da un file di dispositivo, è quello di una
   directory già montata.
@@ -785,28 +790,27 @@ identificati dalle costanti riportate nell'elenco seguente:
   Fino al kernel 2.6.26 questo flag doveva essere usato da solo, in quanto il
   \textit{bind mount} continuava ad utilizzare le stesse opzioni del montaggio
   originale, dal 2.6.26 è stato introdotto il supporto per il cosiddetto
-  \textit{read-only bind mount} e viene onorata la presenza del flag
-  \const{MS\_RDONLY}. In questo modo si ottiene che l'accesso ai file sotto
-  \param{target} sia effettuabile esclusivamente in sola lettura.
+  \textit{read-only bind mount} e viene onorata la presenza aggiuntiva del
+  flag \const{MS\_RDONLY}. In questo modo si ottiene che l'accesso ai file
+  sotto \param{target} sia effettuabile esclusivamente in sola lettura.
 
   Il supporto per il \textit{bind mount} consente di superare i limiti
   presenti per gli \textit{hard link} (di cui parleremo in
-  sez.~\ref{sec:file_link}) ottenendo un qualcosa di analogo in cui si può
-  fare riferimento alla porzione dell'albero dei file di un filesystem
-  presente a partire da una certa directory utilizzando una qualunque altra
-  directory, anche se questa sta su un filesystem diverso. Si può così fornire
-  una alternativa all'uso dei link simbolici (di cui parleremo in
-  sez.~\ref{sec:file_symlink}) che funziona correttamente anche all'intero di
-  un \textit{chroot} (argomento su cui torneremo in
-  sez.~\ref{sec:file_chroot}.  
-\itindend{bind~mount}
+  sez.~\ref{sec:link_symlink_rename}) con la possibilità di fare riferimento
+  alla porzione dell'albero dei file di un filesystem presente a partire da
+  una certa directory, utilizzando una qualunque altra directory, anche se
+  questa sta su un filesystem diverso. Si può così fornire una alternativa
+  all'uso dei collegamenti simbolici (di cui parleremo in
+  sez.~\ref{sec:link_symlink_rename}) che funziona correttamente anche
+  all'intero di un \textit{chroot} (argomento su cui torneremo in
+  sez.~\ref{sec:file_chroot}).  \itindend{bind~mount}
 
 \item[\const{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
   directory venga immediatamente registrata su disco in maniera sincrona
   (introdotta a partire dai kernel della serie 2.6). L'opzione si applica a
   tutte le directory del filesystem, ma su alcuni filesystem è possibile
   impostarla a livello di singole directory o per i sottorami di una directory
-  con il comando \cmd{lsattr}.\footnote{questo avviene tramite delle opportune
+  con il comando \cmd{chattr}.\footnote{questo avviene tramite delle opportune
     \texttt{ioctl} (vedi sez.~\ref{sec:file_ioctl}).}
 
   Questo consente di ridurre al minimo il rischio di perdita dei dati delle
@@ -829,10 +833,11 @@ identificati dalle costanti riportate nell'elenco seguente:
   vengono ignorati.
 
   Lo spostamento avviene atomicamente, ed il ramo di albero presente
-  sotto \param{source} sarà immediatamante visibile sotto \param{target}. Non
+  sotto \param{source} sarà immediatamente visibile sotto \param{target}. Non
   esiste cioè nessun momento in cui il filesystem non risulti montato in una o
   nell'altra directory e pertanto è garantito che la risoluzione di
-  \textit{pathname} relativi all'interno del filesystem non possa fallire.
+  \itindsub{pathname}{relativo} \textit{pathname} relativi all'interno del
+  filesystem non possa fallire.
 
 \item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
   degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per
@@ -935,7 +940,7 @@ identificati dalle costanti riportate nell'elenco seguente:
 
 \item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
   \textit{access time} sul filesystem soltanto quando questo risulti
-  antecendente il valore corrente del \textit{modification time} o del
+  antecedente il valore corrente del \textit{modification time} o del
   \textit{change time} (per i tempi dei file si veda
   sez.~\ref{sec:file_file_times}). L'opzione è disponibile a partire dal
   kernel 2.6.20, mentre dal 2.6.30 questo è diventato il comportamento di
@@ -958,7 +963,7 @@ identificati dalle costanti riportate nell'elenco seguente:
   cambiandone le opzioni di montaggio in maniera atomica. In questo modo si
   possono modificare le opzioni del filesystem anche se questo è in uso. Gli
   argomenti \param{source} e \param{target} devono essere gli stessi usati per
-  il montaggio originale, mentre \param{data} che \param{mountflags}
+  il montaggio originale, mentre sia \param{data} che \param{mountflags}
   conterranno le nuove opzioni, \param{filesystemtype} viene ignorato.
 
   Qualunque opzione specifica del filesystem indicata con \param{data} può
@@ -979,14 +984,16 @@ identificati dalle costanti riportate nell'elenco seguente:
     point} che si intende marcare, e tutti gli altri argomenti verranno
   ignorati.
 
-  Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount}
-  effettuati da un \textit{mount point} marcato da essa siano di tipo
-  \textit{shared}, cioè ``\textsl{condividano}'' con l'originale e fra di loro
-  ogni ulteriore operazione di montaggio o smontaggio che avviene su una
-  directory al di sotto di uno qualunque di essi. Le operazioni di montaggio e
-  smontaggio cioè vengono ``\textsl{propagate}'' a tutti i \textit{mount
-    point} della stessa condivisione, e la sezione di albero di file vista al
-  di sotto di ciascuno di essi sarà sempre identica.
+  Lo scopo dell'opzione è ottenere che tutti i successivi \itindex{bind~mount}
+  \textit{bind mount} effettuati da un \textit{mount point} marcato da essa
+  siano di tipo \textit{shared}, cioè ``\textsl{condividano}'' con l'originale
+  e fra di loro ogni ulteriore operazione di montaggio o smontaggio che
+  avviene su una directory al di sotto di uno qualunque di essi. Le operazioni
+  di montaggio e smontaggio effettuate al di sotto di un qualunque
+  \textit{mount point} così marcato verranno ``\textsl{propagate}'' a tutti i
+  \itindex{mount~point} \textit{mount point} della stessa condivisione, e la
+  sezione di albero di file vista al di sotto di ciascuno di essi sarà sempre
+  identica.
 
 \item[\const{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
   avvertimento nei log del kernel (vedi sez.~\ref{sec:sess_daemon}). L'opzione
@@ -1007,7 +1014,7 @@ identificati dalle costanti riportate nell'elenco seguente:
   effettuati da un \textit{mount point} marcato da essa siano di tipo
   \textit{slave}, cioè ``\textsl{condividano}'' ogni ulteriore operazione di
   montaggio o smontaggio che avviene su una directory al di sotto del
-  \textit{mount point} originale.  Le operazioni di montaggio e smontaggio in
+  \textit{mount point} originale. Le operazioni di montaggio e smontaggio in
   questo caso vengono ``\textsl{propagate}'' soltanto dal \textit{mount point}
   originale (detto anche \textit{master}) verso gli \textit{slave}, mentre
   essi potranno eseguire al loro interno ulteriori montaggi che non saranno
@@ -1042,13 +1049,13 @@ identificati dalle costanti riportate nell'elenco seguente:
   \param{target} dovrà fare riferimento al \textit{mount point} che si intende
   marcare, e tutti gli altri argomenti verranno ignorati.
 
-  Un \textit{mount point} marcato in questo modo disabilità la capacità di
-  eseguire dei \itindex{bind~mount} \textit{bind mount}. Si comporta cioè come
-  allo stesso modo di un \itindex{mount~point} \textit{mount point} ordinario
-  di tipo \textit{private} con in più la restrizione che nessuna sua
-  sottodirectory (anche se relativa ad un ulteriore montaggio) possa essere
-  utilizzata per un come sorgente di un \itindex{bind~mount} \textit{bind
-    mount}.
+  Un \textit{mount point} marcato in questo modo disabilita la capacità di
+  eseguire dei \itindex{bind~mount} \textit{bind mount} del suo contenuto. Si
+  comporta cioè come allo stesso modo di un \itindex{mount~point}
+  \textit{mount point} ordinario di tipo \textit{private} con in più la
+  restrizione che nessuna sua sottodirectory (anche se relativa ad un
+  ulteriore montaggio) possa essere utilizzata per un come sorgente di un
+  \itindex{bind~mount} \textit{bind mount}.
 
 \end{basedescript}
 
@@ -1066,26 +1073,29 @@ identificati dalle costanti riportate nell'elenco seguente:
 
 
 Una volta che non si voglia più utilizzare un certo filesystem è possibile
-\textsl{smontarlo} usando la funzione \funcd{umount}, il cui prototipo è:
+``\textsl{smontarlo}'' usando la funzione di sistema \funcd{umount}, il cui
+prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/mount.h}
 \fdecl{umount(const char *target)}
 \fdesc{Smonta un filesystem.} 
 }
-{La funzione ritorna  $0$ in caso 
-  di successo e $-1$  per un errore,
+{La funzione ritorna  $0$ in caso di successo e $-1$ per un errore,
   nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
-  \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro}
-    directory di lavoro di qualche processo, o contiene dei file aperti, o un
-    altro mount point.
-\end{errlist}ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM},
-\errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ELOOP} nel loro
-  significato generico.}
+  \item[\errcode{EBUSY}] il filesystem è occupato.
+  \item[\errcode{EINVAL}] \param{target} non è un \textit{mount point}.
+  \item[\errcode{EPERM}] il processo non ha i privilegi di
+    amministratore.\footnotemark 
+  \end{errlist}
+  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM} nel loro significato generico.  }
 \end{funcproto}
 
+\footnotetext{più precisamente la \itindex{capabilities} capacità
+  \texttt{CAP\_SYS\_ADMIN}.}
+
 La funzione prende il nome della directory su cui il filesystem è montato e
 non il file o il dispositivo che è stato montato,\footnote{questo è vero a
   partire dal kernel 2.3.99-pre7, prima esistevano due chiamate separate e la
@@ -1093,40 +1103,114 @@ non il file o il dispositivo che è stato montato,\footnote{questo è vero a
 quanto a partire dai kernel della serie 2.4.x è possibile montare lo stesso
 dispositivo in più punti. Nel caso più di un filesystem sia stato montato
 sullo stesso \itindex{mount~point} \textit{mount point} viene smontato quello
-che è stato montato per ultimo.
+che è stato montato per ultimo. Si tenga presente che la funzione fallisce se
+il filesystem è ``\textsl{occupato}'', cioè quando ci sono ancora dei file
+aperti sul filesystem, se questo contiene la \index{directory~di~lavoro}
+directory di lavoro di un qualunque processo o il \itindex{mount~point}
+\textit{mount point} di un altro filesystem.
 
-Si tenga presente che la funzione fallisce quando il filesystem è
-\textsl{occupato}, cioè quando ci sono ancora dei file aperti sul filesystem,
-se questo contiene la \index{directory~di~lavoro} directory di lavoro corrente
-di un qualunque processo o il \itindex{mount~point} \textit{mount point} di un
-altro filesystem; in questo caso l'errore restituito è \errcode{EBUSY}.
+Linux provvede inoltre una seconda funzione di sistema, \funcd{umount2}, che
+consente un maggior controllo delle operazioni, come forzare lo smontaggio di
+un filesystem anche quando questo risulti occupato; il suo prototipo è:
 
-Linux provvede inoltre una seconda funzione, \funcd{umount2}, che in alcuni
-casi permette di forzare lo smontaggio di un filesystem, anche quando questo
-risulti occupato; il suo prototipo è:
 \begin{funcproto}{ 
 \fhead{sys/mount.h}
 \fdecl{umount2(const char *target, int flags)}
 \fdesc{Smonta un filesystem.} 
 }
-{La funzione è identica a \func{umount} per valori di ritorno e codici di
-  errore. }
+{La funzione ritorna  $0$ in caso di successo e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
+     \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro}
+       directory di lavoro di qualche processo, o contiene dei file aperti, o un
+       altro mount point.
+     \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
+       ed il filesystem non era occupato.
+     \item[\errcode{EINVAL}] \param{target} non è un \itindex{mount~point}
+       \textit{mount point} o si è usato \const{MNT\_EXPIRE} con
+       \const{MNT\_FORCE} o \const{MNT\_DETACH} o si è specificato un flag non
+       esistente.
+  \end{errlist}
+  e tutti gli altri valori visti per \func{umount} con lo stesso significato.}
 \end{funcproto}
 
-Il valore di \param{flags} è una maschera binaria, e al momento l'unico valore
-definito è il bit \const{MNT\_FORCE}; gli altri bit devono essere nulli.
-Specificando \const{MNT\_FORCE} la funzione cercherà di liberare il filesystem
-anche se è occupato per via di una delle condizioni descritte in precedenza. A
-seconda del tipo di filesystem alcune (o tutte) possono essere superate,
-evitando l'errore di \errcode{EBUSY}.  In tutti i casi prima dello smontaggio
-viene eseguita una sincronizzazione dei dati. 
+Il valore di \param{flags} è una maschera binaria dei flag che controllano le
+modalità di smontaggio, che deve essere specificato con un OR aritmetico delle
+costanti illustrate in tab.~\ref{tab:umount2_flags}.  Specificando
+\const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
+occupato per via di una delle condizioni descritte in precedenza. A seconda
+del tipo di filesystem alcune (o tutte) possono essere superate, evitando
+l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio viene
+eseguita una sincronizzazione dei dati.
 
-% TODO documentare MNT_DETACH e MNT_EXPIRE ...
+\begin{table}[!htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Costante} & \textbf{Descrizione}\\
+    \hline
+    \hline
+    \const{MNT\_FORCE}  & forza lo smontaggio del filesystem anche se questo è
+                          occupato (presente dai kernel della serie 2.2).\\
+    \const{MNT\_DETACH} & esegue uno smontaggio ``\textsl{pigro}'', in cui si
+                          blocca l'accesso ma si aspetta che il filesystem si
+                          liberi (presente dal kernel 2.4.11 e dalla
+                          \acr{glibc} 2.11).\\ 
+    \const{MNT\_EXPIRE} & se non occupato marca un \itindex{mount~point} 
+                          \textit{mount point} come ``\textsl{in scadenza}'' in
+                          modo che ad una successiva chiamata senza utilizzo
+                          del filesystem questo venga smontato (presente dal
+                          kernel 2.6.8 e dalla \acr{glibc} 2.11).\\ 
+    \const{UMOUNT\_NOFOLLOW}& non dereferenzia \param{target} se questo è un
+                          collegamento simbolico (vedi
+                          sez.~\ref{sec:link_symlink_rename}) evitando
+                          problemi di sicurezza (presente dal kernel 2.6.34).\\ 
+    \hline
+  \end{tabular}
+  \caption{Costanti che identificano i bit dell'argomento \param{flags}
+    della funzione \func{umount2}.} 
+  \label{tab:umount2_flags}
+\end{table}
 
-Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD,
-  ma con una struttura diversa.} utili per ottenere in maniera diretta
-informazioni riguardo al filesystem su cui si trova un certo file, sono
-\funcd{statfs} e \funcd{fstatfs}, i cui prototipi sono:
+Con l'opzione \const{MNT\_DETACH} si richiede invece uno smontaggio
+``\textsl{pigro}'' (o \textit{lazy umount}) in cui il filesystem diventa
+inaccessibile per i nuovi processi subito dopo la chiamata della funzione, ma
+resta accessibile per quelli che lo hanno ancora in uso e non viene smontato
+fintanto che resta occupato.
+
+Con \const{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
+due, si marca il \itindex{mount~point} \textit{mount point} di un filesystem
+non occupato come ``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna
+con un errore di \errcode{EAGAIN}, mentre in caso di filesystem occupato si
+sarebbe ricevuto \errcode{EBUSY}.  Una volta marcato, se nel frattempo non
+viene fatto nessun uso del filesystem, ad una successiva chiamata con
+\const{MNT\_EXPIRE} questo verrà smontato. Questo flag consente di realizzare
+un meccanismo che smonti automaticamente i filesystem che restano inutilizzati
+per un certo periodo di tempo.
+
+Infine il flag \const{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
+questo è un collegamento simbolico (vedi
+sez.~\ref{sec:link_symlink_rename}). Questa è una misura di sicurezza
+introdotta per evitare, per quei filesystem per il quale è prevista una
+gestione diretta da parte degli utenti, come quelli basati su
+FUSE,\footnote{il \textit{Filesystem in USEr space} (FUSE) è una delle più
+  interessanti applicazioni del \itindex{Virtual~File~System} VFS che
+  consente, tramite un opportuno modulo, di implementarne le funzioni in
+  \textit{user space}, così da rendere possibile l'implementazione di un
+  qualunque filesystem (con applicazioni di grande interesse come il
+  filesystem cifrato \textit{encfs} o il filesystem di rete \textit{sshfs})
+  che possa essere usato direttamente per conto degli utenti.}  che si possano
+passare ai programmi che effettuano lo smontaggio dei filesystem, che in
+genere sono privilegiati ma consentono di agire solo sui propri \textit{mount
+  point}, dei collegamenti simbolici che puntano ad altri \textit{mount
+  point}, ottenendo così la possibilità di smontare qualunque filesystem.
+
+
+Altre due funzioni di sistema specifiche di Linux,\footnote{esse si trovano
+  anche su BSD, ma con una struttura diversa.} utili per ottenere in maniera
+diretta informazioni riguardo al filesystem su cui si trova un certo file,
+sono \funcd{statfs} e \funcd{fstatfs}, i cui prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{sys/vfs.h}
@@ -1137,22 +1221,24 @@ informazioni riguardo al filesystem su cui si trova un certo file, sono
 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore,
   nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato non
+  \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato
+    non supporta la funzione.
   \end{errlist} ed inoltre \errval{EFAULT} ed \errval{EIO} per entrambe,
   \errval{EBADF} per \func{fstatfs}, \errval{ENOTDIR}, \errval{ENAMETOOLONG},
   \errval{ENOENT}, \errval{EACCES}, \errval{ELOOP} per \func{statfs} nel loro
   significato generico.}
 \end{funcproto}
 
-
 Queste funzioni permettono di ottenere una serie di informazioni generali
-riguardo al filesystem su cui si trova il file specificato; queste vengono
-restituite all'indirizzo \param{buf} di una struttura \struct{statfs} definita
-come in fig.~\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il
-filesystem in 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 \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in
-genere è il nome del filesystem stesso.
+riguardo al filesystem su cui si trova il file specificato con un
+\textit{pathname} per \func{statfs} e con un file descriptor (vedi
+sez.~\ref{sec:file_fd}) per \func{statfs}.  Le informazioni vengono restituite
+all'indirizzo \param{buf} di una struttura \struct{statfs} definita come in
+fig.~\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in
+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 \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in genere è il nome
+del filesystem stesso.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -1164,406 +1250,258 @@ genere è il nome del filesystem stesso.
   \label{fig:sys_statfs}
 \end{figure}
 
-
-Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab} ed \conffile{/etc/mtab}, che convenzionalmente sono
-usati in quasi tutti i sistemi unix-like per mantenere rispettivamente le
-informazioni riguardo ai filesystem da montare e a quelli correntemente
-montati. Le funzioni servono a leggere il contenuto di questi file in
-opportune strutture \struct{fstab} e \struct{mntent}, e, per
-\conffile{/etc/mtab} per inserire e rimuovere le voci presenti nel file.
-
-In generale si dovrebbero usare queste funzioni (in particolare quelle
-relative a \conffile{/etc/mtab}), quando si debba scrivere un programma che
-effettua il montaggio di un filesystem; in realtà in questi casi è molto più
-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)
-% TODO documentare swapon e swapoff (man 2 ...)
-
-
-
+La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due
+file \conffile{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+  \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.}
+ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent},
+  \funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent},
+  \funcm{hasmntopt}.} che convenzionalmente sono usati in quasi tutti i
+sistemi unix-like per mantenere rispettivamente le informazioni riguardo ai
+filesystem da montare e a quelli correntemente montati. Le funzioni servono a
+leggere il contenuto di questi file in opportune strutture \struct{fstab} e
+\struct{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e rimuovere
+le voci presenti nel file.
+
+In generale si dovrebbero usare queste funzioni, in particolare quelle
+relative a \conffile{/etc/mtab}, quando si debba scrivere un programma che
+effettua il montaggio di un filesystem. In realtà in questi casi è molto più
+semplice invocare direttamente il programma \cmd{mount}. Inoltre l'uso stesso
+di \conffile{/etc/mtab} è considerato una pratica obsoleta, in quanto se non
+aggiornato correttamente (cosa che è impossibile se la radice è montata in
+sola lettura) il suo contenuto diventa fuorviante.
+
+Per questo motivo il suo utilizzo viene deprecato ed in molti casi viene già
+oggi sostituito da un collegamento simbolico a \procfile{/proc/mounts}, che
+contiene una versione degli stessi contenuti (vale a dire l'elenco dei
+filesystem montati) generata direttamente dal kernel, e quindi sempre
+disponibile e sempre aggiornata. Per questo motivo tralasceremo la
+trattazione, di queste funzioni, rimandando al manuale della \acr{glibc}
+\cite{GlibcMan} per la documentazione completa.
+
+% TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
+% TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...) 
 
 
 \section{La gestione di file e directory}
 \label{sec:file_dir}
 
-Come già accennato in sez.~\ref{sec:file_filesystem} in un sistema unix-like
-la gestione dei file ha delle caratteristiche specifiche che derivano
-direttamente dall'architettura del sistema.  In questa sezione esamineremo le
-funzioni usate per la manipolazione di file e directory, per la creazione di
-link simbolici e diretti, per la gestione e la lettura delle directory.
+In questa sezione esamineremo le funzioni usate per la manipolazione dei nomi
+file e directory, per la creazione di collegamenti simbolici e diretti, per la
+gestione e la lettura delle directory.  In particolare ci soffermeremo sulle
+conseguenze che derivano dalla architettura di un filesystem unix-like
+illustrata in sez.~\ref{sec:file_filesystem} per quanto attiene il
+comportamento e gli effetti delle varie funzioni. Tratteremo infine la
+directory di lavoro e le funzioni per la gestione di file speciali e
+temporanei.
+
 
-In particolare ci soffermeremo sulle conseguenze che derivano
-dall'architettura dei filesystem illustrata nel capitolo precedente per quanto
-riguarda il comportamento e gli effetti delle varie funzioni.
 
+\subsection{La gestione dei nomi dei file}
+\label{sec:link_symlink_rename}
 
-\subsection{Le funzioni \func{link} e \func{unlink}}
-\label{sec:file_link}
+\subsection{Le funzioni \func{link} e \func{unlink}}
+\label{sec:file_link}
 
 Una caratteristica comune a diversi sistemi operativi è quella di poter creare
-dei nomi fittizi (come gli alias del vecchio MacOS o i collegamenti di Windows
-o i nomi logici del VMS) che 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
-usualmente chiamati \textit{link}; ma data l'architettura del sistema riguardo
-la gestione dei file ci sono due metodi sostanzialmente diversi per fare
-questa operazione.
-
-Come spiegato in sez.~\ref{sec:file_filesystem} l'accesso al contenuto di un
-file su disco avviene passando attraverso il suo \itindex{inode}
-\textit{inode}, che è la struttura usata dal kernel che lo identifica
-univocamente all'interno di un singolo filesystem. Il nome del file che si
-trova nella voce di una directory è solo un'etichetta, mantenuta all'interno
-della directory, che viene associata ad un puntatore che fa riferimento al
-suddetto \textit{inode}.
-
-Questo significa che, fintanto che si resta sullo stesso filesystem, la
-realizzazione di un link è immediata, ed uno stesso file può avere tanti nomi
-diversi, dati da altrettante associazioni diverse allo stesso \itindex{inode}
-\textit{inode} effettuate tramite ``etichette'' diverse in directory
-diverse. Si noti anche che nessuno di questi nomi viene ad assumere una
-particolare preferenza o originalità rispetto agli altri, in quanto tutti
-fanno comunque riferimento allo stesso \itindex{inode} \textit{inode}.
-
-Per aggiungere ad una directory una voce che faccia riferimento ad un
-\itindex{inode} \textit{inode} già esistente si utilizza la funzione
-\func{link}; si suole chiamare questo tipo di associazione un collegamento
-diretto, o \textit{hard link}.  Il prototipo della funzione è il seguente:
-\begin{prototype}{unistd.h}
-{int link(const char *oldpath, const char *newpath)}
-  Crea un nuovo collegamento diretto.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore nel qual caso \var{errno} viene impostata ai valori:
+dei nomi alternativi, come gli alias del vecchio MacOS o i collegamenti di
+Windows o i nomi logici del VMS, che permettono di fare riferimento allo
+stesso file chiamandolo con nomi diversi o accedendovi da directory diverse.
+Questo è possibile anche in ambiente Unix, dove un nome alternativo viene
+usualmente chiamato `` \textsl{collegamento}'' (o \textit{link}).  Data
+l'architettura del sistema riguardo la gestione dei file vedremo però che ci
+sono due metodi sostanzialmente diversi per fare questa operazione.
+
+\itindbeg{hard~link}
+\index{collegamento!diretto|(}
+
+In sez.~\ref{sec:file_filesystem} abbiamo spiegato come la capacità di
+chiamare un file con nomi diversi sia connaturata con l'architettura di un
+filesystem per un sistema Unix, in quanto il nome del file che si trova in una
+directory è solo un'etichetta associata ad un puntatore che permette di
+ottenere il riferimento ad un \textit{inode}, e che è quest'ultimo che viene
+usato dal kernel per identificare univocamente gli oggetti sul filesystem.
+
+Questo significa che fintanto che si resta sullo stesso filesystem la
+realizzazione di un \textit{link} è immediata: uno stesso file può avere tanti
+nomi diversi, dati da altrettante associazioni diverse allo stesso
+\itindex{inode} \textit{inode} effettuate tramite ``etichette'' diverse in
+directory diverse. Si noti anche come nessuno di questi nomi possa assumere
+una particolare preferenza o originalità rispetto agli altri, in quanto tutti
+fanno comunque riferimento allo stesso \itindex{inode} \textit{inode} e quindi
+tutti otterranno lo stesso file.
+
+Quando si vuole aggiungere ad una directory una voce che faccia riferimento ad
+un file già esistente nella modalità appena descritta, per ottenere quello che
+viene denominato ``\textsl{collegamento diretto}'' (o \textit{hard link}), si
+deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
+
+\begin{funcproto}{ 
+\fhead{unistd.h}
+\fdecl{int link(const char *oldpath, const char *newpath)}
+\fdesc{Crea un nuovo collegamento diretto (\textit{hard link}).} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non fanno
-    riferimento ad un filesystem montato sullo stesso \itindex{mount~point}
-    \textit{mount point}.
-  \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e
-    \param{newpath} non supporta i link diretti o è una directory.
   \item[\errcode{EEXIST}] un file (o una directory) di nome \param{newpath}
     esiste già.
-  \item[\errcode{EMLINK}] ci sono troppi link al file \param{oldpath} (il
-    numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi
+  \item[\errcode{EMLINK}] ci sono troppi collegamenti al file \param{oldpath}
+    (il numero massimo è specificato dalla variabile \const{LINK\_MAX}, vedi
     sez.~\ref{sec:sys_limits}).
-  \end{errlist}
-  ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOTDIR},
-  \errval{EFAULT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP},
-  \errval{ENOSPC}, \errval{EIO}.}
-\end{prototype}
+  \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e
+    \param{newpath} non supporta i collegamenti diretti o è una directory.
+  \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non fanno
+    riferimento ad un filesystem montato sullo stesso \itindex{mount~point}
+    \textit{mount point}.
+  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
+  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM},
+  \errval{ENOSPC}, \errval{ENOTDIR}, \errval{EROFS} nel loro significato
+  generico.}
+\end{funcproto}
 
-La funzione crea sul \itindex{pathname} \textit{pathname} \param{newpath} un
-collegamento diretto al file indicato da \param{oldpath}.  Per quanto detto la
-creazione di un nuovo collegamento diretto non copia il contenuto del file, ma
-si limita a creare una voce nella directory specificata da \param{newpath} e
-ad aumentare di uno il numero di riferimenti al file (riportato nel campo
-\var{st\_nlink} della struttura \struct{stat}, vedi sez.~\ref{sec:file_stat})
-aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può
-essere così chiamato con vari nomi in diverse directory.
+La funzione crea in \param{newpath} un collegamento diretto al file indicato
+da \param{oldpath}. Per quanto detto la creazione di un nuovo collegamento
+diretto non copia il contenuto del file, ma si limita a creare la voce
+specificata da \param{newpath} nella directory corrispondente e l'unica
+proprietà del file che verrà modificata sarà il numero di riferimenti al file
+(il campo \var{i\_nlink} della struttura \kstruct{inode}, vedi
+fig.~\ref{fig:kstruct_inode}) che verrà aumentato di di uno. In questo modo lo
+stesso file potrà essere acceduto sia con \param{newpath} che
+con \param{oldpath}.
 
 Per quanto dicevamo in sez.~\ref{sec:file_filesystem} la creazione di un
-collegamento diretto è possibile solo se entrambi i \itindex{pathname}
-\textit{pathname} sono nello stesso filesystem; inoltre il filesystem deve
-supportare i collegamenti diretti (il meccanismo non è disponibile ad esempio
-con il filesystem \acr{vfat} di Windows). In realtà la funzione ha un
-ulteriore requisito, e cioè che non solo che i due file siano sullo stesso
-filesystem, ma anche che si faccia riferimento ad essi sullo stesso
-\itindex{mount~point} \textit{mount point}.\footnote{si tenga presente infatti
-  (vedi sez.~\ref{sec:sys_file_config}) che a partire dal kernel 2.4 uno
-  stesso filesystem può essere montato più volte su directory diverse.}
+collegamento diretto è possibile solo se entrambi i \textit{pathname} sono
+nello stesso filesystem ed inoltre esso deve supportare gli \textit{hard link}
+(il meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
+Windows). In realtà la funzione ha un ulteriore requisito, e cioè che non solo
+che i due file siano sullo stesso filesystem, ma anche che si faccia
+riferimento ad essi all'interno dello stesso \itindex{mount~point}
+\textit{mount point}.\footnote{si tenga presente infatti, come detto in
+  sez.~\ref{sec:filesystem_mounting}, che a partire dal kernel 2.4 uno stesso
+  filesystem può essere montato più volte su directory diverse.}
 
 La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
 filesystem, con l'eccezione delle directory. In alcune versioni di Unix solo
 l'amministratore è in grado di creare un collegamento diretto ad un'altra
 directory: questo viene fatto perché con una tale operazione è possibile
-creare dei \textit{loop} nel filesystem (vedi l'esempio mostrato in
-sez.~\ref{sec:file_symlink}, dove riprenderemo il discorso) che molti programmi
-non sono in grado di gestire e la cui rimozione diventerebbe estremamente
-complicata (in genere per questo tipo di errori occorre far girare il
-programma \cmd{fsck} per riparare il filesystem).
-
-Data la pericolosità di questa operazione e la disponibilità dei link
-simbolici (che vedremo in sez.~\ref{sec:file_symlink}) e dei
-\itindex{bind~mount} \textit{bind mount} (già visti in
-sez.~\ref{sec:sys_file_config}) che possono fornire la stessa funzionalità
-senza questi problemi, nel caso di Linux questa capacità è stata completamente
-disabilitata, e al tentativo di creare un link diretto ad una directory la
-funzione \func{link} restituisce l'errore \errcode{EPERM}.
+creare dei \textit{loop} nel filesystem (vedi fig.~\ref{fig:file_link_loop})
+che molti programmi non sono in grado di gestire e la cui rimozione
+diventerebbe piuttosto complicata.\footnote{in genere per questo tipo di
+  errori occorre eseguire il programma \cmd{fsck} per riparare il filesystem,
+  in quanto in caso di \textit{loop} la directory creata non sarebbe vuota e
+  non si potrebbe più rimuoverla.}
+
+Data la pericolosità di questa operazione e la disponibilità dei collegamenti
+simbolici (che vedremo a breve) e dei \itindex{bind~mount} \textit{bind mount}
+(già visti in sez.~\ref{sec:filesystem_mounting}) che possono fornire la
+stessa funzionalità senza questi problemi, nel caso di Linux questa capacità è
+stata completamente disabilitata, e al tentativo di creare un collegamento
+diretto ad una directory la funzione \func{link} restituisce sempre l'errore
+\errcode{EPERM}.
 
 Un ulteriore comportamento peculiare di Linux è quello in cui si crea un
-\textit{hard link} ad un link simbolico. In questo caso lo standard POSIX
-prevederebbe che quest'ultimo venga risolto e che il collegamento sia
-effettuato rispetto al file cui esso punta, e che venga riportato un errore
-qualora questo non esista o non sia un file. Questo era anche il comportamento
-iniziale di Linux ma a partire dai kernel della serie 2.0.x\footnote{per la
-  precisione il comportamento era quello previsto dallo standard POSIX fino al
-  kernel di sviluppo 1.3.56, ed è stato temporaneamente ripristinato anche
-  durante lo sviluppo della serie 2.1.x, per poi tornare al comportamento
-  attuale fino ad oggi (per riferimento si veda
+\textit{hard link} ad un collegamento simbolico. In questo caso lo standard
+POSIX.1-2001 prevederebbe che quest'ultimo venga risolto e che il collegamento
+sia effettuato rispetto al file cui esso punta, e che venga riportato un
+errore qualora questo non esista o non sia un file. Questo era anche il
+comportamento iniziale di Linux ma a partire dai kernel della serie
+2.0.x\footnote{per la precisione il comportamento era quello previsto dallo
+  standard POSIX fino al kernel di sviluppo 1.3.56, ed è stato temporaneamente
+  ripristinato anche durante lo sviluppo della serie 2.1.x, per poi tornare al
+  comportamento attuale fino ad oggi (per riferimento si veda
   \url{http://lwn.net/Articles/293902}).} è stato adottato un comportamento
-che non segue più lo standard per cui l'\textit{hard link} viene creato
-rispetto al link simbolico, e non al file cui questo punta.
-
-La ragione di questa differenza rispetto allo standard, presente anche in
-altri sistemi unix-like, sono dovute al fatto che un link simbolico può fare
-riferimento anche ad un file non esistente o a una directory, per i quali
-l'\textit{hard link} non può essere creato, per cui la scelta di seguire il
-link simbolico è stata ritenuta una scelta scorretta nella progettazione
-dell'interfaccia.  Infatti se non ci fosse il comportamento adottato da Linux
-sarebbe impossibile creare un \textit{hard link} ad un link simbolico, perché
-la funzione lo risolverebbe e l'\textit{hard link} verrebbe creato verso la
-destinazione. Invece evitando di seguire lo standard l'operazione diventa
-possibile, ed anche il comportamento della funzione risulta molto più
-comprensibile. Tanto più che se proprio se si vuole creare un \textit{hard
-  link} rispetto alla destinazione di un link simbolico è sempre possibile
-farlo direttamente.\footnote{ciò non toglie che questo comportamento fuori
-  standard possa causare problemi, come nell'esempio descritto nell'articolo
-  citato nella nota precedente, a programmi che non si aspettano questa
-  differenza rispetto allo standard POSIX.}
-
-La rimozione di un file (o più precisamente della voce che lo referenzia
-all'interno di una directory) si effettua con la funzione \funcd{unlink}; il
-suo prototipo è il seguente:
-\begin{prototype}{unistd.h}{int unlink(const char *pathname)}
-
-  Cancella un file.
-  
-  \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 impostata secondo i seguenti codici di errore:
-  \begin{errlist}
-  \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una directory.
-    \footnotemark
-  \item[\errcode{EROFS}] \param{pathname} è su un filesystem montato in sola
-  lettura.
-  \item[\errcode{EISDIR}] \param{pathname} fa riferimento a una directory.
-  \end{errlist}
-  ed inoltre: \errval{EACCES}, \errval{EFAULT}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP},
-  \errval{EIO}.}
-\end{prototype}
-
-\footnotetext{questo è un valore specifico ritornato da Linux che non consente
-  l'uso di \func{unlink} con le directory (vedi sez.~\ref{sec:file_remove}).
-  Non è conforme allo standard POSIX, che prescrive invece l'uso di
-  \errcode{EPERM} in caso l'operazione non sia consentita o il processo non
-  abbia privilegi sufficienti.}
+che non segue più lo standard per cui l'\textit{hard link} viene creato nei
+confronti del collegamento simbolico, e non del file cui questo punta. La
+revisione POSIX.1-2008 lascia invece il comportamento dipendente
+dall'implementazione, cosa che rende Linux conforme a questa versione
+successiva dello standard.
+
+\itindbeg{symbolic~link}
+
+\index{collegamento!simbolico|(}
+
+La ragione di questa differenza rispetto al vecchio standard, presente anche
+in altri sistemi unix-like, è dovuta al fatto che un collegamento simbolico
+può fare riferimento anche ad un file non esistente o a una directory, per i
+quali l'\textit{hard link} non può essere creato, per cui la scelta di seguire
+il collegamento simbolico è stata ritenuta una scelta scorretta nella
+progettazione dell'interfaccia.  Infatti se non ci fosse il comportamento
+adottato da Linux sarebbe impossibile creare un \textit{hard link} ad un
+collegamento simbolico, perché la funzione lo risolverebbe e l'\textit{hard
+  link} verrebbe creato verso la destinazione. Invece evitando di seguire lo
+standard l'operazione diventa possibile, ed anche il comportamento della
+funzione risulta molto più comprensibile. Tanto più che se proprio se si vuole
+creare un \textit{hard link} rispetto alla destinazione di un collegamento
+simbolico è sempre possibile farlo direttamente.\footnote{ciò non toglie che
+  questo comportamento possa causare problemi, come nell'esempio descritto
+  nell'articolo citato nella nota precedente, a programmi che non si aspettano
+  questa differenza rispetto allo standard POSIX.}
+
+Dato che \func{link} crea semplicemente dei nomi che fanno riferimenti agli
+\itindex{inode} \textit{inode}, essa può funzionare soltanto per file che
+risiedono sullo stesso filesystem e solo per un filesystem di tipo Unix.
+Inoltre abbiamo visto che in Linux non è consentito eseguire un collegamento
+diretto ad una directory.
+
+Per ovviare a queste limitazioni, come accennato all'inizio, i sistemi
+unix-like supportano un'altra forma di collegamento, detta
+``\textsl{collegamento simbolico}'' (o anche \textit{soft link} o
+\textit{symbolic link}). In questo caso si tratta, come avviene in altri
+sistemi operativi, di file speciali che contengono semplicemente il
+riferimento ad un altro file (o directory). In questo modo è possibile
+effettuare \textit{link} anche attraverso filesystem diversi, a file posti in
+filesystem che non supportano i collegamenti diretti, a delle directory, ed
+anche a file che non esistono ancora.
+
+\itindend{hard~link}
+\index{collegamento!diretto|)}
+
+Il meccanismo funziona in quanto i \textit{symbolic link} sono riconosciuti
+come tali dal kernel\footnote{è uno dei diversi tipi di file visti in
+  tab.~\ref{tab:file_file_types}, contrassegnato come tale nell'\textit{inode}
+  e riconoscibile dal valore del campo \var{st\_mode} della struttura
+  \struct{stat} (vedi sez.~\ref{sec:file_stat}).} e tutta una serie di
+funzioni di sistema (come \func{open} o \func{stat}) quando ricevono come
+argomento il \textit{pathname} di un collegamento simbolico vanno
+automaticamente ad operare sul file da esso specificato. La funzione di
+sistema che permette di creare un nuovo collegamento simbolico è
+\funcd{symlink}, ed il suo prototipo è:
 
-La funzione cancella il nome specificato da \param{pathname} nella relativa
-directory e decrementa il numero di riferimenti nel relativo \itindex{inode}
-\textit{inode}. Nel caso di link simbolico cancella il link simbolico; nel
-caso di socket, fifo o file di dispositivo \index{file!di~dispositivo} rimuove
-il nome, ma come per i file i processi che hanno aperto uno di questi oggetti
-possono continuare ad utilizzarlo.
-
-Per cancellare una voce in una directory è necessario avere il permesso di
-scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e
-il diritto di esecuzione sulla directory che la contiene (affronteremo in
-dettaglio l'argomento dei permessi di file e directory in
-sez.~\ref{sec:file_access_control}). Se inoltre lo \itindex{sticky~bit}
-\textit{sticky bit} (vedi sez.~\ref{sec:file_special_perm}) è impostato
-occorrerà anche essere proprietari del file o proprietari della directory (o
-root, per cui nessuna delle restrizioni è applicata).
-
-Una delle caratteristiche di queste funzioni è che la creazione/rimozione del
-nome dalla directory e l'incremento/decremento del numero di riferimenti
-\itindex{inode} nell'\textit{inode} devono essere effettuati in maniera
-atomica (si veda sez.~\ref{sec:proc_atom_oper}) senza possibili interruzioni
-fra le due operazioni. Per questo entrambe queste funzioni sono realizzate
-tramite una singola system call.
-
-Si ricordi infine che un file non viene eliminato dal disco fintanto che tutti
-i riferimenti ad esso sono stati cancellati: solo quando il \textit{link
-  count} mantenuto \itindex{inode} nell'\textit{inode} diventa zero lo spazio
-occupato su disco viene rimosso (si ricordi comunque che a questo si aggiunge
-sempre un'ulteriore condizione,\footnote{come vedremo in
-  cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei
-  file aperti nei vari processi, che a sua volta contiene i riferimenti agli
-  \itindex{inode} \textit{inode} ad essi relativi. Prima di procedere alla
-  cancellazione dello spazio occupato su disco dal contenuto di un file il
-  kernel controlla anche questa tabella, per verificare che anche in essa non
-  ci sia più nessun riferimento all'\textit{inode} in questione.} e cioè che
-non ci siano processi che abbiano il suddetto file aperto).
-
-Questa proprietà viene spesso usata per essere sicuri di non lasciare file
-temporanei su disco in caso di crash dei programmi; la tecnica è quella di
-aprire il file e chiamare \func{unlink} subito dopo, in questo modo il
-contenuto del file è sempre disponibile all'interno del processo attraverso il
-suo file descriptor (vedi sez.~\ref{sec:file_fd}) fintanto che il processo non
-chiude il file, ma non ne resta traccia in nessuna directory, e lo spazio
-occupato su disco viene immediatamente rilasciato alla conclusione del
-processo (quando tutti i file vengono chiusi).
-
-
-\subsection{Le funzioni \func{remove} e \func{rename}}
-\label{sec:file_remove}
-
-Al contrario di quanto avviene con altri Unix, in Linux non è possibile usare
-\func{unlink} sulle directory; per cancellare una directory si può usare la
-funzione \func{rmdir} (vedi sez.~\ref{sec:file_dir_creat_rem}), oppure la
-funzione \funcd{remove}. 
-
-Questa è la funzione prevista dallo standard ANSI C per cancellare un file o
-una directory (e funziona anche per i sistemi che non supportano i link
-diretti). Per i file è identica a \func{unlink} e per le directory è identica
-a \func{rmdir}; il suo prototipo è:
-\begin{prototype}{stdio.h}{int remove(const char *pathname)}
-  Cancella un nome dal filesystem. 
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso il file non viene toccato.
-    
-    I codici di errore riportati in \var{errno} sono quelli della chiamata
-    utilizzata, pertanto si può fare riferimento a quanto illustrato nelle
-    descrizioni di \func{unlink} e \func{rmdir}.}
-\end{prototype}
-
-La funzione utilizza la funzione \func{unlink}\footnote{questo vale usando le
-  \acr{glibc}; nelle libc4 e nelle libc5 la funzione \func{remove} è un
-  semplice alias alla funzione \func{unlink} e quindi non può essere usata per
-  le directory.} per cancellare i file e la funzione \func{rmdir} per
-cancellare le directory; si tenga presente che per alcune implementazioni del
-protocollo NFS utilizzare questa funzione può comportare la scomparsa di file
-ancora in uso.
-
-Per cambiare nome ad un file o a una directory (che devono comunque essere
-nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la
-  funzione è definita dallo standard ANSI C, ma si applica solo per i file, lo
-  standard POSIX estende la funzione anche alle directory.} il cui prototipo
-è:
-\begin{prototype}{stdio.h}
-  {int rename(const char *oldpath, const char *newpath)} 
-  
-  Rinomina un file.
-  
-  \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 impostata secondo i seguenti codici di errore:
-  \begin{errlist} 
-  \item[\errcode{EISDIR}] \param{newpath} è una directory mentre
-    \param{oldpath} non è una directory.
-  \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo
-    stesso filesystem.
-  \item[\errcode{ENOTEMPTY}] \param{newpath} è una directory già esistente e
-    non vuota.
-  \item[\errcode{EBUSY}] o \param{oldpath} o \param{newpath} sono in uso da
-    parte di qualche processo (come \index{directory~di~lavoro} directory di
-    lavoro o come radice) o del sistema (come \itindex{mount~point}
-    \textit{mount point}).
-  \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di
-    \param{oldpath} o più in generale si è cercato di creare una directory come
-    sotto-directory di se stessa.
-  \item[\errcode{ENOTDIR}] uno dei componenti dei \itindex{pathname}
-    \textit{pathname} non è una directory o \param{oldpath} è una directory e
-    \param{newpath} esiste e non è una directory.
-  \end{errlist} 
-  ed inoltre \errval{EACCES}, \errval{EPERM}, \errval{EMLINK},
-  \errval{ENOENT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP} e
-  \errval{ENOSPC}.}
-\end{prototype}
-
-La funzione rinomina il file \param{oldpath} in \param{newpath}, eseguendo se
-necessario lo spostamento di un file fra directory diverse. Eventuali altri
-link diretti allo stesso file non vengono influenzati.
-
-Il comportamento della funzione è diverso a seconda che si voglia rinominare
-un file o una directory; se ci riferisce ad un file allora \param{newpath}, se
-esiste, non deve essere una directory (altrimenti si ha l'errore
-\errcode{EISDIR}). Nel caso \param{newpath} indichi un file esistente questo
-viene cancellato e rimpiazzato (atomicamente).
-
-Se \param{oldpath} è una directory allora \param{newpath}, se esiste, deve
-essere una directory vuota, altrimenti si avranno gli errori \errcode{ENOTDIR}
-(se non è una directory) o \errcode{ENOTEMPTY} (se non è vuota). Chiaramente
-\param{newpath} non può contenere \param{oldpath} altrimenti si avrà un errore
-\errcode{EINVAL}.
-
-Se \param{oldpath} si riferisce ad un link simbolico questo sarà rinominato; se
-\param{newpath} è un link simbolico verrà cancellato come qualunque altro
-file.  Infine qualora \param{oldpath} e \param{newpath} siano due nomi dello
-stesso file lo standard POSIX prevede che la funzione non dia errore, e non
-faccia nulla, lasciando entrambi i nomi; Linux segue questo standard, anche
-se, come fatto notare dal manuale delle \textit{glibc}, il comportamento più
-ragionevole sarebbe quello di cancellare \param{oldpath}.
-
-Il vantaggio nell'uso di questa funzione al posto della chiamata successiva di
-\func{link} e \func{unlink} è che l'operazione è eseguita atomicamente, non
-può esistere cioè nessun istante in cui un altro processo può trovare attivi
-entrambi i nomi dello stesso file, o, in caso di sostituzione di un file
-esistente, non trovare quest'ultimo prima che la sostituzione sia stata
-eseguita.
-
-In ogni caso se \param{newpath} esiste e l'operazione fallisce per un qualche
-motivo (come un crash del kernel), \func{rename} garantisce di lasciare
-presente un'istanza di \param{newpath}. Tuttavia nella sovrascrittura potrà
-esistere una finestra in cui sia \param{oldpath} che \param{newpath} fanno
-riferimento allo stesso file.
-
-
-\subsection{I link simbolici}
-\label{sec:file_symlink}
-
-Come abbiamo visto in sez.~\ref{sec:file_link} la funzione \func{link} crea
-riferimenti agli \itindex{inode} \textit{inode}, pertanto può funzionare
-soltanto per file che 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.
-
-Per ovviare a queste limitazioni i sistemi Unix supportano un'altra forma di
-link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
-come avviene in altri sistemi operativi, dei file speciali che contengono
-semplicemente il riferimento ad un altro file (o directory). In questo modo è
-possibile effettuare link anche attraverso filesystem diversi, a file posti in
-filesystem che non supportano i link diretti, a delle directory, ed anche a
-file che non esistono ancora.
-
-Il sistema funziona in quanto i link simbolici sono riconosciuti come tali dal
-kernel\footnote{è uno dei diversi tipi di file visti in
-  tab.~\ref{tab:file_file_types}, contrassegnato come tale
-  nell'\textit{inode}, e riconoscibile dal valore del campo \var{st\_mode}
-  della struttura \struct{stat} (vedi sez.~\ref{sec:file_stat}).}  per cui
-alcune funzioni di libreria (come \func{open} o \func{stat}) quando ricevono
-come argomento un link simbolico vengono automaticamente applicate al file da
-esso specificato.  La funzione che permette di creare un nuovo link simbolico
-è \funcd{symlink}, ed il suo prototipo è:
-\begin{prototype}{unistd.h}
-  {int symlink(const char *oldpath, const char *newpath)} 
-  Crea un nuovo link simbolico di nome \param{newpath} il cui contenuto è
-  \param{oldpath}.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso la variabile \var{errno} assumerà i valori:
+\begin{funcproto}{ 
+\fhead{unistd.h}
+\fdecl{int symlink(const char *oldpath, const char *newpath)}
+\fdesc{Crea un nuovo collegamento simbolico (\textit{symbolic link}).} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EPERM}] il filesystem che contiene \param{newpath} non
-    supporta i link simbolici.
+  \item[\errcode{EEXIST}] esiste già un file \param{newpath}.
   \item[\errcode{ENOENT}] una componente di \param{newpath} non esiste o
     \param{oldpath} è una stringa vuota.
-  \item[\errcode{EEXIST}] esiste già un file \param{newpath}.
+  \item[\errcode{EPERM}] il filesystem che contiene \param{newpath} non
+    supporta i collegamenti simbolici.
   \item[\errcode{EROFS}] \param{newpath} è su un filesystem montato in sola
     lettura.
-  \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{EACCES}, \errval{ENAMETOOLONG},
-  \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{ENOSPC} e
-  \errval{EIO}.}
-\end{prototype}
+  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
+  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOMEM}, \errval{ENOSPC} e
+  \errval{ENOTDIR} nel loro significato generico.}
+\end{funcproto}
 
-Si tenga presente che la funzione non effettua nessun controllo sull'esistenza
-di un file di nome \param{oldpath}, ma si limita ad inserire quella stringa
-nel link simbolico. Pertanto un link simbolico può anche riferirsi ad un file
-che non esiste: in questo caso si ha quello che viene chiamato un
-\textit{dangling link}, letteralmente un \textsl{link ciondolante}.
-
-Come accennato i link simbolici sono risolti automaticamente dal kernel
-all'invocazione delle varie system call; in tab.~\ref{tab:file_symb_effect} si
-è riportato un elenco dei comportamenti delle varie funzioni di libreria che
-operano sui file nei confronti della risoluzione dei link simbolici,
-specificando quali seguono il link simbolico e quali invece possono operare
-direttamente sul suo contenuto.
+La funzione crea un nuovo collegamento simbolico \param{newpath} che fa
+riferimento ad \param{oldpath}.  Si tenga presente che la funzione non
+effettua nessun controllo sull'esistenza di un file di nome \param{oldpath},
+ma si limita ad inserire il \textit{pathname} nel collegamento
+simbolico. Pertanto un collegamento simbolico può anche riferirsi ad un file
+che non esiste ed in questo caso si ha quello che viene chiamato un
+\itindex{dangling~link} \textit{dangling link}, letteralmente un
+\index{collegamento!ciondolante} ``\textsl{collegamento ciondolante}''.
+
+Come accennato i collegamenti simbolici sono risolti automaticamente dal
+kernel all'invocazione delle varie \textit{system call}. In
+tab.~\ref{tab:file_symb_effect} si è riportato un elenco dei comportamenti
+delle varie funzioni di sistema che operano sui file nei confronti della
+risoluzione dei collegamenti simbolici, specificando quali li seguono e quali
+invece possono operare direttamente sui loro contenuti.
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -1595,122 +1533,372 @@ direttamente sul suo contenuto.
     \func{unlink}   & --        & $\bullet$ \\
     \hline 
   \end{tabular}
-  \caption{Uso dei link simbolici da parte di alcune funzioni.}
+  \caption{Uso dei collegamenti simbolici da parte di alcune funzioni.}
   \label{tab:file_symb_effect}
 \end{table}
 
 \footnotetext{a partire dalla serie 2.0, e contrariamente a quanto indicato
-  dallo standard POSIX, si veda quanto detto in sez.~\ref{sec:file_link}.}
+  dallo standard POSIX.1-2001.}
 
 Si noti che non si è specificato il comportamento delle funzioni che operano
-con i file descriptor, in quanto la risoluzione del link simbolico viene in
-genere effettuata dalla funzione che restituisce il file descriptor
-(normalmente la \func{open}, vedi sez.~\ref{sec:file_open}) e tutte le
-operazioni seguenti fanno riferimento solo a quest'ultimo.
+con i file descriptor (che tratteremo nel prossimo capitolo), in quanto la
+risoluzione del collegamento simbolico viene in genere effettuata dalla
+funzione che restituisce il file descriptor (normalmente la \func{open}, vedi
+sez.~\ref{sec:file_open}) e tutte le operazioni seguenti fanno riferimento
+solo a quest'ultimo.
 
 Dato che, come indicato in tab.~\ref{tab:file_symb_effect}, funzioni come la
-\func{open} seguono i link simbolici, occorrono funzioni apposite per accedere
-alle informazioni del link invece che a quelle del file a cui esso fa
-riferimento. Quando si vuole leggere il contenuto di un link simbolico si usa
-la funzione \funcd{readlink}, il cui prototipo è:
-\begin{prototype}{unistd.h}
-{int readlink(const char *path, char *buff, size\_t size)} 
-  Legge il contenuto del link simbolico indicato da \param{path} nel buffer
-  \param{buff} di dimensione \param{size}.
-  
-  \bodydesc{La funzione restituisce il numero di caratteri letti dentro
-    \param{buff} o -1 per un errore, nel qual caso la variabile
-    \var{errno} assumerà i valori:
+\func{open} seguono i collegamenti simbolici, occorrono funzioni apposite per
+accedere alle informazioni del collegamento invece che a quelle del file a cui
+esso fa riferimento. Quando si vuole leggere il contenuto di un collegamento
+simbolico si usa la funzione di sistema \funcd{readlink}, il cui prototipo è:
+
+\begin{funcproto}{ 
+\fhead{unistd.h}
+\fdecl{int readlink(const char *path, char *buff, size\_t size)}
+\fdesc{Legge il contenuto di un collegamento simbolico.} 
+}
+{La funzione ritorna il numero di caratteri letti dentro \param{buff} in caso
+  di successo e $-1$ per un errore,  nel qual caso \var{errno} assumerà uno
+  dei valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] \param{path} non è un link simbolico o \param{size}
-    non è positiva.
-  \end{errlist}
-  ed inoltre \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{EACCES}, \errval{ELOOP}, \errval{EIO}, \errval{EFAULT} e
-  \errval{ENOMEM}.}
-\end{prototype}
+  \item[\errcode{EINVAL}] \param{path} non è un collegamento simbolico
+    o \param{size} non è positiva.
+  \end{errlist} ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EIO},
+  \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM} e
+  \errval{ENOTDIR} nel loro significato generico.}
+\end{funcproto}
 
-La funzione apre il link simbolico, ne legge il contenuto, lo scrive nel
-buffer, e lo richiude. Si tenga presente che la funzione non termina la
-stringa con un carattere nullo e la tronca alla dimensione specificata da
-\param{size} per evitare di sovrascrivere oltre le dimensioni del buffer.
+La funzione legge il \textit{pathname} a cui fa riferimento il collegamento
+simbolico indicato dall'argomento \param{path} scrivendolo sul
+buffer \param{buff} di dimensione \param{size}. Si tenga presente che la
+funzione non termina la stringa con un carattere nullo e che se questa è
+troppo lunga la tronca alla dimensione specificata da \param{size} per evitare
+di sovrascrivere oltre le dimensioni del buffer.
 
 \begin{figure}[htb]
   \centering
   \includegraphics[width=8.5cm]{img/link_loop}
-  \caption{Esempio di loop nel filesystem creato con un link simbolico.}
+  \caption{Esempio di loop nel filesystem creato con un collegamento
+    simbolico.}
   \label{fig:file_link_loop}
 \end{figure}
 
-Un caso comune che si può avere con i link simbolici è la creazione dei
-cosiddetti \textit{loop}. La situazione è illustrata in
-fig.~\ref{fig:file_link_loop}, che riporta la struttura della directory
-\file{/boot}. Come si vede si è creato al suo interno un link simbolico che
-punta di nuovo a \file{/boot}.\footnote{il loop mostrato in
-  fig.~\ref{fig:file_link_loop} è un usato per poter permettere a \cmd{grub}
-  (un bootloader in grado di leggere direttamente da vari filesystem il file
-  da lanciare come sistema operativo) di vedere i file contenuti nella
-  directory \file{/boot} con lo stesso \textit{pathname} con cui verrebbero
-  visti dal sistema operativo, anche se essi si trovano, come accade spesso,
-  su una partizione separata (che \cmd{grub}, all'avvio, vede come radice).}
-
-Questo può causare problemi per tutti quei programmi che effettuano la
-scansione di una directory senza tener conto dei link simbolici, ad esempio se
-lanciassimo un comando del tipo \code{grep -r linux *}, il loop nella
-directory porterebbe il comando ad esaminare \file{/boot}, \file{/boot/boot},
-\file{/boot/boot/boot} e così via.
+Come accennato uno dei motivi per cui non sono consentiti \textit{hard link}
+alle directory è che questi possono creare dei \textit{loop} nella risoluzione
+dei nomi che non possono essere eliminati facilmente. Invece è sempre
+possibile, ed in genere anche molto utile, creare un collegamento simbolico ad
+una directory, anche se in questo caso si potranno ottenere anche dei
+\textit{loop}. La situazione è illustrata in fig.~\ref{fig:file_link_loop},
+che riporta la struttura della directory \file{/boot}. Come si vede si è
+creato al suo interno un collegamento simbolico che punta di nuovo a
+\file{/boot}.\footnote{il \textit{loop} mostrato in
+  fig.~\ref{fig:file_link_loop} è stato usato per poter permettere a
+  \cmd{grub} (un bootloader in grado di leggere direttamente da vari
+  filesystem il file da lanciare come sistema operativo) di vedere i file
+  contenuti nella directory \file{/boot} con lo stesso \textit{pathname} con
+  cui verrebbero visti dal sistema operativo, anche se essi si trovano, come
+  accade spesso, su una partizione separata (che \cmd{grub} all'avvio vedrebbe 
+  come \file{/}).}
+
+Questo però può causare problemi per tutti quei programmi che effettuano la
+scansione di una directory senza tener conto dei collegamenti simbolici, ad
+esempio se lanciassimo un comando del tipo \code{grep -r linux *}, il loop
+nella directory porterebbe il comando ad esaminare \file{/boot},
+\file{/boot/boot}, \file{/boot/boot/boot} e così via.
 
 Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
-un \itindex{pathname} \textit{pathname} possano essere seguiti un numero
-limitato di link simbolici, il cui valore limite è specificato dalla costante
+un \textit{pathname} possano essere seguiti fino ad un certo numero massimo di
+collegamenti simbolici, il cui valore limite è specificato dalla costante
 \const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
-errore ed \var{errno} viene impostata al valore \errcode{ELOOP}.
+errore ed \var{errno} viene impostata al valore \errcode{ELOOP}, che nella
+quasi totalità dei casi indica appunto che si è creato un collegamento
+simbolico che fa riferimento ad una directory del suo stesso
+\textit{pathname}.
 
-Un punto da tenere sempre presente è che, come abbiamo accennato, un link
-simbolico può fare riferimento anche ad un file che non esiste; ad esempio
-possiamo creare un file temporaneo nella nostra directory con un link del
-tipo:
-\begin{verbatim}
-$ ln -s /tmp/tmp_file temporaneo
-\end{verbatim}%$
-anche se \file{/tmp/tmp\_file} non esiste. Questo può generare confusione, in
-quanto aprendo in scrittura \file{temporaneo} verrà creato
-\file{/tmp/tmp\_file} e scritto; ma accedendo in sola lettura a
-\file{temporaneo}, ad esempio con \cmd{cat}, otterremmo:
-\begin{verbatim}
-$ cat temporaneo
-cat: temporaneo: No such file or directory
-\end{verbatim}%$
-con un errore che può sembrare sbagliato, dato che un'ispezione con \cmd{ls}
-ci mostrerebbe invece l'esistenza di \file{temporaneo}.
+Un altro punto da tenere sempre presente è che, come abbiamo accennato, un
+collegamento simbolico può fare riferimento anche ad un file che non esiste;
+ad esempio possiamo usare il comando \cmd{ln} per creare un collegamento
+simbolico nella nostra directory con:
+\begin{Command}
+$ ln -s /tmp/tmp_file symlink
+\end{Command}
+%$
+e questo avrà successo anche se \file{/tmp/tmp\_file} non esiste:
+\begin{Command}
+$ ls symlink
+\end{Command}
+\begin{Terminal}
+symlink
+\end{Terminal}
+%$
+ma questo può generare confusione, perché accedendo in sola lettura a
+\file{symlink}, ad esempio con \cmd{cat}, otterremmo un errore:
+\begin{Command}
+$ cat symlink
+\end{Command}
+\begin{Terminal}
+cat: symlink: No such file or directory
+\end{Terminal}
+%$
+con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato
+l'esistenza di \file{symlink}, se invece scrivessimo su \file{symlink}
+otterremmo la creazione di \file{/tmp/tmp\_file} senza errori.
+
+
+\itindend{symbolic~link}
+\index{collegamento!simbolico|)}
+
+
+Un'altra funzione relativa alla gestione dei nomi dei file, anche se a prima
+vista parrebbe riguardare un argomento completamente diverso, è quella che per
+la cancellazione di un file. In realtà una \textit{system call} che serva
+proprio a cancellare un file non esiste neanche perché, come accennato in
+sez.~\ref{sec:file_filesystem}, quando in un sistema unix-like si richiede la
+rimozione di un file quella che si va a cancellare è soltanto la voce che
+referenzia il suo \textit{inode} all'interno di una directory.
+
+La funzione di sistema che consente di effettuare questa operazione, il cui
+nome come si può notare ha poco a che fare con il concetto di rimozione, è
+\funcd{unlink}, ed il suo prototipo è:
+
+\begin{funcproto}{ 
+\fhead{unistd.h}
+\fdecl{int unlink(const char *pathname)}
+\fdesc{Cancella un file.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori:\footnotemark  
+  \begin{errlist}
+  \item[\errcode{EACCES}] non si ha il permesso di scrivere sulla directory
+    contenente \param{pathname} o di attraversamento di una delle directory
+    superiori. 
+  \item[\errcode{EISDIR}] \param{pathname} si riferisce ad una
+    directory.
+  \item[\errcode{EPERM}] il filesystem non consente l'operazione, o la
+    directory che contiene \param{pathname} ha lo \itindex{sticky~bit}
+    \textit{sticky bit} e non si è il proprietario o non si hanno privilegi
+    amministrativi. 
+  \end{errlist} ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EROFS} nel loro
+  significato generico.}
+\end{funcproto}
+
+\footnotetext{questa funzione su Linux ha alcune peculiarità nei codici di
+  errore, in particolare riguardo la rimozione delle directory che non è mai
+  permessa e che causa l'errore \errcode{EISDIR}; questo è un valore specifico
+  di Linux non conforme allo standard POSIX che prescrive invece l'uso di
+  \errcode{EPERM} in caso l'operazione non sia consentita o il processo non
+  abbia privilegi sufficienti, valore che invece Linux usa anche se il
+  filesystem non supporta la funzione, inoltre il codice \errcode{EBUSY} nel
+  caso la directory sia occupata su Linux non esiste.}
+
+La funzione elimina il nome specificato dall'argomento \param{pathname} nella
+directory che lo contiene e decrementa il numero di riferimenti nel relativo
+\itindex{inode} \textit{inode}.\footnote{come per \func{link} queste due
+  operazioni sono effettuate all'interno della \textit{system call} in maniera
+  atomica.} Nel caso di socket, fifo o file di dispositivo
+\index{file!di~dispositivo} rimuove il nome, ma come per i file normali i
+processi che hanno aperto uno di questi oggetti possono continuare ad
+utilizzarli.  Nel caso di cancellazione di un collegamento simbolico, che
+consiste solo nel rimando ad un altro file, questo viene immediatamente
+eliminato.
+
+Per cancellare una voce in una directory è necessario avere il permesso di
+scrittura su di essa, dato che si va a rimuovere una voce dal suo contenuto, e
+il diritto di esecuzione/attraversamento sulla directory che la contiene
+(affronteremo in dettaglio l'argomento dei permessi di file e directory in
+sez.~\ref{sec:file_access_control}). Se inoltre lo \itindex{sticky~bit}
+\textit{sticky bit} (vedi sez.~\ref{sec:file_special_perm}) è impostato
+occorrerà anche essere proprietari del file o proprietari della directory o
+avere i privilegi di amministratore.
+
+Si ricordi inoltre che anche se se ne è rimosso il nome da una directory, un
+file non viene eliminato dal disco fintanto che tutti i riferimenti ad esso
+sono stati cancellati: solo quando il numero di collegamenti mantenuto
+\itindex{inode} nell'\textit{inode} diventa nullo, questo viene disallocato e
+lo spazio occupato su disco viene liberato. Si tenga presente comunque che a
+questo si aggiunge sempre un'ulteriore condizione e cioè che non ci siano
+processi che abbiano il suddetto file aperto.\footnote{come vedremo in
+  cap.~\ref{cha:file_unix_interface} il kernel mantiene anche una tabella dei
+  file aperti nei vari processi, che a sua volta contiene i riferimenti agli
+  \itindex{inode} \textit{inode} ad essi relativi; prima di procedere alla
+  cancellazione dello spazio occupato su disco dal contenuto di un file il
+  kernel controlla anche questa tabella, per verificare che anche in essa non
+  ci sia più nessun riferimento all'\textit{inode} in questione.}
+
+Questa caratteristica del sistema può essere usata per essere sicuri di non
+lasciare file temporanei su disco in caso di crash di un programma. La tecnica
+è quella di aprire un nuovo file e chiamare \func{unlink} su di esso subito
+dopo, in questo modo il contenuto del file sarà sempre disponibile all'interno
+del processo attraverso il suo file descriptor (vedi sez.~\ref{sec:file_fd}),
+ma non ne resta traccia in nessuna directory, e lo spazio occupato su disco
+viene immediatamente rilasciato alla conclusione del processo, quando tutti i
+file vengono chiusi.
+
+Al contrario di quanto avviene con altri Unix, in Linux non è possibile usare
+la funzione \func{unlink} sulle directory, nel qual caso si otterrebbe un
+errore di \errcode{EISDIR}. Per cancellare una directory si deve usare la
+apposita funzione di sistema \func{rmdir} (che vedremo in
+sez.~\ref{sec:file_dir_creat_rem}), oppure la funzione \func{remove}.
+Quest'ultima è la funzione prevista dallo standard ANSI C per effettuare una
+cancellazione generica di un file o di una directory e funziona anche per i
+sistemi operativo che non supportano gli \textit{hard link}. Nei sistemi
+unix-like \funcd{remove} è equivalente ad usare in maniera trasparente
+\func{unlink} per i file ed \func{rmdir} per le directory; il suo prototipo è:
+
+\begin{funcproto}{ 
+\fhead{stdio.h}
+\fdecl{int remove(const char *pathname)}
+\fdesc{Cancella un file o una directory.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori relativi alla chiamata utilizzata,
+  pertanto si può fare riferimento a quanto illustrato nelle descrizioni di
+  \func{unlink} e \func{rmdir}.}
+\end{funcproto}
+
+La funzione utilizza la funzione \func{unlink} per cancellare i file e la
+funzione \func{rmdir} (vedi sez.~\ref{sec:file_dir_creat_rem}) per cancellare
+le directory.\footnote{questo vale usando la \acr{glibc}; nella libc4 e nella
+  libc5 la funzione \func{remove} era un semplice alias alla funzione
+  \func{unlink} e quindi non poteva essere usata per le directory.} Si tenga
+presente che per alcune implementazioni del protocollo NFS utilizzare questa
+funzione può comportare la scomparsa di file ancora in uso.
+
+Infine per cambiare nome ad un file o a una directory si usa la funzione di
+sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
+  ma si applica solo per i file, lo standard POSIX estende la funzione anche
+  alle directory.} il cui prototipo è:
+
+\begin{funcproto}{ 
+\fhead{stdio.h}
+\fdecl{int rename(const char *oldpath, const char *newpath)}
+\fdesc{Rinomina un file o una directory.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
+  \item[\errcode{EACCESS}] non c'è permesso di scrivere nelle directory
+    contenenti \param{oldpath} e \param{newpath} o di attraversare 
+    quelle dei loro \textit{pathname} o di scrivere su \param{newpath}
+    se questa è una directory.
+  \item[\errcode{EBUSY}] o \param{oldpath} o \param{newpath} sono in uso da
+    parte di qualche processo (come \index{directory~di~lavoro} directory di
+    lavoro o come radice) o del sistema (come \itindex{mount~point}
+    \textit{mount point}) ed il sistema non riesce a risolvere la situazione.
+  \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di
+    \param{oldpath} o più in generale si è cercato di creare una directory come
+    sotto-directory di sé stessa.
+  \item[\errcode{EISDIR}] \param{newpath} è una directory mentre
+    \param{oldpath} non è una directory.
+  \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
+    non è vuota (anche \errcode{ENOTEMPTY}).
+  \item[\errcode{ENOTDIR}] uno dei componenti dei \textit{pathname} non è una
+    directory o \param{oldpath} è una directory e 
+    \param{newpath} esiste e non è una directory.
+  \item[\errval{EPERM}] la directory contenente \param{oldpath} o quella
+    contenente un \param{newpath} esistente hanno lo
+    \itindex{sticky~bit} \textit{sticky bit} e non si è i proprietari dei
+    rispettivi file (o non si hanno privilegi amministrativi) oppure il
+    filesystem non supporta l'operazione. 
+  \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo
+    stesso filesystem e sotto lo stesso \itindex{mount~point} \textit{mount
+      point}. 
+  \end{errlist} ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EMLINK},
+  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOSPC} e
+  \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
+
+La funzione rinomina in \param{newpath} il file o la directory indicati
+dall'argomento \param{oldpath}. Il nome viene eliminato nella directory
+originale e ricreato nella directory di destinazione mantenendo il riferimento
+allo stesso \itindex{inode} \textit{inode}. Non viene spostato nessun dato e
+\itindex{inode} l'\textit{inode} del file non subisce nessuna modifica in
+quanto le modifiche sono eseguite sulle directory che
+contengono \param{newpath} ed \param{oldpath}.
+
+Il vantaggio nell'uso di questa funzione al posto della chiamata successiva di
+\func{link} e \func{unlink} è che l'operazione è eseguita atomicamente, non
+c'è modifica, per quanto temporanea, al \textit{link count} del file e non può
+esistere un istante in cui un altro processo possa trovare attivi entrambi i
+nomi per lo stesso file se la destinazione non esiste o in cui questa sparisca
+temporaneamente se già esiste.
+
+Dato che opera in maniera analoga la funzione è soggetta alle stesse
+restrizioni di \func{link}, quindi è necessario che \param{oldpath}
+e \param{newpath} siano nello stesso filesystem e facciano riferimento allo
+stesso \itindex{mount~point} \textit{mount point}, e che il filesystem
+supporti questo tipo di operazione. Qualora questo non avvenga si dovrà
+effettuare l'operazione in maniera non atomica copiando il file a destinazione
+e poi cancellando l'originale.
+
+Il comportamento della funzione è diverso a seconda che si voglia rinominare
+un file o una directory. Se ci riferisce ad un file allora \param{newpath}, se
+esiste, non deve essere una directory, altrimenti si avrà un errore di
+\errcode{EISDIR}. Se \param{newpath} indica un file già esistente questo verrà
+rimpiazzato atomicamente, ma nel caso in cui \func{rename} fallisca il kernel
+assicura che esso non sarà toccato. I caso di sovrascrittura però potrà
+esistere una breve finestra di tempo in cui sia \param{oldpath}
+che \param{newpath} potranno fare entrambi riferimento al file che viene
+rinominato.
+
+Se \param{oldpath} è una directory allora \param{newpath}, se esistente, deve
+essere una directory vuota, altrimenti si avranno gli errori \errcode{ENOTDIR}
+(se non è una directory) o \errcode{ENOTEMPTY} o \errcode{EEXIST} (se non è
+vuota). Chiaramente \param{newpath} non potrà contenere \param{oldpath} nel
+suo \textit{pathname}, non essendo possibile rendere una directory una
+sottodirectory di sé stessa, se questo fosse il caso si otterrebbe un errore
+di \errcode{EINVAL}.
+
+Se \param{oldpath} si riferisce ad un collegamento simbolico questo sarà
+rinominato restando tale senza nessun effetto sul file a cui fa riferimento.
+Se invece \param{newpath} esiste ed è un collegamento simbolico verrà
+cancellato come qualunque altro file.  Infine qualora \param{oldpath}
+e \param{newpath} siano due nomi che già fanno riferimento allo stesso file lo
+standard POSIX prevede che la funzione non ritorni un errore, e semplicemente
+non faccia nulla, lasciando entrambi i nomi.  Linux segue questo standard,
+anche se, come fatto notare dal manuale della \acr{glibc}, il comportamento
+più ragionevole sarebbe quello di cancellare \param{oldpath}.
+
+In tutti i casi si dovranno avere i permessi di scrittura nelle directory
+contenenti \param{oldpath} e \param{newpath}, e nel caso \param{newpath} sia
+una directory vuota già esistente anche su di essa (perché dovrà essere
+aggiornata la voce ``\texttt{..}''). Se poi le directory
+contenenti \param{oldpath} o \param{newpath} hanno lo \itindex{sticky~bit}
+\textit{sticky bit} attivo (vedi sez.~\ref{sec:file_special_perm}) si dovrà
+essere i proprietari dei file (o delle directory) che si vogliono rinominare,
+o avere i permessi di amministratore.
 
 
 \subsection{La creazione e la cancellazione delle directory} 
 \label{sec:file_dir_creat_rem}
 
 Benché in sostanza le directory non siano altro che dei file contenenti
-elenchi di nomi ed \itindex{inode} \textit{inode}, non è possibile trattarle
-come file ordinari e devono essere create direttamente dal kernel attraverso
-una opportuna system call.\footnote{questo è quello che permette anche,
-  attraverso l'uso del VFS, l'utilizzo di diversi formati per la gestione dei
-  suddetti elenchi, dalle semplici liste a strutture complesse come alberi
-  binari, hash, ecc. che consentono una ricerca veloce quando il numero di
-  file è molto grande.}  La funzione usata per creare una directory è
-\funcd{mkdir}, ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/stat.h}
-  \headdecl{sys/types.h}
-  \funcdecl{int mkdir(const char *dirname, mode\_t mode)} 
+elenchi di nomi con riferimenti ai rispettivi \itindex{inode} \textit{inode},
+non è possibile trattarle come file ordinari e devono essere create
+direttamente dal kernel attraverso una opportuna \textit{system
+  call}.\footnote{questo è quello che permette anche, attraverso l'uso del
+  \itindex{Virtual~File~System} VFS, l'utilizzo di diversi formati per la
+  gestione dei suddetti elenchi, dalle semplici liste a strutture complesse
+  come alberi binari, hash, ecc. che consentono una ricerca veloce quando il
+  numero di file è molto grande.}  La funzione di sistema usata per creare una
+directory è \funcd{mkdir}, ed il suo prototipo è:
 
-  Crea una nuova directory.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+\begin{funcproto}{ 
+\fhead{sys/stat.h}
+\fhead{sys/types.h}
+\fdecl{int mkdir(const char *dirname, mode\_t mode)}
+\fdesc{Crea una nuova directory.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di
-    già.
   \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory in
-    cui si vuole inserire la nuova directory.
+    cui si vuole inserire la nuova directory o di attraversamento per le
+    directory al di sopra di essa.
+  \item[\errcode{EEXIST}] un file o una directory o un collegamento simbolico
+    con quel nome esiste già.
   \item[\errcode{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
@@ -1720,239 +1908,80 @@ una opportuna system call.\footnote{questo è quello che permette anche,
   \item[\errcode{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 \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG},
-  \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP},
-  \errval{EROFS}.}
-\end{functions}
+  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EPERM},
+  \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
 La funzione crea una nuova directory vuota, che contiene cioè solo le due voci
-standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con
-il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato
-sia come \itindex{pathname} \textit{pathname} assoluto che come
-\itindex{pathname} \textit{pathname} relativo.
+standard presenti in ogni directory (``\file{.}'' e ``\file{..}''), con il
+nome indicato dall'argomento \param{dirname}. 
 
 I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la
 directory viene creata sono specificati dall'argomento \param{mode}, i cui
 possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si
 tenga presente che questi sono modificati dalla maschera di creazione dei file
 (si veda sez.~\ref{sec:file_perm_management}).  La titolarità della nuova
-directory è impostata secondo quanto riportato in
+directory è impostata secondo quanto illustrato in
 sez.~\ref{sec:file_ownership_management}.
 
-La funzione che permette la cancellazione di una directory è invece
-\funcd{rmdir}, ed il suo prototipo è:
-\begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} 
-  Cancella una directory.
+Come accennato in precedenza per eseguire la cancellazione di una directory è
+necessaria una specifica funzione di sistema, \funcd{rmdir}, il suo prototipo
+è:
 
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà i valori:
+\begin{funcproto}{ 
+\fhead{sys/stat.h}
+\fdecl{int rmdir(const char *dirname)}
+\fdesc{Cancella una directory.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di
-    directory, oppure la directory che contiene \param{dirname} ha lo
-    \itindex{sticky~bit} \textit{sticky bit} impostato e l'\ids{UID} effettivo
-    del processo non corrisponde al proprietario della directory.
   \item[\errcode{EACCES}] 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
     \param{dirname}.
+  \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
+    di \param{dirname}.
   \item[\errcode{EBUSY}] la directory specificata è la
     \index{directory~di~lavoro} directory di lavoro o la radice di qualche
-    processo.
-  \item[\errcode{ENOTEMPTY}] la directory non è vuota.
-  \end{errlist}
-  ed inoltre anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{EROFS}.}
-\end{prototype}
-
-La funzione cancella la directory \param{dirname}, che deve essere vuota (la
-directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e
-``\file{..}'').  Il nome può essere indicato con il \itindex{pathname}
-\textit{pathname} assoluto o relativo.
-
-La modalità con cui avviene la cancellazione è analoga a quella di
-\func{unlink}: fintanto che il numero di link \itindex{inode}
-all'\textit{inode} della directory non diventa nullo e nessun processo ha la
-directory aperta lo spazio occupato su disco non viene rilasciato. Se un
-processo ha la directory aperta la funzione rimuove il link \itindex{inode}
-all'\textit{inode} e nel caso sia l'ultimo, pure le voci standard ``\file{.}''
-e ``\file{..}'', a questo punto il kernel non consentirà di creare più nuovi
-file nella directory.
-
-
-\subsection{La creazione di file speciali}
-\label{sec:file_mknod}
-
-\index{file!di~dispositivo|(} 
-
-Finora abbiamo parlato esclusivamente di file, directory e link simbolici; in
-sez.~\ref{sec:file_file_types} abbiamo visto però che il sistema prevede pure
-degli altri tipi di file speciali, come i file di dispositivo, le fifo ed i
-socket (questi ultimi sono un caso a parte, essendo associati anche alla
-comunicazione via rete, per cui ci saranno trattati in dettaglio a partire da
-cap.~\ref{cha:socket_intro}).
-
-La manipolazione delle caratteristiche di questi diversi tipi di file e la
-loro cancellazione può essere effettuata con le stesse funzioni che operano
-sui file regolari; ma quando li si devono creare sono necessarie delle
-funzioni apposite. La prima di queste funzioni è \funcd{mknod}, il cui
-prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \headdecl{sys/stat.h}
-  \headdecl{fcntl.h}
-  \headdecl{unistd.h}
-  \funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)} 
-  
-  Crea un \textit{inode} del tipo specificato sul filesystem.
-  
-  \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[\errcode{EPERM}] non si hanno privilegi sufficienti a creare
-    l'\texttt{inode}, o il filesystem su cui si è cercato di
-    creare \param{pathname} non supporta l'operazione.
-  \item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una
-    fifo, un socket o un dispositivo.
-  \item[\errcode{EEXIST}] \param{pathname} esiste già o è un link simbolico.
+    processo o un \itindex{mount~point} \textit{mount point}.
+  \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di
+    directory, oppure la directory che contiene \param{dirname} ha lo
+    \itindex{sticky~bit} \textit{sticky bit} impostato e non si è i
+    proprietari della directory o non si hanno privilegi amministrativi. 
   \end{errlist}
-  ed inoltre anche \errval{EFAULT}, \errval{EACCES}, \errval{ENAMETOOLONG},
-  \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP},
-  \errval{ENOSPC}, \errval{EROFS}.}
-\end{functions}
-
-La funzione, come suggerisce il nome, permette di creare un ``\textsl{nodo}''
-sul filesystem, e viene in genere utilizzata per creare i file di dispositivo,
-ma si può usare anche per creare file regolari. L'argomento
-\param{mode} specifica sia il tipo di file che si vuole creare che i relativi
-permessi, secondo i valori riportati in tab.~\ref{tab:file_mode_flags}, che
-vanno combinati con un OR binario. I permessi sono comunque modificati nella
-maniera usuale dal valore di \itindex{umask} \textit{umask} (si veda
-sez.~\ref{sec:file_perm_management}).
-
-Per il tipo di file può essere specificato solo uno fra i seguenti valori:
-\const{S\_IFREG} per un file regolare (che sarà creato vuoto),
-\const{S\_IFBLK} per un dispositivo a blocchi, \const{S\_IFCHR} per un
-dispositivo a caratteri, \const{S\_IFSOCK} per un socket e \const{S\_IFIFO}
-per una fifo;\footnote{con Linux la funzione non può essere usata per creare
-  directory o link simbolici, si dovranno usare le funzioni \func{mkdir} e
-  \func{symlink} a questo dedicate.} un valore diverso comporterà l'errore
-\errcode{EINVAL}.  
-
-Qualora si sia specificato in \param{mode} un file di dispositivo (vale a dire
-o \const{S\_IFBLK} o \const{S\_IFCHR}), il valore di \param{dev} dovrà essere
-usato per indicare a quale dispositivo si fa riferimento, altrimenti il suo
-valore verrà ignorato.  Solo l'amministratore può creare un file di
-dispositivo usando questa funzione (il processo deve avere la
-\itindex{capabilities} \textit{capability} \const{CAP\_MKNOD}), ma in
-Linux\footnote{questo è un comportamento specifico di Linux, la funzione non è
-  prevista dallo standard POSIX.1 originale, mentre è presente in SVr4 e
-  4.4BSD, ma esistono differenze nei comportamenti e nei codici di errore,
-  tanto che questa è stata introdotta in POSIX.1-2001 con una nota che la
-  definisce portabile solo quando viene usata per creare delle fifo, ma
-  comunque deprecata essendo utilizzabile a tale scopo la specifica
-  \func{mkfifo}.} l'uso per la creazione di un file ordinario, di una fifo o
-di un socket è consentito anche agli utenti normali.
-
-I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
-al proprietario e al gruppo del processo che li ha creati, a meno che non si
-sia attivato il bit \acr{sgid} per la directory o sia stata attivata la
-semantica BSD per il filesystem (si veda
-sez.~\ref{sec:file_ownership_management}) in cui si va a creare
-\itindex{inode} l'\textit{inode}.
-
-Nella creazione di un file di dispositivo occorre poi specificare
-correttamente il valore di \param{dev}; questo infatti è di tipo
-\type{dev\_t}, che è un tipo primitivo (vedi
-tab.~\ref{tab:intro_primitive_types}) riservato per indicare un
-\textsl{numero} di dispositivo; il kernel infatti identifica ciascun
-dispositivo con un valore numerico. Originariamente questo era un intero a 16
-bit diviso in due parti di 8 bit chiamate rispettivamente
-\itindex{major~number} \textit{major number} e \itindex{minor~number}
-\textit{minor number}, che sono poi i due numeri mostrati dal comando
-\texttt{ls -l} al posto della dimensione quando lo si esegue su un file di
-dispositivo.
-
-Il \itindex{major~number} \textit{major number} identifica una classe di
-dispositivi (ad esempio la seriale, o i dischi IDE) e serve in sostanza per
-indicare al kernel quale è il modulo che gestisce quella classe di
-dispositivi; per identificare uno specifico dispositivo di quella classe (ad
-esempio una singola porta seriale, o una partizione di un disco) si usa invece
-il \itindex{minor~number} \textit{minor number}. L'elenco aggiornato di questi
-numeri con le relative corrispondenze ai vari dispositivi può essere trovato
-nel file \texttt{Documentation/devices.txt} allegato alla documentazione dei
-sorgenti del kernel.
-
-Data la crescita nel numero di dispositivi supportati, ben presto il limite
-massimo di 256 si è rivelato troppo basso, e nel passaggio dai kernel della
-serie 2.4 alla serie 2.6 è stata aumentata a 32 bit la dimensione del tipo
-\type{dev\_t}, con delle dimensioni passate a 12 bit per il
-\itindex{major~number} \textit{major number} e 20 bit per il
-\itindex{minor~number} \textit{minor number}. La transizione però ha anche
-comportato il passaggio di \type{dev\_t} a \index{tipo!opaco} tipo opaco, e la
-necessità di specificare il numero tramite delle opportune macro, così da non
-avere problemi di compatibilità con eventuali ulteriori estensioni.
-
-Le macro sono definite nel file \headfile{sys/sysmacros.h}, che viene
-automaticamente incluso quando si include \headfile{sys/types.h}; si possono
-pertanto ottenere i valori del \itindex{major~number} \textit{major number} e
-\itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente
-con le macro \macro{major} e \macro{minor}:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \funcdecl{int \macro{major}(dev\_t dev)}
-  Restituisce il \itindex{major~number} \textit{major number} del dispositivo
-  \param{dev}.
-  
-  \funcdecl{int \macro{minor}(dev\_t dev)}
-  Restituisce il \itindex{minor~number} \textit{minor number} del dispositivo
-  \param{dev}.
-\end{functions}
-\noindent mentre una volta che siano noti \itindex{major~number} \textit{major
-  number} e \itindex{minor~number} \textit{minor number} si potrà costruire il
-relativo identificativo con la macro \macro{makedev}:
-\begin{functions}
-  \headdecl{sys/types.h}
-  \funcdecl{dev\_t \macro{minor}(int major, int minor)}
+  ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errcode{ENOTEMPTY} e
+  \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
-  Restituisce l'identificativo di un dispositivo dati \itindex{major~number}
-  \textit{major number} e \itindex{minor~number} \textit{minor number}.
-\end{functions}
 
-\index{file!di~dispositivo|)}
+La funzione cancella la directory \param{dirname}, che deve essere vuota, la
+directory deve cioè contenere le due voci standard ``\file{.}'' e
+``\file{..}'' e niente altro.  Il nome può essere indicato con un
+\textit{pathname} assoluto o relativo, ma si deve fare riferimento al nome
+nella directory genitrice, questo significa che \textit{pathname} terminanti
+in ``\file{.}'' e ``\file{..}'' anche se validi in altri contesti, causeranno
+il fallimento della funzione.
 
-Infine con lo standard POSIX.1-2001 è stata introdotta una funzione specifica
-per creare una fifo (tratteremo le fifo in in sez.~\ref{sec:ipc_named_pipe});
-la funzione è \funcd{mkfifo} ed il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{sys/stat.h} 
-  
-  \funcdecl{int mkfifo(const char *pathname, mode\_t mode)} 
-  
-  Crea una fifo.
-  
-  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, nel qual caso \var{errno} assumerà i valori \errval{EACCES},
-    \errval{EEXIST}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOSPC},
-    \errval{ENOTDIR} e \errval{EROFS}.}
-\end{functions}
-
-La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come
-per \func{mknod} il file \param{pathname} non deve esistere (neanche come link
-simbolico); al solito i permessi specificati da \param{mode} vengono
-modificati dal valore di \itindex{umask} \textit{umask}.
+Se la directory cancellata risultasse aperta in qualche processo per una
+lettura dei suoi contenuti (vedi sez.~\ref{sec:file_dir_read}), pur
+scomparendo dal filesystem e non essendo più possibile accedervi o crearvi
+altri file, le risorse ad essa associate verrebbero disallocate solo alla
+chiusura di tutti questi ulteriori riferimenti.
 
 
-
-\subsection{Accesso alle directory}
+\subsection{Lettura e scansione delle directory}
 \label{sec:file_dir_read}
 
 Benché le directory alla fine non siano altro che dei file che contengono
-delle liste di nomi ed \itindex{inode} \textit{inode}, per il ruolo che
-rivestono nella struttura del sistema, non possono essere trattate come dei
-normali file di dati. Ad esempio, onde evitare inconsistenze all'interno del
-filesystem, solo il kernel può scrivere il contenuto di una directory, e non
-può essere un processo a inserirvi direttamente delle voci con le usuali
-funzioni di scrittura.
+delle liste di nomi associati ai relativi \itindex{inode} \textit{inode}, per
+il ruolo che rivestono nella struttura del sistema non possono essere trattate
+come dei normali file di dati. Ad esempio, onde evitare inconsistenze
+all'interno del filesystem, solo il kernel può scrivere il contenuto di una
+directory, e non può essere un processo a inserirvi direttamente delle voci
+con le usuali funzioni di scrittura.
 
 Ma se la scrittura e l'aggiornamento dei dati delle directory è compito del
 kernel, sono molte le situazioni in cui i processi necessitano di poterne
@@ -1960,62 +1989,74 @@ leggere il contenuto. Benché questo possa essere fatto direttamente (vedremo
 in sez.~\ref{sec:file_open} che è possibile aprire una directory come se fosse
 un file, anche se solo in sola lettura) in generale il formato con cui esse
 sono scritte può dipendere dal tipo di filesystem, tanto che, come riportato
-in tab.~\ref{tab:file_file_operations}, il VFS del kernel prevede una apposita
-funzione per la lettura delle directory.
+in tab.~\ref{tab:file_file_operations}, il \itindex{Virtual~File~System} VFS
+prevede una apposita funzione per la lettura delle directory.
+
+\itindbeg{directory~stream}
 
 Tutto questo si riflette nello standard POSIX\footnote{le funzioni erano
   presenti in SVr4 e 4.3BSD, la loro specifica è riportata in POSIX.1-2001.}
 che ha introdotto una apposita interfaccia per la lettura delle directory,
-basata sui cosiddetti \textit{directory stream} (chiamati così per l'analogia
-con i file stream dell'interfaccia standard ANSI C di
-cap.~\ref{cha:files_std_interface}). La prima funzione di questa interfaccia è
+basata sui cosiddetti \textit{directory stream}chiamati così per l'analogia
+con i \textit{file stream} dell'interfaccia standard ANSI C che vedremo in
+cap.~\ref{cha:files_std_interface}. La prima funzione di questa interfaccia è
 \funcd{opendir}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{DIR * opendir(const char *dirname)} 
-  
-  Apre un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce un puntatore al \textit{directory stream}
-    in caso di successo e \val{NULL} per un errore, nel qual caso \var{errno}
-    assumerà i valori \errval{EACCES}, \errval{EMFILE}, \errval{ENFILE},
-    \errval{ENOENT}, \errval{ENOMEM} e \errval{ENOTDIR}.}
-\end{functions}
+
+\begin{funcproto}{ 
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{DIR *opendir(const char *dirname)}
+\fdesc{Apre un \textit{directory stream}.} 
+}
+{La funzione ritorna un puntatore al \textit{directory stream} in caso di
+  successo e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori \errval{EACCES}, \errval{EMFILE}, \errval{ENFILE},
+  \errval{ENOENT}, \errval{ENOMEM} e \errval{ENOTDIR} nel loro significato
+  generico.}
+\end{funcproto}
 
 La funzione apre un \textit{directory stream} per la directory
 \param{dirname}, ritornando il puntatore ad un oggetto di tipo \type{DIR} (che
 è il \index{tipo!opaco} tipo opaco usato dalle librerie per gestire i
 \textit{directory stream}) da usare per tutte le operazioni successive, la
-funzione inoltre posiziona lo stream sulla prima voce contenuta nella
-directory. 
+funzione inoltre posiziona lo \textit{stream} sulla prima voce contenuta nella
+directory.
 
 Si tenga presente che comunque la funzione opera associando il
 \textit{directory stream} ad un opportuno file descriptor sottostante, sul
 quale vengono compiute le operazioni. Questo viene sempre aperto impostando il
-flag di \itindex{close-on-exec} \textit{close-on-exec}, così da evitare che
-resti aperto in caso di esecuzione di un altro programma.
+flag di \itindex{close-on-exec} \textit{close-on-exec} (si ricordi quanto
+detto in sez.~\ref{sec:proc_exec}), così da evitare che resti aperto in caso
+di esecuzione di un altro programma.
 
 Nel caso in cui sia necessario conoscere il \textit{file descriptor} associato
 ad un \textit{directory stream} si può usare la funzione
 \funcd{dirfd},\footnote{questa funzione è una estensione introdotta con BSD
   4.3-Reno ed è presente in Linux con le libc5 (a partire dalla versione
-  5.1.2) e con le \acr{glibc} ma non presente in POSIX fino alla revisione
+  5.1.2) e con la \acr{glibc} ma non presente in POSIX fino alla revisione
   POSIX.1-2008, per questo per poterla utilizzare fino alla versione 2.10
-  delle \acr{glibc} era necessario definire le macro \macro{\_BSD\_SOURCE} o
+  della \acr{glibc} era necessario definire le macro \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}, dalla versione 2.10 si possono usare anche
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o
   \texttt{\macro{\_XOPEN\_SOURCE} >= 700}.}  il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{int dirfd(DIR * dir)} 
-  
-  Restituisce il file descriptor associato ad un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce il file descriptor (un valore positivo) in
-    caso di successo e -1 in caso di errore.}
-\end{functions}
+
+\begin{funcproto}{ 
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{int dirfd(DIR *dir)}
+\fdesc{Legge il file descriptor associato ad un \textit{directory stream}.} 
+}
+{La funzione ritorna un valore positivo corrispondente al file descriptor in
+  caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
+  uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{dir} non è un puntatore ad un
+    \textit{directory stream}. 
+  \item[\errcode{ENOTSUP}] l'implementazione non supporta l'uso di un file
+    descriptor per la directory.
+  \end{errlist}
+}
+\end{funcproto}
 
 La funzione restituisce il file descriptor associato al \textit{directory
   stream} \param{dir}. Di solito si utilizza questa funzione in abbinamento a
@@ -2027,23 +2068,23 @@ sez.~\ref{sec:file_work_dir}).
 Viceversa se si è aperto un file descriptor corrispondente ad una directory è
 possibile associarvi un \textit{directory stream} con la funzione
 \funcd{fdopendir},\footnote{questa funzione è però disponibile solo a partire
-  dalla versione 2.4 delle \acr{glibc}, ed è stata introdotta nello standard
+  dalla versione 2.4 della \acr{glibc}, ed è stata introdotta nello standard
   POSIX solo a partire dalla revisione POSIX.1-2008, prima della versione 2.10
-  delle \acr{glibc} per poterla utilizzare era necessario definire la macro
+  della \acr{glibc} per poterla utilizzare era necessario definire la macro
   \macro{\_GNU\_SOURCE}, dalla versione 2.10 si possono usare anche
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o \texttt{\_XOPEN\_SOURCE >=
     700} .}  il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h}
-  
-  \funcdecl{DIR * fdopendir(int fd)} 
-  
-  Associa un \textit{directory stream} al file descriptor \param{fd}.
-  
-  \bodydesc{La funzione restituisce un puntatore al \textit{directory stream}
-    in caso di successo e \val{NULL} per un errore, nel qual caso \var{errno}
-    assumerà il valore \errval{EBADF}.}
-\end{functions}
+
+\begin{funcproto}{ 
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{DIR *fdopendir(int fd)}
+\fdesc{Associa un \textit{directory stream} ad un file descriptor.} 
+}
+{La funzione ritorna un puntatore al \textit{directory stream} in caso di
+  successo e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+  dei valori \errval{EBADF} o \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
 
 La funzione è identica a \func{opendir}, ma ritorna un \textit{directory
   stream} facendo riferimento ad un file descriptor \param{fd} che deve essere
@@ -2054,33 +2095,72 @@ sez.~\ref{sec:file_openat}.
 
 Una volta utilizzata il file descriptor verrà usato internamente dalle
 funzioni che operano sul \textit{directory stream} e non dovrà essere più
-utilizzato all'interno del proprio programma; in particolare dovrà essere
-chiuso con \func{closedir} e non direttamente. Si tenga presente inoltre che
-\func{fdopendir} non modifica lo stato di un eventuale flag di
-\itindex{close-on-exec} \textit{close-on-exec}, che pertanto dovrà essere
-impostato esplicitamente in fase di apertura del file descriptor.
+utilizzato all'interno del proprio programma. In particolare dovrà essere
+chiuso attraverso il \textit{directory stream} con \func{closedir} e non
+direttamente. Si tenga presente inoltre che \func{fdopendir} non modifica lo
+stato di un eventuale flag di \itindex{close-on-exec} \textit{close-on-exec},
+che pertanto dovrà essere impostato esplicitamente in fase di apertura del
+file descriptor.
 
 Una volta che si sia aperto un \textit{directory stream} la lettura del
 contenuto della directory viene effettuata attraverso la funzione
-\funcd{readdir}; il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{struct dirent *readdir(DIR *dir)}
-  
-  Legge una voce dal \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce il puntatore alla struttura contenente i
-    dati in caso di successo e \val{NULL} altrimenti, in caso di
-    \textit{directory stream} non valido \var{errno} assumerà il valore
-    \errval{EBADF}, il valore \val{NULL} viene restituito anche quando si
-    raggiunge la fine dello stream.}
-\end{functions}
+\funcd{readdir}, il cui prototipo è:
+
+\begin{funcproto}{ 
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{struct dirent *readdir(DIR *dir)}
+\fdesc{Legge una voce dal \textit{directory stream}.} 
+}
+{La funzione ritorna il puntatore alla struttura contenente i dati in caso di
+  successo e \val{NULL} per un errore o se si è raggiunta la fine dello
+  \textit{stream}. Il solo codice di errore restituito in \var{errno} è
+  \errval{EBADF} qualora \param{dir} non indichi un \textit{directory stream}
+  valido.}
+\end{funcproto}
+
+La funzione legge la voce corrente nella directory, posizionandosi sulla voce
+successiva. Pertanto se si vuole leggere l'intero contenuto di una directory
+occorrerà ripetere l'esecuzione della funzione fintanto che non si siano
+esaurite tutte le voci in essa presenti, che viene segnalata dalla
+restituzione di \val{NULL} come valore di ritorno. Si può distinguere questa
+condizione da un errore in quanto in questo caso \var{errno} non verrebbe
+modificata.
+
+I dati letti da \func{readdir} vengono memorizzati in una struttura
+\struct{dirent}, la cui definizione è riportata in
+fig.~\ref{fig:file_dirent_struct}.\footnote{la definizione è quella usata da
+  Linux, che si trova nel file \file{/usr/include/bits/dirent.h}, essa non
+  contempla la presenza del campo \var{d\_namlen} che indica la lunghezza del
+  nome del file.} La funzione non è rientrante e restituisce il puntatore ad
+una struttura allocata staticamente, che viene sovrascritta tutte le volte che
+si ripete la lettura di una voce sullo stesso \textit{directory stream}.
+
+Di questa funzione esiste anche una versione \index{funzioni!rientranti}
+rientrante, \funcd{readdir\_r},\footnote{per usarla è necessario definire una
+  qualunque delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
+  \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
+  \macro{\_POSIX\_SOURCE}.} che non usa una struttura allocata staticamente, e
+può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
+prototipo è:
 
-La funzione legge la voce corrente nella directory, posizionandosi sulla voce
-successiva. Pertanto se si vuole leggere l'intero contenuto di una directory
-occorrerà ripetere l'esecuzione della funzione fintanto che non si siano
-esaurite tutte le voci in essa presenti.
+\begin{funcproto}{ 
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{int readdir\_r(DIR *dir, struct dirent *entry, struct dirent **result)}
+\fdesc{Legge una voce dal \textit{directory stream}.} 
+}
+{La funzione ritorna $0$ in caso di successo ed un numero positivo per un
+  errore, nel qual caso \var{errno} assumerà gli stessi valori di
+  \func{readdir}.} 
+\end{funcproto}
+
+La funzione restituisce in \param{result} come \itindex{value~result~argument}
+\textit{value result argument} l'indirizzo della struttura \struct{dirent}
+dove sono stati salvati i dati, che deve essere allocata dal chiamante, ed il
+cui indirizzo deve essere indicato con l'argomento \param{entry}.  Se si è
+raggiunta la fine del \textit{directory stream} invece in \param{result} viene
+restituito il valore \val{NULL}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2093,61 +2173,70 @@ esaurite tutte le voci in essa presenti.
   \label{fig:file_dirent_struct}
 \end{figure}
 
-I dati vengono memorizzati in una struttura \struct{dirent}, la cui
-definizione è riportata in fig.~\ref{fig:file_dirent_struct}.\footnote{la
-  definizione è quella usata da Linux, che si trova nel file
-  \file{/usr/include/bits/dirent.h}, essa non contempla la presenza del campo
-  \var{d\_namlen} che indica la lunghezza del nome del file.} La funzione
-restituisce il puntatore alla struttura; si tenga presente però che
-quest'ultima è allocata staticamente, per cui viene sovrascritta tutte le
-volte che si ripete la lettura di una voce sullo stesso \textit{directory
-  stream}.
-
-Di questa funzione esiste anche una versione \index{funzioni!rientranti}
-rientrante, \func{readdir\_r},\footnote{per usarla è necessario definire una
-  qualunque delle macro \texttt{\macro{\_POSIX\_C\_SOURCE} >= 1},
-  \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
-  \macro{\_POSIX\_SOURCE}.} che non usa una struttura allocata staticamente, e
-può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
-prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{int readdir\_r(DIR *dir, struct dirent *entry,
-          struct dirent **result)}
-  
-  Legge una voce dal \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    errore, gli errori sono gli stessi di \func{readdir}.}
-\end{functions}
+% Lo spazio per la \struct{dirent} dove vengono restituiti i dati della
+% directory deve essere allocato a cura del chiamante, dato che la dimensione
 
-La funzione restituisce in \param{result} (come
-\itindex{value~result~argument} \textit{value result argument}) l'indirizzo
-dove sono stati salvati i dati, che di norma corrisponde a quello della
-struttura precedentemente allocata e specificata dall'argomento \param{entry},
-anche se non è assicurato che la funzione usi lo spazio fornito dall'utente.
 
 I vari campi di \struct{dirent} contengono le informazioni relative alle voci
-presenti nella directory; sia BSD che SVr4 prevedono che siano sempre presenti
-il campo \var{d\_name},\footnote{lo standard POSIX prevede invece solo la
-  presenza del campo \var{d\_fileno}, identico \var{d\_ino}, che in Linux è
-  definito come alias di quest'ultimo; il campo \var{d\_name} è considerato
-  dipendente dall'implementazione.} che contiene il nome del file nella forma
-di una stringa terminata da uno zero,\footnote{lo standard POSIX non specifica
-  una lunghezza, ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del
-  campo è definita come \code{NAME\_MAX+1} che di norma porta al valore di 256
-  byte usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero
-di \textit{inode} cui il file è associato e corrisponde al campo \var{st\_ino}
-di \struct{stat}.
-
-La presenza di ulteriori campi opzionali oltre i due citati è segnalata dalla
-definizione di altrettante macro nella forma \code{\_DIRENT\_HAVE\_D\_XXX}
-dove \code{XXX} è il nome del relativo campo; nel caso di Linux sono pertanto
-definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
+presenti nella directory. Sia BSD che SVr4 che POSIX.1-2001\footnote{il
+  vecchio standard POSIX prevedeva invece solo la presenza del campo
+  \var{d\_fileno}, identico \var{d\_ino}, che in Linux era definito come alias
+  di quest'ultimo, mentre il campo \var{d\_name} era considerato dipendente
+  dall'implementazione.}  prevedono che siano sempre presenti il campo
+\var{d\_name}, che contiene il nome del file nella forma di una stringa
+terminata da uno zero, ed il campo \var{d\_ino}, che contiene il numero di
+\textit{inode} cui il file è associato e corrisponde al campo \var{st\_ino} di
+\struct{stat}.  La presenza di ulteriori campi opzionali oltre i due citati è
+segnalata dalla definizione di altrettante macro nella forma
+\code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
+campo. Come si può evincere da fig.~\ref{fig:file_dirent_struct} nel caso di
+Linux sono pertanto definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
 \macro{\_DIRENT\_HAVE\_D\_OFF} e \macro{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
 è definita la macro \macro{\_DIRENT\_HAVE\_D\_NAMLEN}.
 
+Dato che possono essere presenti campi opzionali e che lo standard
+POSIX.1-2001 non specifica una dimensione definita per il nome dei file (che
+può variare a seconda del filesystem), ma solo un limite superiore pari a
+\const{NAME\_MAX} (vedi tab.~\ref{tab:sys_file_macro}), in generale per
+allocare una struttura \struct{dirent} in maniera portabile occorre eseguire
+un calcolo per ottenere le dimensioni appropriate per il proprio
+sistema.\footnote{in SVr4 la lunghezza del campo è definita come
+  \code{NAME\_MAX+1} che di norma porta al valore di 256 byte usato anche in
+  fig.~\ref{fig:file_dirent_struct}.} Lo standard però richiede che il campo
+\var{d\_name} sia sempre l'ultimo della struttura, questo ci consente di
+ottenere la dimensione della prima parte con la macro di utilità generica
+\macro{offsetof}, che si può usare con il seguente prototipo:
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{stddef.h}
+\fdecl{size\_t \macro{offsetof}(type, member)}
+\fdesc{Restituisce la posizione del campo \param{member} nella
+  struttura \param{type}.}
+} 
+\end{funcbox}
+}
+
+Ottenuta allora con \code{offsetof(struct dirent, d\_name)} la dimensione
+della parte iniziale della struttura, basterà sommarci la dimensione massima
+dei nomi dei file nel filesystem che si sta usando, che si può ottenere
+attraverso la funzione \func{pathconf} (per la quale si rimanda a
+sez.~\ref{sec:sys_pathconf}) più un ulteriore carattere per la terminazione
+della stringa. 
+
+Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type}
+indica il tipo di file (se fifo, directory, collegamento simbolico, ecc.), e
+consente di evitare una successiva chiamata a \func{lstat} (vedi
+sez.~\ref{sec:file_stat}) per determinarlo. I suoi possibili valori sono
+riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga presente che questo
+valore è disponibile solo per i filesystem che ne supportano la restituzione
+(fra questi i più noti sono \textsl{btrfs}, \textsl{ext2}, \textsl{ext3}, e
+\textsl{ext4}), per gli altri si otterrà sempre il valore
+\const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1 della
+  \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso non era
+  implementato, e veniva restituito comunque il valore \const{DT\_UNKNOWN}.}
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -2159,7 +2248,7 @@ definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
     \const{DT\_UNKNOWN} & Tipo sconosciuto.\\
     \const{DT\_REG}     & File normale.\\
     \const{DT\_DIR}     & Directory.\\
-    \const{DT\_LNK}     & Link simbolico.\\
+    \const{DT\_LNK}     & Collegamento simbolico.\\
     \const{DT\_FIFO}    & Fifo.\\
     \const{DT\_SOCK}    & Socket.\\
     \const{DT\_CHR}     & Dispositivo a caratteri.\\
@@ -2171,83 +2260,88 @@ definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
   \label{tab:file_dtype_macro}
 \end{table}
 
-Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type}
-indica il tipo di file (se fifo, directory, link simbolico, ecc.), e consente
-di evitare una successiva chiamata a \func{lstat} per determinarlo. I suoi
-possibili valori sono riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga
-presente che questo valore è disponibile solo per i filesystem che ne
-supportano la restituzione (fra questi i più noti sono \textsl{btrfs},
-\textsl{ext2}, \textsl{ext3}, e \textsl{ext4}), per gli altri si otterrà
-sempre il valore \const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1
-  delle \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso
-  non era implementato, e veniva restituito comunque il valore
-  \const{DT\_UNKNOWN}.}
-
 Per la conversione da e verso l'analogo valore mantenuto dentro il campo
-\var{st\_mode} di \struct{stat} sono definite anche due macro di conversione,
-\macro{IFTODT} e \macro{DTTOIF}:
-\begin{functions}
-  \funcdecl{int IFTODT(mode\_t MODE)} Converte il tipo di file dal formato di
-  \var{st\_mode} a quello di \var{d\_type}.
-  
-  \funcdecl{mode\_t DTTOIF(int DTYPE)} Converte il tipo di file dal formato di
-  \var{d\_type} a quello di \var{st\_mode}.
-\end{functions}
+\var{st\_mode} di \struct{stat} (vedi fig.~\ref{fig:file_stat_struct}) sono
+definite anche due macro di conversione, \macro{IFTODT} e \macro{DTTOIF}:
+
+{\centering
+\vspace{3pt}
+\begin{funcbox}{
+\fhead{dirent.h}
+\fdecl{int \macro{IFTODT}(mode\_t MODE)}
+\fdesc{Converte il tipo di file dal formato di \var{st\_mode} a quello di
+  \var{d\_type}.}
+\fdecl{mode\_t \macro{DTTOIF}(int DTYPE)}
+\fdesc{Converte il tipo di file dal formato di \var{d\_type} a quello di
+  \var{st\_mode}.}  
+} 
+\end{funcbox}
+}
 
 Il campo \var{d\_off} contiene invece la posizione della voce successiva della
 directory, mentre il campo \var{d\_reclen} la lunghezza totale della voce
 letta. Con questi due campi diventa possibile, determinando la posizione delle
-varie voci, spostarsi all'interno dello stream usando la funzione
+varie voci, spostarsi all'interno dello \textit{stream} usando la funzione
 \funcd{seekdir},\footnote{sia questa funzione che \func{telldir}, sono
   estensioni prese da BSD, ed introdotte nello standard POSIX solo a partire
   dalla revisione POSIX.1-2001, per poterle utilizzare deve essere definita
   una delle macro \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} il cui prototipo è:
-\begin{prototype}{dirent.h}{void seekdir(DIR *dir, off\_t offset)}
-  Cambia la posizione all'interno di un \textit{directory stream}.
-\end{prototype}
+
+\begin{funcproto}{ 
+\fhead{dirent.h}
+\fdecl{void seekdir(DIR *dir, off\_t offset)}
+\fdesc{Cambia la posizione all'interno di un \textit{directory stream}.} 
+}
+{La funzione non ritorna niente e non imposta errori.}
+\end{funcproto}
 
 La funzione non ritorna nulla e non segnala errori, è però necessario che il
-valore dell'argomento \param{offset} sia valido per lo stream \param{dir};
-esso pertanto deve essere stato ottenuto o dal valore di \var{d\_off} di
-\struct{dirent} o dal valore restituito dalla funzione \funcd{telldir}, che
-legge la posizione corrente; il prototipo di quest'ultima è:\footnote{prima
-  delle \acr{glibc} 2.1.1 la funzione restituiva un valore di tipo
-  \type{off\_t}, sostituito a partire dalla versione 2.1.2 da \ctyp{long} per
-  conformità a POSIX.1-2001.}
-\begin{prototype}{dirent.h}{long telldir(DIR *dir)}
-  Ritorna la posizione corrente in un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce la posizione corrente nello stream (un
-    numero positivo) in caso di successo, e -1 altrimenti, nel qual caso
-    \var{errno} assume solo il valore di \errval{EBADF}, corrispondente ad un
-    valore errato per \param{dir}.}
-\end{prototype}
+valore dell'argomento \param{offset} sia valido per lo
+\textit{stream} \param{dir}; esso pertanto deve essere stato ottenuto o dal
+valore di \var{d\_off} di \struct{dirent} o dal valore restituito dalla
+funzione \funcd{telldir}, che legge la posizione corrente; il cui prototipo
+è:\footnote{prima della \acr{glibc} 2.1.1 la funzione restituiva un valore di
+  tipo \type{off\_t}, sostituito a partire dalla versione 2.1.2 da \ctyp{long}
+  per conformità a POSIX.1-2001.}
 
-La sola funzione di posizionamento nello stream prevista originariamente dallo
-standard POSIX è \funcd{rewinddir}, che riporta la posizione a quella
-iniziale; il suo prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{void rewinddir(DIR *dir)}
-  
-  Si posiziona all'inizio di un \textit{directory stream}.
-\end{functions}
+\begin{funcproto}{ 
+\fhead{dirent.h}
+\fdecl{long telldir(DIR *dir)}
+\fdesc{Ritorna la posizione corrente in un \textit{directory stream}.} 
+}
+{La funzione ritorna la posizione corrente nello \textit{stream} (un numero
+  positivo) in caso di successo e $-1$ per un errore, nel qual caso
+  \var{errno} assume solo il valore di \errval{EBADF}, corrispondente ad un
+  valore errato per \param{dir}.  }
+\end{funcproto}
+
+La sola funzione di posizionamento per un \textit{directory stream} prevista
+originariamente dallo standard POSIX è \funcd{rewinddir}, che riporta la
+posizione a quella iniziale; il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{void rewinddir(DIR *dir)}
+\fdesc{Si posiziona all'inizio di un \textit{directory stream}.} 
+}
+{La funzione non ritorna niente e non imposta errori.}
+\end{funcproto}
 
 Una volta completate le operazioni si può chiudere il \textit{directory
   stream}, ed il file descriptor ad esso associato, con la funzione
 \funcd{closedir}, il cui prototipo è:
-\begin{functions}
-  \headdecl{sys/types.h} \headdecl{dirent.h} 
-  
-  \funcdecl{int closedir(DIR * dir)} 
-  
-  Chiude un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 altrimenti, nel
-    qual caso \var{errno} assume il valore \errval{EBADF}.}
-\end{functions}
+
+\begin{funcproto}{ 
+\fhead{sys/types.h}
+\fhead{dirent.h}
+\fdecl{int closedir(DIR *dir)}
+\fdesc{Chiude un \textit{directory stream}.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assume solo il valore \errval{EBADF}.}
+\end{funcproto}
 
 A parte queste funzioni di base in BSD 4.3 venne introdotta un'altra funzione
 che permette di eseguire una scansione completa, con tanto di ricerca ed
@@ -2255,33 +2349,36 @@ ordinamento, del contenuto di una directory; la funzione è
 \funcd{scandir}\footnote{in Linux questa funzione è stata introdotta fin dalle
   \acr{libc4} e richiede siano definite le macro \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} ed il suo prototipo è:
-\begin{prototype}{dirent.h}{int scandir(const char *dir, 
-    struct dirent ***namelist, int(*filter)(const struct dirent *),
-    int(*compar)(const struct dirent **, const struct dirent **))} 
-  
-  Esegue una scansione di un \textit{directory stream}.
-  
-  \bodydesc{La funzione restituisce in caso di successo il numero di voci
-    trovate, e -1 altrimenti.}
-\end{prototype}
+
+\begin{funcproto}{ 
+\fhead{dirent.h}
+\fdecl{int scandir(const char *dir, struct dirent ***namelist, \\
+\phantom{int scandir(}int(*filter)(const struct dirent *), \\
+\phantom{int scandir(}int(*compar)(const struct dirent **, const struct dirent **))}
+\fdesc{Esegue una scansione di un \textit{directory stream}.} 
+}
+{La funzione ritorna il numero di voci trovate in caso di successo e $-1$ per
+  un errore, nel qual caso \var{errno} può assumere solo il valore
+  \errval{ENOMEM}.}
+\end{funcproto}
 
 Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il
 prototipo non è molto comprensibile; queste funzioni però sono quelle che
-controllano rispettivamente la selezione di una voce (quella passata con
-l'argomento \param{filter}) e l'ordinamento di tutte le voci selezionate
-(quella specificata dell'argomento \param{compar}).
+controllano rispettivamente la selezione di una voce, passata con
+l'argomento \param{filter}, e l'ordinamento di tutte le voci selezionate,
+specificata dell'argomento \param{compar}.
 
 La funzione legge tutte le voci della directory indicata dall'argomento
 \param{dir}, passando un puntatore a ciascuna di esse (una struttura
 \struct{dirent}) come argomento della funzione di selezione specificata da
 \param{filter}; se questa ritorna un valore diverso da zero il puntatore viene
 inserito in un vettore che viene allocato dinamicamente con \func{malloc}.
-Qualora si specifichi un valore \val{NULL} per l'argomento \func{filter} non
+Qualora si specifichi un valore \val{NULL} per l'argomento \param{filter} non
 viene fatta nessuna selezione e si ottengono tutte le voci presenti.
 
-Le voci selezionate possono essere riordinate tramite \func{qsort}, le modalità
-del riordinamento possono essere personalizzate usando la funzione
-\param{compar} come criterio di ordinamento di \func{qsort}, la funzione
+Le voci selezionate possono essere riordinate tramite \funcm{qsort}, le
+modalità del riordinamento possono essere personalizzate usando la funzione
+\param{compar} come criterio di ordinamento di \funcm{qsort}, la funzione
 prende come argomenti le due strutture \struct{dirent} da confrontare
 restituendo un valore positivo, nullo o negativo per indicarne l'ordinamento;
 alla fine l'indirizzo della lista ordinata dei puntatori alle strutture
@@ -2292,35 +2389,35 @@ alla fine l'indirizzo della lista ordinata dei puntatori alle strutture
   deve essere dichiarato come \code{struct dirent **namelist} ed alla funzione
   si deve passare il suo indirizzo.}
 
+\itindend{directory~stream}
+
 Per l'ordinamento, vale a dire come valori possibili per l'argomento
-\param{compar} sono disponibili due funzioni predefinite, \funcd{alphasort} e
+\param{compar}, sono disponibili due funzioni predefinite, \funcd{alphasort} e
 \funcd{versionsort}, i cui prototipi sono:
-\begin{functions}
-  \headdecl{dirent.h} 
-  
-  \funcdecl{int alphasort(const void *a, const void *b)} 
 
-  \funcdecl{int versionsort(const void *a, const void *b)} 
-  
-  Funzioni per l'ordinamento delle voci di \textit{directory stream}.
-  
-  \bodydesc{Le funzioni restituiscono un valore minore, uguale o maggiore di
-    zero qualora il primo argomento sia rispettivamente minore, uguale o
-    maggiore del secondo.}
-\end{functions}
+\begin{funcproto}{ 
+\fhead{dirent.h}
+\fdecl{int alphasort(const void *a, const void *b)}
+\fdecl{int versionsort(const void *a, const void *b)}
+\fdesc{Riordinano le voci di \textit{directory stream}.} 
+}
+{Le funzioni restituiscono un valore minore, uguale o maggiore di zero qualora
+  il primo argomento sia rispettivamente minore, uguale o maggiore del secondo
+  e non forniscono errori.}
+\end{funcproto}
 
 La funzione \func{alphasort} deriva da BSD ed è presente in Linux fin dalle
 \acr{libc4}\footnote{la versione delle \acr{libc4} e \acr{libc5} usa però come
-  argomenti dei puntatori a delle strutture \struct{dirent}; le glibc usano il
+  argomenti dei puntatori a delle strutture \struct{dirent}; la glibc usa il
   prototipo originario di BSD, mostrato anche nella definizione, che prevede
   puntatori a \ctyp{void}.} e deve essere specificata come argomento
-\param{compar} per ottenere un ordinamento alfabetico (secondo il valore del
-campo \var{d\_name} delle varie voci). Le \acr{glibc} prevedono come
-estensione\footnote{le glibc, a partire dalla versione 2.1, effettuano anche
-  l'ordinamento alfabetico tenendo conto delle varie localizzazioni, usando
-  \func{strcoll} al posto di \func{strcmp}.} anche \func{versionsort}, che
-ordina i nomi tenendo conto del numero di versione (cioè qualcosa per cui
-\texttt{file10} viene comunque dopo \texttt{file4}.)
+\param{compar} per ottenere un ordinamento alfabetico secondo il valore del
+campo \var{d\_name} delle varie voci. La \acr{glibc} prevede come
+estensione\footnote{la \acr{glibc}, a partire dalla versione 2.1, effettua
+  anche l'ordinamento alfabetico tenendo conto delle varie localizzazioni,
+  usando \funcm{strcoll} al posto di \funcm{strcmp}.} anche
+\func{versionsort}, che ordina i nomi tenendo conto del numero di versione,
+cioè qualcosa per cui \texttt{file10} viene comunque dopo \texttt{file4}.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -2336,18 +2433,18 @@ Un semplice esempio dell'uso di queste funzioni è riportato in
 fig.~\ref{fig:file_my_ls}, dove si è riportata la sezione principale di un
 programma che, usando la funzione di scansione illustrata in
 fig.~\ref{fig:file_dirscan}, stampa i nomi dei file contenuti in una directory
-e la relativa dimensione (in sostanza una versione semplificata del comando
-\cmd{ls}).
+e la relativa dimensionein sostanza una versione semplificata del comando
+\cmd{ls}.
 
 Il programma è estremamente semplice; in fig.~\ref{fig:file_my_ls} si è omessa
-la parte di gestione delle opzioni (che prevede solo l'uso di una funzione per
-la stampa della sintassi, anch'essa omessa) ma il codice completo potrà essere
-trovato coi sorgenti allegati nel file \file{myls.c}.
+la parte di gestione delle opzioniche prevede solo l'uso di una funzione per
+la stampa della sintassi, anch'essa omessa, ma il codice completo può essere
+trovato coi sorgenti allegati alla guida nel file \file{myls.c}.
 
 In sostanza tutto quello che fa il programma, dopo aver controllato
-(\texttt{\small 12--15}) di avere almeno un argomento (che indicherà la
-directory da esaminare) è chiamare (\texttt{\small 16}) la funzione
-\func{DirScan} per eseguire la scansione, usando la funzione \code{do\_ls}
+(\texttt{\small 12--15}) di avere almeno un argomentoche indicherà la
+directory da esaminare, è chiamare (\texttt{\small 16}) la funzione
+\myfunc{dir\_scan} per eseguire la scansione, usando la funzione \code{do\_ls}
 (\texttt{\small 22--29}) per fare tutto il lavoro.
 
 Quest'ultima si limita (\texttt{\small 26}) a chiamare \func{stat} sul file
@@ -2356,7 +2453,7 @@ indicato dalla directory entry passata come argomento (il cui nome è appunto
 dati ad esso relativi, per poi provvedere (\texttt{\small 27}) a stampare il
 nome del file e la dimensione riportata in \var{data}.
 
-Dato che la funzione verrà chiamata all'interno di \func{DirScan} per ogni
+Dato che la funzione verrà chiamata all'interno di \myfunc{dir\_scan} per ogni
 voce presente questo è sufficiente a stampare la lista completa dei file e
 delle relative dimensioni. Si noti infine come si restituisca sempre 0 come
 valore di ritorno per indicare una esecuzione senza errori.
@@ -2364,27 +2461,27 @@ valore di ritorno per indicare una esecuzione senza errori.
 \begin{figure}[!htbp]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
-    \includecodesample{listati/DirScan.c}
+    \includecodesample{listati/dir_scan.c}
   \end{minipage}
   \caption{Codice della funzione di scansione di una directory contenuta nel
-    file \file{DirScan.c}.} 
+    file \file{dir\_scan.c}.} 
   \label{fig:file_dirscan}
 \end{figure}
 
-Tutto il grosso del lavoro è svolto dalla funzione \func{DirScan}, riportata
-in fig.~\ref{fig:file_dirscan}. La funzione è volutamente generica e permette
-di eseguire una funzione, passata come secondo argomento, su tutte le voci di
-una directory.  La funzione inizia con l'aprire (\texttt{\small 18--22}) uno
-stream sulla directory passata come primo argomento, stampando un messaggio in
-caso di errore.
+Tutto il grosso del lavoro è svolto dalla funzione \myfunc{dir\_scan},
+riportata in fig.~\ref{fig:file_dirscan}. La funzione è volutamente generica e
+permette di eseguire una funzione, passata come secondo argomento, su tutte le
+voci di una directory.  La funzione inizia con l'aprire (\texttt{\small
+  18--22}) uno \textit{stream} sulla directory passata come primo argomento,
+stampando un messaggio in caso di errore.
 
 Il passo successivo (\texttt{\small 23--24}) è cambiare
 \index{directory~di~lavoro} directory di lavoro (vedi
 sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e
 \func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su
 \var{dirname}), in modo che durante il successivo ciclo (\texttt{\small
-  26--30}) sulle singole voci dello stream ci si trovi all'interno della
-directory.\footnote{questo è essenziale al funzionamento della funzione
+  26--30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
+della directory.\footnote{questo è essenziale al funzionamento della funzione
   \code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in
   quanto i nomi dei file memorizzati all'interno di una struttura
   \struct{dirent} sono sempre relativi alla directory in questione, e senza
@@ -2400,8 +2497,8 @@ voce valida, cioè un puntatore diverso da \val{NULL}, si esegue
 caso sarà \code{do\_ls}), ritornando con un codice di errore (\texttt{\small
   28}) qualora questa presenti una anomalia, identificata da un codice di
 ritorno negativo. Una volta terminato il ciclo la funzione si conclude con la
-chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo
-  subito dopo la chiamata, questo non servirebbe, in generale però
+chiusura (\texttt{\small 32}) dello \textit{stream}\footnote{nel nostro caso,
+  uscendo subito dopo la chiamata, questo non servirebbe, in generale però
   l'operazione è necessaria, dato che la funzione può essere invocata molte
   volte all'interno dello stesso processo, per cui non chiudere i
   \textit{directory stream} comporterebbe un consumo progressivo di risorse,
@@ -2409,16 +2506,17 @@ chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo
 (\texttt{\small 32}) del codice di operazioni concluse con successo.
 
 
+
 \subsection{La directory di lavoro}
 \label{sec:file_work_dir}
 
-\itindbeg{pathname}
 \index{directory~di~lavoro|(} 
+
 Come accennato in sez.~\ref{sec:proc_fork} a ciascun processo è associata una
 directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati
-  della sua \struct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più
+  della sua \kstruct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più
   precisamente nel campo \texttt{pwd} della sotto-struttura
-  \struct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
+  \kstruct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
 \textsl{directory di lavoro} (in inglese \textit{current working directory}).
 La directory di lavoro è quella da cui si parte quando un
 \itindsub{pathname}{relativo} \textit{pathname} è espresso in forma relativa,
@@ -2427,35 +2525,38 @@ dove il ``\textsl{relativa}'' fa riferimento appunto a questa directory.
 Quando un utente effettua il login, questa directory viene impostata alla
 \textit{home directory} del suo account. Il comando \cmd{cd} della shell
 consente di cambiarla a piacere, spostandosi da una directory ad un'altra, il
-comando \cmd{pwd} la stampa sul terminale.  Siccome la directory corrente
+comando \cmd{pwd} la stampa sul terminale.  Siccome la directory di lavoro
 resta la stessa quando viene creato un processo figlio (vedi
-sez.~\ref{sec:proc_fork}), la directory corrente della shell diventa anche la
-directory corrente di qualunque comando da essa lanciato.
+sez.~\ref{sec:proc_fork}), la directory di lavoro della shell diventa anche la
+directory di lavoro di qualunque comando da essa lanciato.
 
 Dato che è il kernel che tiene traccia per ciascun processo \itindex{inode}
 dell'\textit{inode} della directory di lavoro, per ottenerne il
-\textit{pathname} occorre usare una apposita funzione di libreria,
+\textit{pathname} occorre usare una apposita funzione,
 \funcd{getcwd},\footnote{con Linux \func{getcwd} è una \textit{system call}
   dalla versione 2.1.9, in precedenza il valore doveva essere ottenuto tramite
   il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo
 è:
-\begin{prototype}{unistd.h}{char *getcwd(char *buffer, size\_t size)}
-  Legge il \textit{pathname} della directory di lavoro corrente.
-  
-  \bodydesc{La funzione restituisce il puntatore \param{buffer} se riesce,
-    \val{NULL} se fallisce, in quest'ultimo caso la variabile
-    \var{errno} è impostata con i seguenti codici di errore:
+
+\begin{funcproto}{ 
+\fhead{unistd.h}
+\fdecl{char *getcwd(char *buffer, size\_t size)}
+\fdesc{Legge il \textit{pathname} della directory di lavoro corrente.} 
+}
+{La funzione ritorna il puntatore a \param{buffer} in caso di successo e
+  \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
+  \item[\errcode{EACCES}] manca il permesso di lettura o di attraversameto  su
+    uno dei componenti del \textit{pathname} (cioè su una delle directory
+    superiori alla corrente).
   \item[\errcode{EINVAL}] l'argomento \param{size} è zero e \param{buffer} non
     è nullo.
+  \item[\errcode{ENOENT}] la directory di lavoro è stata eliminata. 
   \item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della
     lunghezza del \textit{pathname}. 
-  \item[\errcode{EACCES}] manca il permesso di lettura o di ricerca su uno dei
-    componenti del \textit{pathname} (cioè su una delle directory superiori
-    alla corrente).
-  \item[\errcode{ENOENT}] la directory di lavoro è stata eliminata.
-  \end{errlist}}
-\end{prototype}
+  \end{errlist}
+  ed inoltre \errcode{EFAULT} nel suo significato generico.}
+\end{funcproto}
 
 La funzione restituisce il \textit{pathname} completo della directory di
 lavoro corrente nella stringa puntata da \param{buffer}, che deve essere
@@ -2470,14 +2571,14 @@ Si può anche specificare un puntatore nullo come
   supportata da Linux e dalla \acr{glibc}.} nel qual caso la stringa sarà
 allocata automaticamente per una dimensione pari a \param{size} qualora questa
 sia diversa da zero, o della lunghezza esatta del \textit{pathname}
-altrimenti. In questo caso ci si deve ricordare di disallocare la stringa una
-volta cessato il suo utilizzo.
-
-Di questa funzione esiste una versione \code{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 \const{PATH\_MAX} (di solito 256 byte, vedi
-sez.~\ref{sec:sys_limits}); il problema è che in Linux non esiste una
+altrimenti. In questo caso ci si deve ricordare di disallocare la stringa con
+\func{free} una volta cessato il suo utilizzo.
+
+Di questa funzione esiste una versione alternativa \code{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 \const{PATH\_MAX} (di solito 256 byte,
+vedi sez.~\ref{sec:sys_limits}); il problema è che in Linux non esiste una
 dimensione superiore per un \textit{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.
@@ -2485,56 +2586,228 @@ principale per cui questa funzione è deprecata.
 Un uso comune di \func{getcwd} è quello di salvare la directory di lavoro
 iniziale per poi potervi tornare in un tempo successivo, un metodo alternativo
 più veloce, se non si è a corto di file descriptor, è invece quello di aprire
-la directory corrente (vale a dire ``\texttt{.}'') e tornarvi in seguito con
-\func{fchdir}. 
+all'inizio la directory corrente (vale a dire ``\texttt{.}'') e tornarvi in
+seguito con \func{fchdir}.
 
-Una seconda usata per ottenere la directory di lavoro è \code{char
+Una seconda funzione usata per ottenere la directory di lavoro è \code{char
   *get\_current\_dir\_name(void)} che è sostanzialmente equivalente ad una
 \code{getcwd(NULL, 0)}, con la sola differenza che essa ritorna il valore
 della variabile di ambiente \envvar{PWD}, che essendo costruita dalla shell
-può contenere un \textit{pathname} comprendente anche dei link
+può contenere un \textit{pathname} comprendente anche dei collegamenti
 simbolici. Usando \func{getcwd} infatti, essendo il \textit{pathname} ricavato
 risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni
-passaggio attraverso eventuali link simbolici.
+passaggio attraverso eventuali collegamenti simbolici.
 
-Per cambiare la directory di lavoro si può usare la funzione \funcd{chdir}
-(equivalente del comando di shell \cmd{cd}) il cui nome sta appunto per
-\textit{change directory}, il suo prototipo è:
-\begin{prototype}{unistd.h}{int chdir(const char *pathname)} 
-  Cambia la directory di lavoro in \param{pathname}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore,
-    nel qual caso \var{errno} assumerà i valori:
+Per cambiare la directory di lavoro si può usare la funzione di sistema
+\funcd{chdir}, equivalente del comando di shell \cmd{cd}, il cui nome sta
+appunto per \textit{change directory}, il suo prototipo è:
+
+\begin{funcproto}{ 
+\fhead{unistd.h}
+\fdecl{int chdir(const char *pathname)}
+\fdesc{Cambia la directory di lavoro per \textit{pathname}.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{ENOTDIR}] non si è specificata una directory.
-  \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti
-    di \param{path}.
+  \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti 
   \end{errlist}
-  ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOMEM}, \errval{ELOOP} e \errval{EIO}.}
-\end{prototype}
-\noindent ed ovviamente \param{pathname} deve indicare una directory per la
-quale si hanno i permessi di accesso.
+  ed inoltre  \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
+  \errval{ENOMEM}, \errval{ELOOP} e \errval{EIO}
+ nel loro significato generico.}
+\end{funcproto}
+
+La funzione cambia la directory di lavoro in \param{pathname} ed
+ovviamente \param{pathname} deve indicare una directory per la quale si hanno
+i permessi di accesso.
 
 Dato che anche le directory sono file, è possibile riferirsi ad esse anche
-tramite il file descriptor, e non solo tramite il \textit{pathname}, per fare
+tramite un file descriptor, e non solo tramite il \textit{pathname}, per fare
 questo si usa \funcd{fchdir}, il cui prototipo è:
-\begin{prototype}{unistd.h}{int fchdir(int fd)} 
-  Identica a \func{chdir}, ma usa il file descriptor \param{fd} invece del
-  \textit{pathname}.
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int fchdir(int fd)}
+\fdesc{Cambia la directory di lavoro per file descriptor.} 
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà assumerà i valori \errval{EBADF} o \errval{EACCES}
+  nel loro significato generico.}
+\end{funcproto}
+
+La funzione è identica a \func{chdir}, ma usa il file descriptor \param{fd}
+invece del \textit{pathname}. Anche in questo caso \param{fd} deve essere un
+file descriptor valido che fa riferimento ad una directory. Inoltre l'unico
+errore di accesso possibile (tutti gli altri sarebbero occorsi all'apertura
+di \param{fd}), è quello in cui il processo non ha il permesso di
+attraversamento alla directory specificata da \param{fd}.
+
+\index{directory~di~lavoro|)} 
+
+
+\subsection{La creazione di file speciali}
+\label{sec:file_mknod}
+
+\index{file!di~dispositivo|(} 
+
+Finora abbiamo parlato esclusivamente di file, directory e collegamenti
+simbolici; in sez.~\ref{sec:file_file_types} abbiamo visto però che il sistema
+prevede pure degli altri tipi di file speciali, come i file di dispositivo, le
+fifo ed i socket (questi ultimi sono un caso a parte, essendo associati anche
+alla comunicazione via rete, per cui ci saranno trattati in dettaglio a
+partire da cap.~\ref{cha:socket_intro}).
+
+La manipolazione delle caratteristiche di questi diversi tipi di file e la
+loro cancellazione può essere effettuata con le stesse funzioni che operano
+sui file regolari; ma quando li si devono creare sono necessarie delle
+funzioni apposite. La prima di queste funzioni è \funcd{mknod}, il cui
+prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \headdecl{sys/stat.h}
+  \headdecl{fcntl.h}
+  \headdecl{unistd.h}
+  \funcdecl{int mknod(const char *pathname, mode\_t mode, dev\_t dev)} 
+  
+  Crea un \textit{inode} del tipo specificato sul filesystem.
   
   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
-    errore, in caso di errore \var{errno} assumerà i valori \errval{EBADF} o
-    \errval{EACCES}.}
-\end{prototype}
-\noindent anche in questo caso \param{fd} deve essere un file descriptor
-valido che fa riferimento ad una directory. Inoltre l'unico errore di accesso
-possibile (tutti gli altri sarebbero occorsi all'apertura di \param{fd}), è
-quello in cui il processo non ha il permesso di accesso alla directory
-specificata da \param{fd}.
+    errore, nel qual caso \var{errno} assumerà i valori:
+  \begin{errlist}
+  \item[\errcode{EPERM}] non si hanno privilegi sufficienti a creare
+    l'\texttt{inode}, o il filesystem su cui si è cercato di
+    creare \param{pathname} non supporta l'operazione.
+  \item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una
+    fifo, un socket o un dispositivo.
+  \item[\errcode{EEXIST}] \param{pathname} esiste già o è un collegamento
+    simbolico. 
+  \end{errlist}
+  ed inoltre anche \errval{EFAULT}, \errval{EACCES}, \errval{ENAMETOOLONG},
+  \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP},
+  \errval{ENOSPC}, \errval{EROFS}.}
+\end{functions}
 
-\itindend{pathname}
-\index{directory~di~lavoro|)} 
+La funzione, come suggerisce il nome, permette di creare un ``\textsl{nodo}''
+sul filesystem, e viene in genere utilizzata per creare i file di dispositivo,
+ma si può usare anche per creare file regolari. L'argomento
+\param{mode} specifica sia il tipo di file che si vuole creare che i relativi
+permessi, secondo i valori riportati in tab.~\ref{tab:file_mode_flags}, che
+vanno combinati con un OR binario. I permessi sono comunque modificati nella
+maniera usuale dal valore di \itindex{umask} \textit{umask} (si veda
+sez.~\ref{sec:file_perm_management}).
+
+Per il tipo di file può essere specificato solo uno fra i seguenti valori:
+\const{S\_IFREG} per un file regolare (che sarà creato vuoto),
+\const{S\_IFBLK} per un dispositivo a blocchi, \const{S\_IFCHR} per un
+dispositivo a caratteri, \const{S\_IFSOCK} per un socket e \const{S\_IFIFO}
+per una fifo;\footnote{con Linux la funzione non può essere usata per creare
+  directory o collegamenti simbolici, si dovranno usare le funzioni
+  \func{mkdir} e \func{symlink} a questo dedicate.} un valore diverso
+comporterà l'errore \errcode{EINVAL}.
+
+Qualora si sia specificato in \param{mode} un file di dispositivo (vale a dire
+o \const{S\_IFBLK} o \const{S\_IFCHR}), il valore di \param{dev} dovrà essere
+usato per indicare a quale dispositivo si fa riferimento, altrimenti il suo
+valore verrà ignorato.  Solo l'amministratore può creare un file di
+dispositivo usando questa funzione (il processo deve avere la
+\itindex{capabilities} \textit{capability} \const{CAP\_MKNOD}), ma in
+Linux\footnote{questo è un comportamento specifico di Linux, la funzione non è
+  prevista dallo standard POSIX.1 originale, mentre è presente in SVr4 e
+  4.4BSD, ma esistono differenze nei comportamenti e nei codici di errore,
+  tanto che questa è stata introdotta in POSIX.1-2001 con una nota che la
+  definisce portabile solo quando viene usata per creare delle fifo, ma
+  comunque deprecata essendo utilizzabile a tale scopo la specifica
+  \func{mkfifo}.} l'uso per la creazione di un file ordinario, di una fifo o
+di un socket è consentito anche agli utenti normali.
+
+I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
+al proprietario e al gruppo del processo che li ha creati, a meno che non si
+sia attivato il bit \acr{sgid} per la directory o sia stata attivata la
+semantica BSD per il filesystem (si veda
+sez.~\ref{sec:file_ownership_management}) in cui si va a creare
+\itindex{inode} l'\textit{inode}.
+
+Nella creazione di un file di dispositivo occorre poi specificare
+correttamente il valore di \param{dev}; questo infatti è di tipo
+\type{dev\_t}, che è un tipo primitivo (vedi
+tab.~\ref{tab:intro_primitive_types}) riservato per indicare un
+\textsl{numero} di dispositivo; il kernel infatti identifica ciascun
+dispositivo con un valore numerico. Originariamente questo era un intero a 16
+bit diviso in due parti di 8 bit chiamate rispettivamente
+\itindex{major~number} \textit{major number} e \itindex{minor~number}
+\textit{minor number}, che sono poi i due numeri mostrati dal comando
+\texttt{ls -l} al posto della dimensione quando lo si esegue su un file di
+dispositivo.
+
+Il \itindex{major~number} \textit{major number} identifica una classe di
+dispositivi (ad esempio la seriale, o i dischi IDE) e serve in sostanza per
+indicare al kernel quale è il modulo che gestisce quella classe di
+dispositivi; per identificare uno specifico dispositivo di quella classe (ad
+esempio una singola porta seriale, o una partizione di un disco) si usa invece
+il \itindex{minor~number} \textit{minor number}. L'elenco aggiornato di questi
+numeri con le relative corrispondenze ai vari dispositivi può essere trovato
+nel file \texttt{Documentation/devices.txt} allegato alla documentazione dei
+sorgenti del kernel.
+
+Data la crescita nel numero di dispositivi supportati, ben presto il limite
+massimo di 256 si è rivelato troppo basso, e nel passaggio dai kernel della
+serie 2.4 alla serie 2.6 è stata aumentata a 32 bit la dimensione del tipo
+\type{dev\_t}, con delle dimensioni passate a 12 bit per il
+\itindex{major~number} \textit{major number} e 20 bit per il
+\itindex{minor~number} \textit{minor number}. La transizione però ha anche
+comportato il passaggio di \type{dev\_t} a \index{tipo!opaco} tipo opaco, e la
+necessità di specificare il numero tramite delle opportune macro, così da non
+avere problemi di compatibilità con eventuali ulteriori estensioni.
+
+Le macro sono definite nel file \headfile{sys/sysmacros.h}, che viene
+automaticamente incluso quando si include \headfile{sys/types.h}; si possono
+pertanto ottenere i valori del \itindex{major~number} \textit{major number} e
+\itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente
+con le macro \macro{major} e \macro{minor}:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \funcdecl{int \macro{major}(dev\_t dev)}
+  Restituisce il \itindex{major~number} \textit{major number} del dispositivo
+  \param{dev}.
+  
+  \funcdecl{int \macro{minor}(dev\_t dev)}
+  Restituisce il \itindex{minor~number} \textit{minor number} del dispositivo
+  \param{dev}.
+\end{functions}
+\noindent mentre una volta che siano noti \itindex{major~number} \textit{major
+  number} e \itindex{minor~number} \textit{minor number} si potrà costruire il
+relativo identificativo con la macro \macro{makedev}:
+\begin{functions}
+  \headdecl{sys/types.h}
+  \funcdecl{dev\_t \macro{minor}(int major, int minor)}
+
+  Restituisce l'identificativo di un dispositivo dati \itindex{major~number}
+  \textit{major number} e \itindex{minor~number} \textit{minor number}.
+\end{functions}
+
+\index{file!di~dispositivo|)}
+
+Infine con lo standard POSIX.1-2001 è stata introdotta una funzione specifica
+per creare una fifo (tratteremo le fifo in in sez.~\ref{sec:ipc_named_pipe});
+la funzione è \funcd{mkfifo} ed il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} \headdecl{sys/stat.h} 
+  
+  \funcdecl{int mkfifo(const char *pathname, mode\_t mode)} 
+  
+  Crea una fifo.
+  
+  \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
+    errore, nel qual caso \var{errno} assumerà i valori \errval{EACCES},
+    \errval{EEXIST}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOSPC},
+    \errval{ENOTDIR} e \errval{EROFS}.}
+\end{functions}
+
+La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come
+per \func{mknod} il file \param{pathname} non deve esistere (neanche come
+collegamento simbolico); al solito i permessi specificati da \param{mode}
+vengono modificati dal valore di \itindex{umask} \textit{umask}.
 
 
 \subsection{I file temporanei}
@@ -2548,7 +2821,7 @@ controllo e la creazione si ha giusto lo spazio per una possibile
 \itindex{race~condition} \textit{race condition} (si ricordi quanto visto in
 sez.~\ref{sec:proc_race_cond}).
 
-Le \acr{glibc} provvedono varie funzioni per generare nomi di file temporanei,
+La \acr{glibc} provvede varie funzioni per generare nomi di file temporanei,
 di cui si abbia certezza di unicità al momento della generazione; storicamente
 la prima di queste funzioni create a questo scopo era
 \funcd{tmpnam},\footnote{la funzione è stata deprecata nella revisione
@@ -2574,7 +2847,7 @@ specificata dalla costante \const{P\_tmpdir}.\footnote{le costanti
   \headfile{stdio.h}.}
 
 Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante,
-\func{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
+\funcm{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
 Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
 il file esplicitamente, il suo prototipo è:
 \begin{prototype}{stdio.h}{char *tempnam(const char *dir, const char *pfx)}
@@ -2606,8 +2879,8 @@ avere creato, fra l'ottenimento del nome e l'apertura del file, un altro file
 con lo stesso nome; per questo motivo quando si usa il nome ottenuto da una di
 queste funzioni occorre sempre aprire il nuovo file in modalità di esclusione
 (cioè con l'opzione \const{O\_EXCL} per i file descriptor o con il flag
-\code{x} per gli stream) che fa fallire l'apertura in caso il file sia già
-esistente.
+\code{x} per gli \textit{stream}) che fa fallire l'apertura in caso il file
+sia già esistente.
 
 Per evitare di dovere effettuare a mano tutti questi controlli, lo standard
 POSIX definisce la funzione \funcd{tmpfile}, che permette di ottenere in
@@ -2615,9 +2888,9 @@ maniera sicura l'accesso ad un file temporaneo, il suo prototipo è:
 \begin{prototype}{stdio.h}{FILE *tmpfile(void)}
   Restituisce un file temporaneo aperto in lettura/scrittura.
   
-  \bodydesc{La funzione ritorna il puntatore allo stream associato al file
-    temporaneo in caso di successo e \val{NULL} in caso di errore, nel qual
-    caso \var{errno} assumerà i valori:
+  \bodydesc{La funzione ritorna il puntatore allo \textit{stream} associato al
+    file temporaneo in caso di successo e \val{NULL} in caso di errore, nel
+    qual caso \var{errno} assumerà i valori:
     \begin{errlist}
     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
     \item[\errcode{EEXIST}] non è stato possibile generare un nome univoco.
@@ -2626,13 +2899,13 @@ maniera sicura l'accesso ad un file temporaneo, il suo prototipo è:
     \errval{ENOSPC}, \errval{EROFS} e \errval{EACCES}.}
 \end{prototype}
 
-La funzione restituisce direttamente uno stream già aperto (in modalità
-\code{r+b}, si veda sez.~\ref{sec:file_fopen}) e pronto per l'uso, che viene
-automaticamente cancellato alla sua chiusura o all'uscita dal programma. Lo
-standard non specifica in quale directory verrà aperto il file, ma le
-\acr{glibc} prima tentano con \const{P\_tmpdir} e poi con \file{/tmp}. Questa
-funzione è \index{funzioni!rientranti} rientrante e non soffre di problemi di
-\itindex{race~condition} \textit{race condition}.
+La funzione restituisce direttamente uno \textit{stream} già aperto (in
+modalità \code{r+b}, si veda sez.~\ref{sec:file_fopen}) e pronto per l'uso,
+che viene automaticamente cancellato alla sua chiusura o all'uscita dal
+programma. Lo standard non specifica in quale directory verrà aperto il file,
+ma la \acr{glibc} prima tenta con \const{P\_tmpdir} e poi con
+\file{/tmp}. Questa funzione è \index{funzioni!rientranti} rientrante e non
+soffre di problemi di \itindex{race~condition} \textit{race condition}.
 
 Alcune versioni meno recenti di Unix non supportano queste funzioni; in questo
 caso si possono usare le vecchie funzioni \funcd{mktemp} e \func{mkstemp} che
@@ -2684,7 +2957,7 @@ sez.~\ref{sec:file_open}), in questo modo al ritorno della funzione si ha la
 certezza di essere stati i creatori del file, i cui permessi (si veda
 sez.~\ref{sec:file_perm_overview}) sono impostati al valore \code{0600}
 (lettura e scrittura solo per il proprietario).\footnote{questo è vero a
-  partire dalle \acr{glibc} 2.0.7, le versioni precedenti delle \acr{glibc} e
+  partire dalla \acr{glibc} 2.0.7, le versioni precedenti della \acr{glibc} e
   le vecchie \acr{libc5} e \acr{libc4} usavano il valore \code{0666} che
   permetteva a chiunque di leggere e scrivere i contenuti del file.}  Di
 questa funzione esiste una variante \funcd{mkostemp}, introdotta
@@ -2704,7 +2977,7 @@ nell'apertura del file.
 
 In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
 \funcd{mkdtemp}, che crea invece una directory temporanea;\footnote{la
-  funzione è stata introdotta nelle \acr{glibc} a partire dalla versione
+  funzione è stata introdotta nella \acr{glibc} a partire dalla versione
   2.1.91 ed inserita nello standard POSIX.1-2008.}  il suo prototipo è:
 \begin{prototype}{stlib.h}{char *mkdtemp(char *template)}
   Genera una directory temporanea.
@@ -2764,13 +3037,14 @@ funzioni \funcd{stat}, \funcd{fstat} e \funcd{lstat}, i cui prototipi sono:
     \errval{EACCES}, \errval{ENOMEM}, \errval{ENAMETOOLONG}.}
 \end{functions}
 
-La funzione \func{stat} legge le informazioni del file il cui pathname è
-specificato dalla stringa puntata da \param{file\_name} e le inserisce nel
-buffer puntato dall'argomento \param{buf}; la funzione \func{lstat} è identica
-a \func{stat} eccetto che se \param{file\_name} è un link simbolico vengono
-lette le informazioni relative ad esso e non al file a cui fa
-riferimento. Infine \func{fstat} esegue la stessa operazione su un file già
-aperto, specificato tramite il suo file descriptor \param{filedes}.
+La funzione \func{stat} legge le informazioni del file il cui
+\textit{pathname} è specificato dalla stringa puntata da \param{file\_name} e
+le inserisce nel buffer puntato dall'argomento \param{buf}; la funzione
+\func{lstat} è identica a \func{stat} eccetto che se \param{file\_name} è un
+collegamento simbolico vengono lette le informazioni relative ad esso e non al
+file a cui fa riferimento. Infine \func{fstat} esegue la stessa operazione su
+un file già aperto, specificato tramite il suo file
+descriptor \param{filedes}.
 
 La struttura \struct{stat} usata da queste funzioni è definita nell'header
 \headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione
@@ -2808,9 +3082,9 @@ una struttura \struct{stat}.
 Dato che il valore numerico può variare a seconda delle implementazioni, lo
 standard POSIX definisce un insieme di macro per verificare il tipo di file,
 queste vengono usate anche da Linux che supporta pure le estensioni allo
-standard per i link simbolici e i socket definite da BSD; l'elenco completo
-delle macro con cui è possibile estrarre l'informazione da \var{st\_mode} è
-riportato in tab.~\ref{tab:file_type_macro}.
+standard per i collegamenti simbolici e i socket definite da BSD; l'elenco
+completo delle macro con cui è possibile estrarre l'informazione da
+\var{st\_mode} è riportato in tab.~\ref{tab:file_type_macro}.
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -2824,7 +3098,7 @@ riportato in tab.~\ref{tab:file_type_macro}.
     \macro{S\_ISCHR}\texttt{(m)}  & dispositivo a caratteri.\\
     \macro{S\_ISBLK}\texttt{(m)}  & dispositivo a blocchi.\\
     \macro{S\_ISFIFO}\texttt{(m)} & fifo.\\
-    \macro{S\_ISLNK}\texttt{(m)}  & link simbolico.\\
+    \macro{S\_ISLNK}\texttt{(m)}  & collegamento simbolico.\\
     \macro{S\_ISSOCK}\texttt{(m)} & socket.\\
     \hline    
   \end{tabular}
@@ -2854,7 +3128,7 @@ un'opportuna combinazione.
     \hline
     \const{S\_IFMT}   &  0170000 & Maschera per i bit del tipo di file.\\
     \const{S\_IFSOCK} &  0140000 & Socket.\\
-    \const{S\_IFLNK}  &  0120000 & Link simbolico.\\
+    \const{S\_IFLNK}  &  0120000 & Collegamento simbolico.\\
     \const{S\_IFREG}  &  0100000 & File regolare.\\ 
     \const{S\_IFBLK}  &  0060000 & Dispositivo a blocchi.\\
     \const{S\_IFDIR}  &  0040000 & Directory.\\
@@ -2898,14 +3172,14 @@ poi si effettua il confronto con la combinazione di tipi scelta.
 \label{sec:file_file_size}
 
 Il campo \var{st\_size} di una struttura \struct{stat} contiene la dimensione
-del file in byte, se si tratta di un file regolare. Nel caso di un link
-simbolico la dimensione è quella del \itindex{pathname} \textit{pathname} che
-il link stesso contiene; per le fifo questo campo è sempre nullo.
+del file in byte, se si tratta di un file regolare. Nel caso di un
+collegamento simbolico la dimensione è quella del \textit{pathname} che il
+collegamento stesso contiene; per le fifo questo campo è sempre nullo.
 
 Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512
 byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per
 i trasferimenti sui file (che è la dimensione usata anche dalle librerie del C
-per l'interfaccia degli stream); scrivere sul file a blocchi di dati di
+per l'interfaccia degli \textit{stream}); scrivere sul file a blocchi di dati di
 dimensione inferiore sarebbe inefficiente.
 
 Si tenga conto che la lunghezza del file riportata in \var{st\_size} non è
@@ -2952,8 +3226,7 @@ dimensione si possono usare le due funzioni \funcd{truncate} e
   per \func{truncate} si hanno:
   \begin{errlist}
   \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il
-    permesso di esecuzione una delle directory del \itindex{pathname}
-    \textit{pathname}.
+    permesso di esecuzione una delle directory del \textit{pathname}.
   \item[\errcode{ETXTBSY}] il file è un programma in esecuzione.
   \end{errlist}
   ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT},
@@ -2962,9 +3235,9 @@ dimensione si possono usare le due funzioni \funcd{truncate} e
 
 Entrambe le funzioni fan sì che la dimensione del file sia troncata ad un
 valore massimo specificato da \param{length}, e si distinguono solo per il
-fatto che il file viene indicato con il pathname \param{file\_name} per
-\func{truncate} e con il file descriptor \param{fd} per \funcd{ftruncate}; se
-il file è più lungo della lunghezza specificata i dati in eccesso saranno
+fatto che il file viene indicato con il \textit{pathname} \param{file\_name}
+per \func{truncate} e con il file descriptor \param{fd} per \funcd{ftruncate};
+se il file è più lungo della lunghezza specificata i dati in eccesso saranno
 perduti.
 
 Il comportamento in caso di lunghezza inferiore non è specificato e dipende
@@ -3063,12 +3336,12 @@ specificata esplicitamente.\footnote{si può comunque riottenere il vecchio
   \footnotesize
   \begin{tabular}[c]{|l|c|c|c|c|c|c|l|}
     \hline
-    \multicolumn{1}{|p{3cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
-    \multicolumn{3}{|p{3.6cm}|}{\centering{
+    \multicolumn{1}{|p{2.8cm}|}{\centering{\vspace{6pt}\textbf{Funzione}}} &
+    \multicolumn{3}{|p{3.4cm}|}{\centering{
         \textbf{File o directory del riferimento}}}&
-    \multicolumn{3}{|p{3.6cm}|}{\centering{
+    \multicolumn{3}{|p{3.4cm}|}{\centering{
         \textbf{Directory contenente il riferimento}}} 
-    &\multicolumn{1}{|p{3.6cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
+    &\multicolumn{1}{|p{3.4cm}|}{\centering{\vspace{6pt}\textbf{Note}}} \\
     \cline{2-7}
     \cline{2-7}
     \multicolumn{1}{|p{3cm}|}{} 
@@ -3260,8 +3533,8 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente.
 Oltre ad \func{utimes} su Linux sono presenti altre due funzioni,\footnote{le
   due funzioni non sono definite in nessuno standard, ma sono presenti, oltre
   che su Linux, anche su BSD.} \funcd{futimes} e \funcd{lutimes}, che
-consentono rispettivamente di effettuare la modifica utilizzando un file
-già aperto o di eseguirla direttamente su un link simbolico. I relativi
+consentono rispettivamente di effettuare la modifica utilizzando un file già
+aperto o di eseguirla direttamente su un collegamento simbolico. I relativi
 prototipi sono:
 \begin{functions}
   \headdecl{sys/time.h} 
@@ -3270,7 +3543,8 @@ prototipi sono:
   di un file già aperto specificato tramite il file descriptor \param{fd}.
 
   \funcdecl{int lutimes(const char *filename, const struct timeval tv[2])}
-  Cambia i tempi di \param{filename} anche se questo è un link simbolico.
+  Cambia i tempi di \param{filename} anche se questo è un collegamento
+  simbolico.
   
   
   \bodydesc{Le funzioni restituiscono zero in caso di successo e $-1$ per un
@@ -3286,8 +3560,8 @@ Le due funzioni anno lo stesso comportamento di \texttt{utimes} e richiedono
 gli stessi privilegi per poter operare, la differenza è che con \func{futimes}
 si può indicare il file su cui operare facendo riferimento al relativo file
 descriptor mentre con \func{lutimes} nel caso in cui \param{filename} sia un
-link simbolico saranno modificati i suoi tempi invece di quelli del file a cui
-esso punta.
+collegamento simbolico saranno modificati i suoi tempi invece di quelli del
+file a cui esso punta.
 
 Nonostante il kernel, come accennato, supporti risoluzioni dei tempi dei file
 fino al nanosecondo, le funzioni fin qui esaminate non consentono di impostare
@@ -3342,9 +3616,9 @@ quello di ultima modifica. Quando si usa uno di questi valori speciali per
 
 Queste due funzioni sono una estensione definita in una recente revisione
 dello standard POSIX (la POSIX.1-2008); sono state introdotte a partire dal
-kernel 2.6.22, e supportate dalle \acr{glibc} a partire dalla versione
+kernel 2.6.22, e supportate dalla \acr{glibc} a partire dalla versione
 2.6.\footnote{in precedenza, a partire dal kernel 2.6.16, era stata introdotta
-  la funzione \func{futimesat} seguendo una bozza della revisione dello
+  la funzione \funcm{futimesat} seguendo una bozza della revisione dello
   standard poi modificata, questa funzione, sostituita da \func{utimensat}, è
   stata dichiarata obsoleta, non è supportata da nessuno standard e non deve
   essere più utilizzata: pertanto non la tratteremo.} La prima è
@@ -3352,12 +3626,12 @@ sostanzialmente una estensione di \func{futimes} che consente di specificare i
 tempi con precisione maggiore, la seconda supporta invece, rispetto ad
 \func{utimes}, una sintassi più complessa che, come vedremo in
 sez.~\ref{sec:file_openat} consente una indicazione sicura dei
-\textit{pathname relativi} specificando la directory da usare come riferimento
-in \param{dirfd} e la possibilità di usare \param{flags} per indicare alla
-funzione di dereferenziare o meno i link simbolici; si rimanda pertanto la
-spiegazione del significato degli argomenti aggiuntivi alla trattazione
-generica delle varie funzioni che usano la stessa sintassi, effettuata in
-sez.~\ref{sec:file_openat}.
+\itindsub{pathname}{relativo} \textit{pathname relativi} specificando la
+directory da usare come riferimento in \param{dirfd} e la possibilità di
+usare \param{flags} per indicare alla funzione di dereferenziare o meno i
+collegamenti simbolici; si rimanda pertanto la spiegazione del significato
+degli argomenti aggiuntivi alla trattazione generica delle varie funzioni che
+usano la stessa sintassi, effettuata in sez.~\ref{sec:file_openat}.
 
 
 \section{Il controllo di accesso ai file}
@@ -3473,20 +3747,20 @@ che permettono di accedere al valore numerico di questi bit nel campo
 \end{table}
 
 I permessi vengono usati in maniera diversa dalle varie funzioni, e a seconda
-che si riferiscano a dei file, dei link simbolici o delle directory; qui ci
-limiteremo ad un riassunto delle regole generali, entrando nei dettagli più
-avanti.
+che si riferiscano a dei file, dei collegamenti simbolici o delle directory;
+qui ci limiteremo ad un riassunto delle regole generali, entrando nei dettagli
+più avanti.
 
 La prima regola è che per poter accedere ad un file attraverso il suo
-\itindex{pathname} \textit{pathname} occorre il permesso di esecuzione in
-ciascuna delle directory che compongono il \textit{pathname}; lo stesso vale
-per aprire un file nella directory corrente (per la quale appunto serve il
-diritto di esecuzione).
+\textit{pathname} occorre il permesso di esecuzione in ciascuna delle
+directory che compongono il \textit{pathname}; lo stesso vale per aprire un
+file nella directory corrente (per la quale appunto serve il diritto di
+esecuzione).
 
 Per una directory infatti il permesso di esecuzione significa che essa può
-essere attraversata nella risoluzione del \itindex{pathname}
-\textit{pathname}, ed è distinto dal permesso di lettura che invece implica
-che si può leggere il contenuto della directory.
+essere attraversata nella risoluzione del \textit{pathname}, ed è distinto dal
+permesso di lettura che invece implica che si può leggere il contenuto della
+directory.
 
 Questo significa che se si ha il permesso di esecuzione senza permesso di
 lettura si potrà lo stesso aprire un file in una directory (se si hanno i
@@ -3513,13 +3787,13 @@ shell, od un altro tipo di file eseguibile riconosciuto dal kernel), occorre
 avere il permesso di esecuzione, inoltre solo i file regolari possono essere
 eseguiti.
 
-I permessi per un link simbolico sono ignorati, contano quelli del file a cui
-fa riferimento; per questo in genere il comando \cmd{ls} riporta per un link
-simbolico tutti i permessi come concessi; utente e gruppo a cui esso
-appartiene vengono pure ignorati quando il link viene risolto, vengono
-controllati solo quando viene richiesta la rimozione del link e quest'ultimo è
-in una directory con lo \itindex{sticky~bit} \textit{sticky bit} impostato (si
-veda sez.~\ref{sec:file_special_perm}).
+I permessi per un collegamento simbolico sono ignorati, contano quelli del
+file a cui fa riferimento; per questo in genere il comando \cmd{ls} riporta
+per un collegamento simbolico tutti i permessi come concessi; utente e gruppo
+a cui esso appartiene vengono pure ignorati quando il collegamento viene
+risolto, vengono controllati solo quando viene richiesta la rimozione del
+collegamento e quest'ultimo è in una directory con lo \itindex{sticky~bit}
+\textit{sticky bit} impostato (si veda sez.~\ref{sec:file_special_perm}).
 
 La procedura con cui il kernel stabilisce se un processo possiede un certo
 permesso (di lettura, scrittura o esecuzione) si basa sul confronto fra
@@ -3731,8 +4005,8 @@ riportate in tab.~\ref{tab:file_access_mode_val} (attraverso un OR binario
 delle stesse). I primi tre valori implicano anche la verifica dell'esistenza
 del file, se si vuole verificare solo quest'ultima si può usare \const{F\_OK},
 o anche direttamente \func{stat}. Nel caso in cui \param{pathname} si
-riferisca ad un link simbolico, questo viene seguito ed il controllo è fatto
-sul file a cui esso fa riferimento.
+riferisca ad un collegamento simbolico, questo viene seguito ed il controllo è
+fatto sul file a cui esso fa riferimento.
 
 La funzione controlla solo i bit dei permessi di accesso, si ricordi che il
 fatto che una directory abbia permesso di scrittura non significa che ci si
@@ -3906,8 +4180,8 @@ lettura), che però può fornire un valore che è lo stesso per tutti e tre i
 permessi di sez.~\ref{sec:file_perm_overview} (cioè $666$ nel primo caso e
 $222$ nel secondo). Per questo motivo il sistema associa ad ogni
 processo\footnote{è infatti contenuta nel campo \var{umask} della struttura
-  \struct{fs\_struct}, vedi fig.~\ref{fig:proc_task_struct}.}  una maschera di
-bit, la cosiddetta \textit{umask}, che viene utilizzata per impedire che
+  \kstruct{fs\_struct}, vedi fig.~\ref{fig:proc_task_struct}.}  una maschera
+di bit, la cosiddetta \textit{umask}, che viene utilizzata per impedire che
 alcuni permessi possano essere assegnati ai nuovi file in sede di creazione. I
 bit indicati nella maschera vengono infatti cancellati dai permessi quando un
 nuovo file viene creato.\footnote{l'operazione viene fatta sempre: anche
@@ -4020,15 +4294,16 @@ quote.  L'amministratore può cambiare sempre il gruppo di un file, il
 proprietario può cambiare il gruppo solo dei file che gli appartengono e solo
 se il nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte.
 
-La funzione \func{chown} segue i link simbolici, per operare direttamente su
-un link simbolico si deve usare la funzione \func{lchown}.\footnote{fino alla
-  versione 2.1.81 in Linux \func{chown} non seguiva i link simbolici, da
-  allora questo comportamento è stato assegnato alla funzione \func{lchown},
-  introdotta per l'occasione, ed è stata creata una nuova system call per
-  \func{chown} che seguisse i link simbolici.} La funzione \func{fchown} opera
-su un file aperto, essa è mutuata da BSD, ma non è nello standard POSIX.
-Un'altra estensione rispetto allo standard POSIX è che specificando -1 come
-valore per \param{owner} e \param{group} i valori restano immutati.
+La funzione \func{chown} segue i collegamenti simbolici, per operare
+direttamente su un collegamento simbolico si deve usare la funzione
+\func{lchown}.\footnote{fino alla versione 2.1.81 in Linux \func{chown} non
+  seguiva i collegamenti simbolici, da allora questo comportamento è stato
+  assegnato alla funzione \func{lchown}, introdotta per l'occasione, ed è
+  stata creata una nuova \textit{system call} per \func{chown} che seguisse i
+  collegamenti simbolici.} La funzione \func{fchown} opera su un file aperto,
+essa è mutuata da BSD, ma non è nello standard POSIX.  Un'altra estensione
+rispetto allo standard POSIX è che specificando -1 come valore
+per \param{owner} e \param{group} i valori restano immutati.
 
 Quando queste funzioni sono chiamate con successo da un processo senza i
 privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e
@@ -4124,10 +4399,11 @@ caso si è riapplicato ai bit di \itindex{suid~bit} \textit{suid},
 \itindex{sgid~bit} \textit{sgid} e \textit{sticky} \itindex{sticky~bit} la
 notazione illustrata in fig.~\ref{fig:file_perm_bit}.
 
-Si ricordi infine che i permessi non hanno alcun significato per i link
-simbolici, mentre per i \index{file!di~dispositivo} file di dispositivo hanno
-senso soltanto i permessi di lettura e scrittura, che si riflettono sulla
-possibilità di compiere dette operazioni sul dispositivo stesso.
+Si ricordi infine che i permessi non hanno alcun significato per i
+collegamenti simbolici, mentre per i \index{file!di~dispositivo} file di
+dispositivo hanno senso soltanto i permessi di lettura e scrittura, che si
+riflettono sulla possibilità di compiere dette operazioni sul dispositivo
+stesso.
 
 Nella tabella si è indicato con il carattere ``-'' il fatto che il valore del
 bit in questione non è influente rispetto a quanto indicato nella riga della
@@ -4272,7 +4548,7 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è
   stato caricato nessun modulo di sicurezza l'accesso in lettura sarà
   consentito a tutti i processi, mentre quello in scrittura solo ai processi
-  con privilegi amministrativi dotati della \index{capabilities}
+  con privilegi amministrativi dotati della \itindex{capabilities}
   \textit{capability} \const{CAP\_SYS\_ADMIN}.
 
 \item[\texttt{system}] Anche l'accesso agli \textit{extended system
@@ -4282,13 +4558,13 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   lettura ai processi che hanno la capacità di eseguire una ricerca sul file
   (cioè hanno il permesso di lettura sulla directory che contiene il file) ed
   in scrittura al proprietario del file o ai processi dotati della
-  \textit{capability} \index{capabilities} \const{CAP\_FOWNER}.\footnote{vale
-    a dire una politica di accesso analoga a quella impiegata per gli ordinari
-    permessi dei file.}
+  \textit{capability} \itindex{capabilities}
+  \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a
+    quella impiegata per gli ordinari permessi dei file.}
 
 \item[\texttt{trusted}] L'accesso ai \textit{trusted extended attributes}, sia
   per la lettura che per la scrittura, è consentito soltanto ai processi con
-  privilegi amministrativi dotati della \index{capabilities}
+  privilegi amministrativi dotati della \itindex{capabilities}
   \textit{capability} \const{CAP\_SYS\_ADMIN}. In questo modo si possono
   utilizzare questi attributi per realizzare in user space dei meccanismi di
   controllo che accedono ad informazioni non disponibili ai processi ordinari.
@@ -4302,24 +4578,24 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   directory ordinarie, se valesse in generale infatti si avrebbe un serio
   problema di sicurezza dato che esistono diversi oggetti sul filesystem per i
   quali è normale avere avere il permesso di scrittura consentito a tutti gli
-  utenti, come i link simbolici, o alcuni \index{file!di~dispositivo} file di
-  dispositivo come \texttt{/dev/null}. Se fosse possibile usare su di essi gli
-  \textit{extended user attributes} un utente qualunque potrebbe inserirvi
-  dati a piacere.\footnote{la cosa è stata notata su XFS, dove questo
-    comportamento permetteva, non essendovi limiti sullo spazio occupabile
-    dagli \textit{Extended Attributes}, di bloccare il sistema riempiendo il
-    disco.}
+  utenti, come i collegamenti simbolici, o alcuni \index{file!di~dispositivo}
+  file di dispositivo come \texttt{/dev/null}. Se fosse possibile usare su di
+  essi gli \textit{extended user attributes} un utente qualunque potrebbe
+  inserirvi dati a piacere.\footnote{la cosa è stata notata su XFS, dove
+    questo comportamento permetteva, non essendovi limiti sullo spazio
+    occupabile dagli \textit{Extended Attributes}, di bloccare il sistema
+    riempiendo il disco.}
 
   La semantica del controllo di accesso indicata inoltre non avrebbe alcun
   senso al di fuori di file e directory: i permessi di lettura e scrittura per
   un \index{file!di~dispositivo} file di dispositivo attengono alle capacità
   di accesso al dispositivo sottostante,\footnote{motivo per cui si può
     formattare un disco anche se \texttt{/dev} è su un filesystem in sola
-    lettura.} mentre per i link simbolici questi vengono semplicemente
+    lettura.} mentre per i collegamenti simbolici questi vengono semplicemente
   ignorati: in nessuno dei due casi hanno a che fare con il contenuto del
   file, e nella discussione relativa all'uso degli \textit{extended user
     attributes} nessuno è mai stato capace di indicare una qualche forma
-  sensata di utilizzo degli stessi per link simbolici o
+  sensata di utilizzo degli stessi per collegamenti simbolici o
   \index{file!di~dispositivo} file di dispositivo, e neanche per le fifo o i
   socket.  Per questo motivo essi sono stati completamente disabilitati per
   tutto ciò che non sia un file regolare o una directory.\footnote{si può
@@ -4330,12 +4606,12 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi:
   per evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit}
   \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended
     user attributes} soltanto se si è proprietari della stessa, o si hanno i
-  privilegi amministrativi della capability \index{capabilities}
+  privilegi amministrativi della capability \itindex{capabilities}
   \const{CAP\_FOWNER}.
 \end{basedescript}
 
 Le funzioni per la gestione degli attributi estesi, come altre funzioni di
-gestione avanzate specifiche di Linux, non fanno parte delle \acr{glibc}, e
+gestione avanzate specifiche di Linux, non fanno parte della \acr{glibc}, e
 sono fornite da una apposita libreria, \texttt{libattr}, che deve essere
 installata a parte;\footnote{la versione corrente della libreria è
   \texttt{libattr1}.}  pertanto se un programma le utilizza si dovrà indicare
@@ -4344,8 +4620,8 @@ l'opzione \texttt{-lattr}.
 
 Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
 \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
-rispettivamente di richiedere gli attributi relativi a un file, a un link
-simbolico e ad un file descriptor; i rispettivi prototipi sono:
+rispettivamente di richiedere gli attributi relativi a un file, a un
+collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{attr/xattr.h} 
@@ -4376,12 +4652,12 @@ simbolico e ad un file descriptor; i rispettivi prototipi sono:
 \end{functions}
 
 Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento
-un pathname che indica il file di cui si vuole richiedere un attributo, la
-sola differenza è che la seconda, se il pathname indica un link simbolico,
-restituisce gli attributi di quest'ultimo e non quelli del file a cui esso fa
-riferimento. La funzione \func{fgetxattr} prende invece come primo argomento
-un numero di file descriptor, e richiede gli attributi del file ad esso
-associato.
+un \textit{pathname} che indica il file di cui si vuole richiedere un
+attributo, la sola differenza è che la seconda, se il \textit{pathname} indica
+un collegamento simbolico, restituisce gli attributi di quest'ultimo e non
+quelli del file a cui esso fa riferimento. La funzione \func{fgetxattr} prende
+invece come primo argomento un numero di file descriptor, e richiede gli
+attributi del file ad esso associato.
 
 Tutte e tre le funzioni richiedono di specificare nell'argomento \param{name}
 il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere
@@ -4406,7 +4682,7 @@ sufficienti.\footnote{si parla di stima perché anche se le funzioni
 Un secondo gruppo di funzioni è quello che consente di impostare il valore di
 un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e
 \funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un
-link simbolico o specificando un file descriptor; i loro prototipi sono:
+collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{attr/xattr.h} 
@@ -4488,7 +4764,7 @@ presenti; a questo provvedono le funzioni \funcd{listxattr},
 \end{functions}
 
 Come per le precedenti le tre funzioni leggono gli attributi rispettivamente
-di un file, un link simbolico o specificando un file descriptor, da
+di un file, un collegamento simbolico o specificando un file descriptor, da
 specificare con il loro primo argomento. Gli altri due argomenti, identici per
 tutte e tre, indicano rispettivamente il puntatore \param{list} al buffer dove
 deve essere letta la lista e la dimensione \param{size} di quest'ultimo.
@@ -4532,10 +4808,11 @@ un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
 \end{functions}
 
 Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento
-\param{name} rispettivamente di un file, un link simbolico o specificando un
-file descriptor, da specificare con il loro primo argomento.  Anche in questo
-caso l'argomento \param{name} deve essere specificato con le modalità già
-illustrate in precedenza per le altre funzioni relative agli attributi estesi.
+\param{name} rispettivamente di un file, un collegamento simbolico o
+specificando un file descriptor, da specificare con il loro primo argomento.
+Anche in questo caso l'argomento \param{name} deve essere specificato con le
+modalità già illustrate in precedenza per le altre funzioni relative agli
+attributi estesi.
 
 \itindend{Extended~Attributes}
 
@@ -4580,7 +4857,7 @@ tramite una libreria, \texttt{libacl} che nasconde i dettagli implementativi
 delle ACL e presenta ai programmi una interfaccia che fa riferimento allo
 standard POSIX 1003.1e.
 
-Anche in questo caso le funzioni di questa libreria non fanno parte delle
+Anche in questo caso le funzioni di questa libreria non fanno parte della
 \acr{glibc} e devono essere installate a parte;\footnote{la versione corrente
   della libreria è \texttt{libacl1}, e nel caso si usi Debian la si può
   installare con il pacchetto omonimo e con il collegato \texttt{libacl1-dev}
@@ -4604,7 +4881,7 @@ può impostare una ACL aggiuntiva, detta \textit{default ACL}, che serve ad
 indicare quale dovrà essere la ACL assegnata di default nella creazione di un
 file all'interno della directory stessa. Come avviene per i permessi le ACL
 possono essere impostate solo del proprietario del file, o da un processo con
-la capability \index{capabilities} \const{CAP\_FOWNER}.
+la capability \itindex{capabilities} \const{CAP\_FOWNER}.
 
 \begin{table}[htb]
   \centering
@@ -4912,12 +5189,13 @@ sono:
 
 Le due funzioni ritornano, con un oggetto di tipo \type{acl\_t}, il valore
 della ACL correntemente associata ad un file, che può essere identificato
-tramite un file descriptor usando \func{acl\_get\_fd} o con un pathname usando
-\func{acl\_get\_file}. Nel caso di quest'ultima funzione, che può richiedere
-anche la ACL relativa ad una directory, il secondo argomento \param{type}
-consente di specificare se si vuole ottenere la ACL di default o quella di
-accesso. Questo argomento deve essere di tipo \type{acl\_type\_t} e può
-assumere solo i due valori riportati in tab.~\ref{tab:acl_type}.
+tramite un file descriptor usando \func{acl\_get\_fd} o con un
+\textit{pathname} usando \func{acl\_get\_file}. Nel caso di quest'ultima
+funzione, che può richiedere anche la ACL relativa ad una directory, il
+secondo argomento \param{type} consente di specificare se si vuole ottenere la
+ACL di default o quella di accesso. Questo argomento deve essere di tipo
+\type{acl\_type\_t} e può assumere solo i due valori riportati in
+tab.~\ref{tab:acl_type}.
 
 \begin{table}[htb]
   \centering
@@ -5244,19 +5522,20 @@ directory, ed il cui prototipo è:
 \end{functions}
 
 La funzione consente di assegnare la ACL contenuta in \param{acl} al file o
-alla directory indicate dal pathname \param{path}, mentre con \param{type} si
-indica il tipo di ACL utilizzando le costanti di tab.~\ref{tab:acl_type}, ma
-si tenga presente che le ACL di default possono essere solo impostate
-qualora \param{path} indichi una directory. Inoltre perché la funzione abbia
-successo la ACL dovrà essere valida, e contenere tutti le voci necessarie,
-unica eccezione è quella in cui si specifica una ACL vuota per cancellare la
-ACL di default associata a \func{path}.\footnote{questo però è una estensione
-  della implementazione delle ACL di Linux, la bozza di standard POSIX.1e
-  prevedeva l'uso della apposita funzione \funcd{acl\_delete\_def\_file}, che
-  prende come unico argomento il pathname della directory di cui si vuole
-  cancellare l'ACL di default, per i dettagli si ricorra alla pagina di
-  manuale.}  La seconda funzione che consente di impostare una ACL è
-\funcd{acl\_set\_fd}, ed il suo prototipo è:
+alla directory indicate dal \textit{pathname} \param{path}, mentre
+con \param{type} si indica il tipo di ACL utilizzando le costanti di
+tab.~\ref{tab:acl_type}, ma si tenga presente che le ACL di default possono
+essere solo impostate qualora \param{path} indichi una directory. Inoltre
+perché la funzione abbia successo la ACL dovrà essere valida, e contenere
+tutti le voci necessarie, unica eccezione è quella in cui si specifica una ACL
+vuota per cancellare la ACL di default associata a
+\param{path}.\footnote{questo però è una estensione della implementazione delle
+  ACL di Linux, la bozza di standard POSIX.1e prevedeva l'uso della apposita
+  funzione \funcd{acl\_delete\_def\_file}, che prende come unico argomento il
+  \textit{pathname} della directory di cui si vuole cancellare l'ACL di
+  default, per i dettagli si ricorra alla pagina di manuale.}  La seconda
+funzione che consente di impostare una ACL è \funcd{acl\_set\_fd}, ed il suo
+prototipo è:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/acl.h}
@@ -5436,11 +5715,12 @@ caso \param{type} deve essere rispettivamente \const{USRQUOTA} o
     \hline
     \const{Q\_QUOTAON}  & Attiva l'applicazione delle quote disco per il
                           filesystem indicato da \param{dev}, si deve passare
-                          in \param{addr} il pathname al file che mantiene le
-                          quote, che deve esistere, e \param{id} deve indicare
-                          la versione del formato con uno dei valori di
-                          tab.~\ref{tab:quotactl_id_format}; l'operazione
-                          richiede i privilegi di amministratore.\\
+                          in \param{addr} il \textit{pathname} al file che
+                          mantiene le quote, che deve esistere, e \param{id}
+                          deve indicare la versione del formato con uno dei
+                          valori di tab.~\ref{tab:quotactl_id_format};
+                          l'operazione richiede i privilegi di
+                          amministratore.\\
     \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il
                           filesystem indicato da \param{dev}, \param{id}
                           e \param{addr} vengono ignorati; l'operazione
@@ -6333,11 +6613,11 @@ Una terza \textit{capability} con vasto campo di applicazione è
 \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
 come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
 disattivare la swap, montare, rimontare e smontare filesystem (vedi
-sez.~\ref{sec:sys_file_config}), effettuare operazioni di controllo su
+sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su
 qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare
 sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted}
-(vedi sez.~\ref{sec:file_xattr}), specificare un \ids{UID} arbitrario
-nella trasmissione delle credenziali dei socket (vedi
+(vedi sez.~\ref{sec:file_xattr}), specificare un \ids{UID} arbitrario nella
+trasmissione delle credenziali dei socket (vedi
 sez.~\ref{sec:socket_credential_xxx}), assegnare classi privilegiate
 (\const{IOPRIO\_CLASS\_RT} e prima del kernel 2.6.25 anche
 \const{IOPRIO\_CLASS\_IDLE}) per lo scheduling dell'I/O (vedi
@@ -6458,7 +6738,7 @@ Dato che le precedenti funzioni, oltre ad essere specifiche di Linux, non
 garantiscono la stabilità nell'interfaccia, è sempre opportuno effettuare la
 gestione delle \textit{capabilities} utilizzando le funzioni di libreria a
 questo dedicate. Queste funzioni, che seguono quanto previsto nelle bozze
-dello standard POSIX.1e, non fanno parte delle \acr{glibc} e sono fornite in
+dello standard POSIX.1e, non fanno parte della \acr{glibc} e sono fornite in
 una libreria a parte,\footnote{la libreria è \texttt{libcap2}, nel caso di
   Debian può essere installata con il pacchetto omonimo.} pertanto se un
 programma le utilizza si dovrà indicare esplicitamente l'uso della suddetta
@@ -6809,7 +7089,7 @@ con \func{cap\_free}.
 Alle due funzioni citate se ne aggiungono altre due che consentono di
 convertire i valori delle costanti di tab.~\ref{tab:proc_capabilities} nelle
 stringhe usate nelle rispettive rappresentazioni e viceversa. Le due funzioni,
-\func{cap\_to\_name} e \func{cap\_from\_name}, sono estensioni specifiche di
+\funcd{cap\_to\_name} e \funcd{cap\_from\_name}, sono estensioni specifiche di
 Linux ed i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{sys/capability.h}
@@ -6979,7 +7259,7 @@ questa sezione.
 Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una
 \index{directory~di~lavoro} directory di lavoro, ha anche una directory
 \textsl{radice}\footnote{entrambe sono contenute in due campi (rispettivamente
-  \var{pwd} e \var{root}) di \struct{fs\_struct}; vedi
+  \var{pwd} e \var{root}) di \kstruct{fs\_struct}; vedi
   fig.~\ref{fig:proc_task_struct}.} che, pur essendo di norma corrispondente
 alla radice dell'albero di file e directory come visto dal kernel (ed
 illustrato in sez.~\ref{sec:file_pathname}), ha per il processo il significato
@@ -6990,8 +7270,8 @@ specifico di directory rispetto alla quale vengono risolti i
 sia specificato per ogni processo apre allora la possibilità di modificare le
 modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo
 cambiando questa directory, così come si fa coi
-\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la \index{directory~di~lavoro} directory
-di lavoro.
+\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la
+\index{directory~di~lavoro} directory di lavoro.
 
 Normalmente la directory radice di un processo coincide anche con la radice
 del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal
@@ -7079,7 +7359,7 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  name TYPE OFF RECLEN UNKNOWN REG SOCK CHR BLK type IFTODT DTTOIF
 % LocalWords:  DTYPE off reclen seekdir telldir void rewinddir closedir select
 % LocalWords:  namelist compar malloc qsort alphasort versionsort strcoll myls
-% LocalWords:  strcmp DirScan direntry while current working home shell pwd get
+% LocalWords:  strcmp direntry while current working home shell pwd get
 % LocalWords:  getcwd ERANGE getwd change fd race condition tmpnam getfacl mark
 % LocalWords:  string tmpdir TMP tempnam pfx TMPNAME suid tmp EXCL tmpfile pid
 % LocalWords:  EINTR mktemp mkstemp stlib template filename XXXXXX OpenBSD buf
@@ -7124,12 +7404,16 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  Python Truelite Srl quotamodule Repository who nell' dall' KEEP
 % LocalWords:  SECURE KEEPCAPS prctl FIXUP NOROOT LOCKED dell'IPC dell'I IOPRIO
 % LocalWords:  CAPBSET CLASS IDLE dcookie overflow DIFFERS Virtual everything
-% LocalWords:  dentry register resolution cache dcache operation llseek poll
-% LocalWords:  multiplexing fsync fasync seek block superblock gapil tex img
+% LocalWords:  dentry register resolution cache dcache operation llseek poll ln
+% LocalWords:  multiplexing fsync fasync seek block superblock gapil tex img du
 % LocalWords:  second linked journaled source filesystemtype unsigned device
 % LocalWords:  mountflags NODEV ENXIO dummy devfs magic MGC RDONLY NOSUID MOVE
 % LocalWords:  NOEXEC SYNCHRONOUS REMOUNT MANDLOCK NODIRATIME umount MNT statfs
 % LocalWords:  fstatfs fstab mntent ino bound orig new setpcap metadati sysfs
+% LocalWords:  bind DIRSYNC lsattr Hierarchy FHS SHARED UNBINDABLE shared REC
+% LocalWords:  subtree SILENT log unbindable BUSY EAGAIN EXPIRE DETACH NOFOLLOW
+% LocalWords:  lazy encfs sshfs setfsent getfsent getfsfile getfsspec endfsent
+% LocalWords:  setmntent getmntent addmntent endmntent hasmntopt such
 
 %%% Local Variables: 
 %%% mode: latex