Altre indicizzazioni e recupero dei pezzi tagliati per sbaglio
[gapil.git] / fileio.tex
index c5b777cee63903de863bbaed5e71f3afefc8d079..9e7e960569f0ebc65beb52717d5c8601a10daade 100644 (file)
@@ -1,6 +1,6 @@
 %% fileio.tex (merge fileunix.tex - filestd.tex)
 %%
-%% Copyright (C) 2000-2013 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2015 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -29,13 +29,13 @@ ultime le caratteristiche più avanzate.
 
 
 Come visto in sez.~\ref{sec:file_vfs_work} il kernel mette a disposizione
-tramite il \itindex{Virtual~File~System} \textit{Virtual File System} una
-serie di \textit{system call} che consentono di operare sui file in maniera
-generale. Abbiamo trattato quelle relative alla gestione delle proprietà dei
-file nel precedente capitolo, vedremo quelle che si applicano al contenuto dei
-file in questa sezione, iniziando con una breve introduzione sull'architettura
-dei \textit{file descriptor} per poi trattare le funzioni di base e le
-modalità con cui consentono di gestire i dati memorizzati sui file.
+tramite il \textit{Virtual File System} una serie di \textit{system call} che
+consentono di operare sui file in maniera generale. Abbiamo trattato quelle
+relative alla gestione delle proprietà dei file nel precedente capitolo,
+vedremo quelle che si applicano al contenuto dei file in questa sezione,
+iniziando con una breve introduzione sull'architettura dei \textit{file
+  descriptor} per poi trattare le funzioni di base e le modalità con cui
+consentono di gestire i dati memorizzati sui file.
 
 
 \subsection{I \textit{file descriptor}}
@@ -53,10 +53,10 @@ comunicazione con il kernel che renda possibile operare su di esso. Questo si
 fa aprendo il file con la funzione \func{open} (vedi
 sez.~\ref{sec:file_open_close}) che provvederà a localizzare \itindex{inode}
 l'\textit{inode} del file e inizializzare i puntatori che rendono disponibili
-le funzioni che il \itindex{Virtual~File~System} VFS mette a disposizione
-(quelle di tab.~\ref{tab:file_file_operations}). Una volta terminate le
-operazioni, il file dovrà essere chiuso, e questo chiuderà il canale di
-comunicazione impedendo ogni ulteriore operazione.
+le funzioni che il VFS mette a disposizione (quelle di
+tab.~\ref{tab:file_file_operations}). Una volta terminate le operazioni, il
+file dovrà essere chiuso, e questo chiuderà il canale di comunicazione
+impedendo ogni ulteriore operazione.
 
 All'interno di ogni processo i file aperti sono identificati da un numero
 intero non negativo, che viene chiamato \textit{file descriptor}.  Quando un
@@ -64,32 +64,34 @@ file viene aperto la funzione \func{open} restituisce questo numero, tutte le
 ulteriori operazioni dovranno essere compiute specificando questo stesso
 numero come argomento alle varie funzioni dell'interfaccia.
 
+\itindbeg{process~table}
+\itindbeg{file~table}
+
 Per capire come funziona il meccanismo occorre spiegare a grandi linee come il
 kernel gestisce l'interazione fra processi e file.  Abbiamo già accennato in
 sez.~\ref{sec:proc_hierarchy} come il kernel mantenga un elenco di tutti
-processi nella cosiddetta \itindex{process~table} \textit{process table}. Lo
-stesso, come accennato in sez.~\ref{sec:file_vfs_work}, vale anche per tutti i
-file aperti, il cui elenco viene mantenuto nella cosiddetta
-\itindex{file~table} \textit{file table}.
-
-La \itindex{process~table} \textit{process table} è una tabella che contiene
-una voce per ciascun processo attivo nel sistema. Ciascuna voce è costituita
-dal puntatore a una struttura di tipo \kstruct{task\_struct} nella quale sono
-raccolte tutte le informazioni relative al processo, fra queste informazioni
-c'è anche il puntatore ad una ulteriore struttura di tipo
+processi nella cosiddetta \textit{process table}. Lo stesso, come accennato in
+sez.~\ref{sec:file_vfs_work}, vale anche per tutti i file aperti, il cui
+elenco viene mantenuto nella cosiddetta \textit{file table}.
+
+La \textit{process table} è una tabella che contiene una voce per ciascun
+processo attivo nel sistema. Ciascuna voce è costituita dal puntatore a una
+struttura di tipo \kstruct{task\_struct} nella quale sono raccolte tutte le
+informazioni relative al processo, fra queste informazioni c'è anche il
+puntatore ad una ulteriore struttura di tipo
 \kstruct{files\_struct},\footnote{la definizione corrente di questa struttura
   si trova nel file \texttt{include/linux/fdtable.h} dei sorgenti del kernel,
   quella mostrata in fig.~\ref{fig:file_proc_file} è una versione pesantemente
   semplificata.} che contiene le informazioni relative ai file che il processo
 ha aperto.
 
-La \itindex{file~table} \textit{file table} è una tabella che contiene una
-voce per ciascun file che è stato aperto nel sistema. Come accennato in
-sez.~\ref{sec:file_vfs_work} per ogni file aperto viene allocata una struttura
-\kstruct{file} e la \textit{file table} è costituita da un elenco di puntatori
-a ciascuna di queste strutture, che, come illustrato in
-fig.~\ref{fig:kstruct_file}, contengono le informazioni necessarie per la
-gestione dei file, ed in particolare:
+La \textit{file table} è una tabella che contiene una voce per ciascun file
+che è stato aperto nel sistema. Come accennato in sez.~\ref{sec:file_vfs_work}
+per ogni file aperto viene allocata una struttura \kstruct{file} e la
+\textit{file table} è costituita da un elenco di puntatori a ciascuna di
+queste strutture, che, come illustrato in fig.~\ref{fig:kstruct_file},
+contengono le informazioni necessarie per la gestione dei file, ed in
+particolare:
 \begin{itemize*}
 \item i flag di stato \itindex{file~status~flag} del file nel campo
   \var{f\_flags}.
@@ -115,13 +117,13 @@ gestione dei file, ed in particolare:
 
 In fig.~\ref{fig:file_proc_file} si è riportato uno schema semplificato in cui
 è illustrata questa architettura, ed in cui si sono evidenziate le
-interrelazioni fra la \itindex{file~table} \textit{file table}, la
-\itindex{process~table} \textit{process table} e le varie strutture di dati
-che il kernel mantiene per ciascun file e ciascun processo.
+interrelazioni fra la \textit{file table}, la \textit{process table} e le
+varie strutture di dati che il kernel mantiene per ciascun file e ciascun
+processo.
 
 Come si può notare alla fine il collegamento che consente di porre in
 relazione i file ed i processi è effettuato attraverso i dati mantenuti nella
-struttura \kstruct{files\_struct} essa infatti contiene alcune informazioni
+struttura \kstruct{files\_struct}, essa infatti contiene alcune informazioni
 essenziali come:
 \begin{itemize*}
 \item i flag relativi ai file aperti dal processo.
@@ -134,11 +136,14 @@ essenziali come:
 In questa infrastruttura un \textit{file descriptor} non è altro che l'intero
 positivo che indicizza quest'ultima tabella, e che consente di recuperare il
 puntatore alla struttura \kstruct{file} corrispondente al file aperto dal
-processo a cui era stato assegnato questo indice. Una volta ottenuta grazie
-al \textit{file descriptor} la struttura \kstruct{file} corrispondente al file
-voluto nella \itindex{file~table} \textit{file table}, il kernel potrà usare
-le funzioni messe disposizione dal VFS per eseguire sul file tutte le
-operazioni necessarie.
+processo a cui era stato assegnato questo indice. Una volta ottenuta grazie al
+\textit{file descriptor} la struttura \kstruct{file} corrispondente al file
+voluto nella \textit{file table}, il kernel potrà usare le funzioni messe
+disposizione dal VFS per eseguire sul file tutte le operazioni necessarie.
+
+\itindend{process~table}
+\itindend{file~table}
+
 
 Il meccanismo dell'apertura dei file prevede che venga sempre fornito il primo
 \textit{file descriptor} libero nella tabella, e per questo motivo essi
@@ -179,7 +184,7 @@ tab.~\ref{tab:file_std_files}.
                              \itindex{standard~output} \textit{standard
                                output}.\\
     \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
-      error}.\\
+                               error}.\\
     \hline
   \end{tabular}
   \caption{Costanti definite in \headfile{unistd.h} per i file standard.}
@@ -447,7 +452,7 @@ riletti da \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}).
 % TODO: aggiungere O_TMPFILE per la creazione di file temporanei senza che
 % questi appaiano sul filesystem, introdotto con il 3.11, vedi:
 % https://lwn.net/Articles/556512/, http://kernelnewbies.org/Linux_3.11
-% https://lwn.net/Articles/558598/
+% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/
 
 \footnotetext{acronimo di \itindex{Denial~of~Service~(DoS)} \textit{Denial of
     Service}, si chiamano così attacchi miranti ad impedire un servizio
@@ -467,11 +472,11 @@ sez.~\ref{sec:ipc_file_lock}). Si tenga presente che questa opzione è
 supportata su NFS solo a partire da NFSv3 e con il kernel 2.6, nelle versioni
 precedenti la funzionalità viene emulata controllando prima l'esistenza del
 file per cui usarla per creare \index{file!di lock} un file di lock potrebbe
-dar luogo a una \itindex{race~condition} \textit{race condition}.\footnote{un
-  file potrebbe venir creato fra il controllo la successiva apertura con
-  \const{O\_CREAT}, la cosa si può risolvere comunque creando un file con un
-  nome univoco ed usando la funzione \func{link} per creare il \index{file!di
-    lock} file di lock, (vedi sez.~\ref{sec:ipc_file_lock}).}
+dar luogo a una \textit{race condition}.\footnote{un file potrebbe venir
+  creato fra il controllo la successiva apertura con \const{O\_CREAT}, la cosa
+  si può risolvere comunque creando un file con un nome univoco ed usando la
+  funzione \func{link} per creare il \index{file!di lock} file di lock, (vedi
+  sez.~\ref{sec:ipc_file_lock}).}
 
 Se si usa \const{O\_EXCL} senza \const{O\_CREAT} il comportamento è
 indefinito.  Nella creazione di un file con \const{O\_CREAT} occorre sempre
@@ -500,9 +505,9 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
                            viene sempre aggiunto al contenuto precedente. Con
                            NFS questa funzionalità non è supportata 
                            e viene emulata, per questo possono verificarsi
-                           \itindex{race~condition} \textit{race 
-                             condition} con una sovrapposizione dei dati se
-                           più di un processo scrive allo stesso tempo.\\
+                           \textit{race condition} con una sovrapposizione dei
+                           dati se più di un processo scrive allo stesso
+                           tempo.\\ 
       \const{O\_ASYNC}   & Apre il file per l'I/O in modalità asincrona (vedi
                            sez.~\ref{sec:signal_driven_io}). Quando è
                            impostato viene generato il segnale \signal{SIGIO}
@@ -514,16 +519,15 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
                            in fase di apertura del file, deve
                            invece essere attivato successivamente con
                            \func{fcntl}.\\
-      \const{O\_CLOEXEC}&  Attiva la modalità di \itindex{close-on-exec}
-                           \textit{close-on-exec} (vedi
+      \const{O\_CLOEXEC}&  Attiva la modalità di \textit{close-on-exec} (vedi
                            sez.~\ref{sec:proc_exec}) sul file. Il flag è 
                            previsto dallo standard POSIX.1-2008, ed è stato
                            introdotto con il kernel 2.6.23 per evitare una
-                           \itindex{race~condition} \textit{race condition}
-                           che si potrebbe verificare con i \textit{thread}
-                           fra l'apertura del file e l'impostazione della
-                           suddetta modalità con \func{fcntl} (vedi
-                           sez.~\ref{sec:file_fcntl_ioctl}).\\
+                           \textit{race condition} che si potrebbe verificare
+                           con i \textit{thread} fra l'apertura del file e
+                           l'impostazione della suddetta modalità con
+                           \func{fcntl} (vedi
+                           sez.~\ref{sec:file_fcntl_ioctl}).\\ 
       \const{O\_DIRECT}  & Esegue l'I/O direttamente dalla memoria in
                            \textit{user space} in maniera sincrona, in modo da
                            scavalcare i meccanismi di bufferizzazione del
@@ -745,10 +749,10 @@ intero positivo che esprime il numero di byte dall'inizio del file. Tutte le
 operazioni di lettura e scrittura avvengono a partire da questa posizione che
 viene automaticamente spostata in avanti del numero di byte letti o scritti.
 
-In genere, a meno di non avere richiesto la modalità \itindex{append~mode} di
-\textit{append} con \const{O\_APPEND}, questa posizione viene impostata a zero
-all'apertura del file. È possibile impostarla ad un valore qualsiasi con la
-funzione di sistema \funcd{lseek}, il cui prototipo è:
+In genere, a meno di non avere richiesto la modalità di \textit{append} con
+\const{O\_APPEND}, questa posizione viene impostata a zero all'apertura del
+file. È possibile impostarla ad un valore qualsiasi con la funzione di sistema
+\funcd{lseek}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/types.h}
@@ -762,8 +766,9 @@ funzione di sistema \funcd{lseek}, il cui prototipo è:
   \begin{errlist}
     \item[\errcode{EINVAL}] \param{whence} non è un valore valido.
     \item[\errcode{EOVERFLOW}] \param{offset} non può essere rappresentato nel
-    \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo.
       tipo \type{off\_t}.
+    \item[\errcode{ESPIPE}] \param{fd} è una \textit{pipe}, un socket o una
+      \textit{fifo}.
   \end{errlist}
   ed inoltre \errval{EBADF} nel suo significato generico.}
 \end{funcproto}
@@ -825,8 +830,8 @@ Si tenga presente inoltre che usare \const{SEEK\_END} non assicura affatto che
 la successiva scrittura avvenga alla fine del file, infatti se questo è stato
 aperto anche da un altro processo che vi ha scritto, la fine del file può
 essersi spostata, ma noi scriveremo alla posizione impostata in precedenza
-(questa è una potenziale sorgente di \itindex{race~condition} \textit{race
-  condition}, vedi sez.~\ref{sec:file_shared_access}).
+(questa è una potenziale sorgente di \textit{race condition}, vedi
+sez.~\ref{sec:file_shared_access}).
 
 Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
 questo caso la funzione ritorna l'errore \errcode{ESPIPE}. Questo, oltre che
@@ -834,22 +839,23 @@ per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che
 non supportano questa funzione, come ad esempio per i file di
 terminale.\footnote{altri sistemi, usando \const{SEEK\_SET}, in questo caso
   ritornano il numero di caratteri che vi sono stati scritti.} Lo standard
-POSIX però non specifica niente in proposito. Inoltre alcuni
-\index{file!speciali} file speciali, ad esempio \file{/dev/null}, non causano
-un errore ma restituiscono un valore indefinito.
+POSIX però non specifica niente in proposito. Inoltre alcuni file speciali, ad
+esempio \file{/dev/null}, non causano un errore ma restituiscono un valore
+indefinito.
 
 \itindbeg{sparse~file} 
+\index{file!\textit{hole}|(} 
 
 Infine si tenga presente che, come accennato in sez.~\ref{sec:file_file_size},
 con \func{lseek} è possibile impostare una posizione anche oltre la corrente
 fine del file. In tal caso alla successiva scrittura il file sarà esteso a
 partire da detta posizione, con la creazione di quello che viene chiamato
-\index{file!\textit{hole}} ``\textsl{buco}'' (in gergo \textit{hole}) nel
-file.  Il nome deriva dal fatto che nonostante la dimensione del file sia
-cresciuta in seguito alla scrittura effettuata, lo spazio vuoto fra la
-precedente fine del file ed la nuova parte scritta dopo lo spostamento non
-corrisponde ad una allocazione effettiva di spazio su disco, che sarebbe
-inutile dato che quella zona è effettivamente vuota.
+``\textsl{buco}'' (in gergo \textit{hole}) nel file.  Il nome deriva dal fatto
+che nonostante la dimensione del file sia cresciuta in seguito alla scrittura
+effettuata, lo spazio vuoto fra la precedente fine del file ed la nuova parte
+scritta dopo lo spostamento non corrisponde ad una allocazione effettiva di
+spazio su disco, che sarebbe inutile dato che quella zona è effettivamente
+vuota.
 
 Questa è una delle caratteristiche specifiche della gestione dei file di un
 sistema unix-like e si dice che il file in questione è uno \textit{sparse
@@ -894,19 +900,18 @@ inutilizzato.
 A partire dal kernel 3.1, riprendendo una interfaccia adottata su Solaris,
 sono state aggiunti due nuovi valori per l'argomento \param{whence}, riportati
 nella seconda sezione di tab.~\ref{tab:lseek_whence_values}, che consentono di
-riconoscere la presenza di \index{file!\textit{hole}} \textit{hole}
-all'interno dei file ad uso di quelle applicazioni (come i programmi di
-backup) che possono salvare spazio disco nella copia degli \textit{sparse
-  file}. Una applicazione può così determinare la presenza di un
-\index{file!\textit{hole}} \textit{hole} usando \const{SEEK\_HOLE} all'inizio
-del file e determinare poi l'inizio della successiva sezione di dati usando
+riconoscere la presenza di \textit{hole} all'interno dei file ad uso di quelle
+applicazioni (come i programmi di backup) che possono salvare spazio disco
+nella copia degli \textit{sparse file}. Una applicazione può così determinare
+la presenza di un \textit{hole} usando \const{SEEK\_HOLE} all'inizio del file
+e determinare poi l'inizio della successiva sezione di dati usando
 \const{SEEK\_DATA}. Per compatibilità con i filesystem che non supportano
 questa funzionalità è previsto comunque che in tal caso \const{SEEK\_HOLE}
 riporti sempre la fine del file e \const{SEEK\_DATA} il valore
 di \param{offset}.
 
 Inoltre la decisione di come riportare (o di non riportare) la presenza di un
-\index{file!\textit{hole}} buco in un file è lasciata all'implementazione del
+buco in un file è lasciata all'implementazione del
 filesystem, dato che esistono vari motivi per cui una sezione di un file può
 non contenere dati ed essere riportata come tale (ad esempio può essere stata
 preallocata con \func{fallocate}, vedi sez.~\ref{sec:file_fadvise}) oltre a
@@ -915,6 +920,7 @@ valori non garantisce la mappatura della effettiva allocazione dello spazio
 disco di un file, per il quale esiste una specifica operazione di controllo
 (vedi sez.~\ref{sec:file_fcntl_ioctl}).
 
+\index{file!\textit{hole}|)} 
 
 
 \subsection{Le funzioni per la lettura di un file}
@@ -969,12 +975,12 @@ continuare a ricevere zero come valore di ritorno.
 
 Con i \textsl{file regolari} questa è l'unica situazione in cui si può avere
 un numero di byte letti inferiore a quello richiesto, ma questo non è vero
-quando si legge da un terminale, da una fifo o da una pipe. In tal caso
-infatti, se non ci sono dati in ingresso, la \func{read} si blocca (a meno di
-non aver selezionato la modalità non bloccante, vedi
-sez.~\ref{sec:file_noblocking}) e ritorna solo quando ne arrivano; se il numero
-di byte richiesti eccede quelli disponibili la funzione ritorna comunque, ma
-con un numero di byte inferiore a quelli richiesti.
+quando si legge da un terminale, da una \textit{fifo} o da una
+\textit{pipe}. In tal caso infatti, se non ci sono dati in ingresso, la
+\func{read} si blocca (a meno di non aver selezionato la modalità non
+bloccante, vedi sez.~\ref{sec:file_noblocking}) e ritorna solo quando ne
+arrivano; se il numero di byte richiesti eccede quelli disponibili la funzione
+ritorna comunque, ma con un numero di byte inferiore a quelli richiesti.
 
 Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un socket,
 come vedremo in sez.~\ref{sec:sock_io_behav}), o per la lettura da certi file
@@ -1062,7 +1068,7 @@ prototipo è:
 {La funzione ritorna il numero di byte scritti in caso di successo e $-1$ per
   un errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EAGAIN}] ci siq sarebbe bloccati, ma il file era aperto in
+  \item[\errcode{EAGAIN}] ci si sarebbe bloccati, ma il file era aperto in
     modalità \const{O\_NONBLOCK}.
   \item[\errcode{EFBIG}] si è cercato di scrivere oltre la dimensione massima
     consentita dal filesystem o il limite per le dimensioni dei file del
@@ -1071,10 +1077,10 @@ prototipo è:
     potuto scrivere qualsiasi dato.
   \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
     la scrittura o si è usato \const{O\_DIRECT} ed il buffer non è allineato.
-  \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è
-    chiuso in lettura; in questo caso viene anche generato il segnale
-    \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la
-    funzione ritorna questo errore.
+  \item[\errcode{EPIPE}] \param{fd} è connesso ad una \textit{pipe} il cui
+    altro capo è chiuso in lettura; in questo caso viene anche generato il
+    segnale \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato)
+    la funzione ritorna questo errore.
   \end{errlist}
   ed inoltre \errval{EBADF}, \errval{EFAULT}, \errval{EIO}, \errval{EISDIR},
   \errval{ENOSPC} nel loro significato generico.}
@@ -1084,7 +1090,7 @@ prototipo è:
 Come nel caso di \func{read} la funzione tenta di scrivere \param{count} byte
 a partire dalla posizione corrente nel file e sposta automaticamente la
 posizione in avanti del numero di byte scritti. Se il file è aperto in
-modalità \itindex{append~mode} \const{O\_APPEND} i dati vengono sempre scritti
+modalità \textit{append} con \const{O\_APPEND} i dati vengono sempre scritti
 alla fine del file.  Lo standard POSIX richiede che i dati scritti siano
 immediatamente disponibili ad una \func{read} chiamata dopo che la
 \func{write} che li ha scritti è ritornata; ma dati i meccanismi di caching
@@ -1235,13 +1241,12 @@ meccanismi di sincronizzazione espliciti come il \itindex{file~locking}
 Un caso tipico di necessità di accesso condiviso in scrittura è quello in cui
 vari processi devono scrivere alla fine di un file (ad esempio un file di
 log). Come accennato in sez.~\ref{sec:file_lseek} impostare la posizione alla
-fine del file e poi scrivere può condurre ad una \itindex{race~condition}
-\textit{race condition}l infatti può succedere che un secondo processo scriva
-alla fine del file fra la \func{lseek} e la \func{write}. In questo caso, come
-abbiamo appena visto, il file sarà esteso, ma il primo processo, che avrà la
-posizione corrente che aveva impostato con la \func{lseek} che non corrisponde
-più alla fine del file, e la sua successiva \func{write} sovrascriverà i dati
-del secondo processo.
+fine del file e poi scrivere può condurre ad una \textit{race condition};
+infatti può succedere che un secondo processo scriva alla fine del file fra la
+\func{lseek} e la \func{write}. In questo caso, come abbiamo appena visto, il
+file sarà esteso, ma il primo processo, avrà una posizione corrente che aveva
+impostato con la \func{lseek} che non corrisponde più alla fine del file, e la
+sua successiva \func{write} sovrascriverà i dati del secondo processo.
 
 Il problema deriva dal fatto che usare due \textit{system call} in successione
 non è mai un'operazione atomica dato che il kernel può interrompere
@@ -1307,17 +1312,16 @@ che quello che viene modificato è lo stesso campo nella voce della
 L'unica differenza fra due file descriptor duplicati è che ciascuno avrà un
 suo \textit{file descriptor flag} indipendente. A questo proposito deve essere
 tenuto presente che nel caso in cui si usi \func{dup} per duplicare un file
-descriptor, se questo ha il flag di \textit{close-on-exec}
-\itindex{close-on-exec} attivo (vedi sez.~\ref{sec:proc_exec} e
-sez.~\ref{sec:file_fcntl_ioctl}), questo verrà cancellato nel file descriptor
-restituito come copia.
+descriptor, se questo ha il flag di \textit{close-on-exec} attivo (vedi
+sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}), questo verrà
+cancellato nel file descriptor restituito come copia.
 
 L'uso principale di questa funzione è nella shell per la redirezione dei file
 standard di tab.~\ref{tab:file_std_files} fra l'esecuzione di una \func{fork}
 e la successiva \func{exec}. Diventa così possibile associare un file (o una
-pipe) allo \itindex{standard~input} \textit{standard input} o allo
+\textit{pipe}) allo \itindex{standard~input} \textit{standard input} o allo
 \itindex{standard~output} \textit{standard output} (vedremo un esempio in
-sez.~\ref{sec:ipc_pipe_use}, quando tratteremo le pipe). 
+sez.~\ref{sec:ipc_pipe_use}, quando tratteremo le \textit{pipe}).
 
 Ci si può chiedere perché non sia in questo caso sufficiente chiudere il file
 standard che si vuole redirigere e poi aprire direttamente con \func{open} il
@@ -1350,8 +1354,8 @@ file descriptor che si vuole ottenere come duplicato; il suo prototipo è:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha
     un valore fuori dall'intervallo consentito per i file descriptor.
-  \item[\errcode{EBUSY}] si è rilevata la possibilità di una
-    \itindex{race~condition} \textit{race condition}.
+  \item[\errcode{EBUSY}] si è rilevata la possibilità di una \textit{race
+      condition}.
   \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
   \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file
     descriptor aperti.
@@ -1369,24 +1373,23 @@ e si limita a restituire \param{newfd}.
 L'uso di \func{dup2} ha vari vantaggi rispetto alla combinazione di
 \func{close} e \func{dup}; anzitutto se \param{oldfd} è uguale \param{newfd}
 questo verrebbe chiuso e \func{dup} fallirebbe, ma soprattutto l'operazione è
-atomica e consente di evitare una \itindex{race~condition} \textit{race
-  condition} in cui dopo la chiusura del file si potrebbe avere la ricezione
-di un segnale il cui gestore (vedi sez.~\ref{sec:sig_signal_handler}) potrebbe
-a sua volta aprire un file, per cui alla fine \func{dup} restituirebbe un file
-descriptor diverso da quello voluto.
+atomica e consente di evitare una \textit{race condition} in cui dopo la
+chiusura del file si potrebbe avere la ricezione di un segnale il cui gestore
+(vedi sez.~\ref{sec:sig_signal_handler}) potrebbe a sua volta aprire un file,
+per cui alla fine \func{dup} restituirebbe un file descriptor diverso da
+quello voluto.
 
 Con Linux inoltre la funzione prevede la possibilità di restituire l'errore
 \errcode{EBUSY}, che non è previsto dallo standard, quando viene rilevata la
-possibilità di una \itindex{race~condition} \textit{race condition} interna in
-cui si cerca di duplicare un file descriptor che è stato allocato ma per il
-quale non sono state completate le operazioni di apertura.\footnote{la
-  condizione è abbastanza peculiare e non attinente al tipo di utilizzo
-  indicato, quanto piuttosto ad un eventuale tentativo di duplicare file
-  descriptor non ancora aperti, la condizione di errore non è prevista dallo
-  standard, ma in condizioni simili FreeBSD risponde con un errore di
-  \errval{EBADF}, mentre OpenBSD elimina la possibilità di una \textit{race
-    condition} al costo di una perdita di prestazioni.} In tal caso occorre
-ritentare l'operazione.
+possibilità di una \textit{race condition} interna in cui si cerca di
+duplicare un file descriptor che è stato allocato ma per il quale non sono
+state completate le operazioni di apertura.\footnote{la condizione è
+  abbastanza peculiare e non attinente al tipo di utilizzo indicato, quanto
+  piuttosto ad un eventuale tentativo di duplicare file descriptor non ancora
+  aperti, la condizione di errore non è prevista dallo standard, ma in
+  condizioni simili FreeBSD risponde con un errore di \errval{EBADF}, mentre
+  OpenBSD elimina la possibilità di una \textit{race condition} al costo di
+  una perdita di prestazioni.} In tal caso occorre ritentare l'operazione.
 
 La duplicazione dei file descriptor può essere effettuata anche usando la
 funzione di controllo dei file \func{fcntl} (che esamineremo in
@@ -1420,11 +1423,10 @@ un file descriptor reimpostandone i flag, per usarla occorre definire la macro
 \end{funcproto}
 
 La funzione è identica a \func{dup2} ma prevede la possibilità di mantenere il
-flag di \textit{close-on-exec} \itindex{close-on-exec} sul nuovo
-file descriptor specificando \const{O\_CLOEXEC} in \param{flags} (che è l'unico
-flag usabile in questo caso). Inoltre rileva esplicitamente la possibile
-coincidenza fra \param{newfd} e \param{oldfd}, fallendo con un errore di
-\errval{EINVAL}.
+flag di \textit{close-on-exec} sul nuovo file descriptor specificando
+\const{O\_CLOEXEC} in \param{flags} (che è l'unico flag usabile in questo
+caso). Inoltre rileva esplicitamente la possibile coincidenza
+fra \param{newfd} e \param{oldfd}, fallendo con un errore di \errval{EINVAL}.
 
 
 \subsection{Le funzioni di sincronizzazione dei dati}
@@ -1491,8 +1493,8 @@ prototipi 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{EINVAL}] \param{fd} è un \index{file!speciali} file speciale
-    che non supporta la sincronizzazione.
+  \item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la
+    sincronizzazione.
   \end{errlist}
   ed inoltre \errval{EBADF}, \errval{EIO} e \errval{EROFS} nel loro
   significato generico.}
@@ -1507,7 +1509,7 @@ con \func{fstat}, come i tempi del file. Se lo scopo dell'operazione, come
 avviene spesso per i database, è assicurarsi che i dati raggiungano il disco e
 siano rileggibili immediatamente in maniera corretta, è sufficiente l'uso di
 \func{fdatasync} che non comporta anche l'esecuzione di operazioni non
-necessarie all'integrità dei dati, come l'aggiornamento dei temi di ultima
+necessarie all'integrità dei dati, come l'aggiornamento dei tempi di ultima
 modifica ed ultimo accesso.
 
 Si tenga presente che l'uso di queste funzioni non comporta la
@@ -1561,19 +1563,17 @@ Un problema generale che si pone con l'uso della funzione \func{open}, così
 come per le altre funzioni che prendono come argomenti dei
 \itindsub{pathname}{relativo} \textit{pathname} relativi, è la possibilità,
 quando un \textit{pathname} relativo non fa riferimento ad un file posto
-direttamente nella \index{directory~di~lavoro} directory di lavoro corrente,
-che alcuni dei componenti del \textit{pathname} vengano modificati in
-parallelo alla chiamata a \func{open}, cosa che lascia aperta la possibilità
-di una \itindex{race~condition} \textit{race condition} in cui c'è spazio per
-un \itindex{symlink~attack} \textit{symlink attack} (si ricordi quanto visto
-per \func{access} in sez.~\ref{sec:file_perm_management}).
-
-Inoltre come già accennato, la \index{directory~di~lavoro} directory di lavoro
-corrente è una proprietà del singolo processo; questo significa che quando si
-lavora con i \itindex{thread} \textit{thread} essa sarà la stessa per tutti,
-ma esistono molti casi in cui sarebbe invece utile che ogni singolo
-\itindex{thread} \textit{thread} avesse la sua \index{directory~di~lavoro}
-directory di lavoro.
+direttamente nella directory di lavoro corrente, che alcuni dei componenti del
+\textit{pathname} vengano modificati in parallelo alla chiamata a \func{open},
+cosa che lascia aperta la possibilità di una \textit{race condition} in cui
+c'è spazio per un \itindex{symlink~attack} \textit{symlink attack} (si ricordi
+quanto visto per \func{access} in sez.~\ref{sec:file_perm_management}).
+
+Inoltre come già accennato, la directory di lavoro corrente è una proprietà
+del singolo processo; questo significa che quando si lavora con i
+\textit{thread} essa sarà la stessa per tutti, ma esistono molti casi in cui
+sarebbe invece utile che ogni singolo \textit{thread} avesse la sua directory
+di lavoro.
 
 Per risolvere questi problemi, riprendendo una interfaccia già presente in
 Solaris, a fianco delle normali funzioni che operano sui file (come
@@ -1589,7 +1589,7 @@ relativo ad una directory specificata.\footnote{l'introduzione è avvenuta su
   filesystem \textit{proc} con l'apertura del file attraverso il riferimento a
   \textit{pathname} del tipo di \texttt{/proc/self/fd/dirfd/relative\_path}.}
 Benché queste funzioni non siano presenti negli standard tradizionali esse
-sono state adottate da altri sistemi unix-like come Solaris i vari BSD, fino ad
+sono state adottate da altri sistemi unix-like come Solaris, i vari BSD, fino ad
 essere incluse in una recente revisione (la POSIX.1-2008) dello standard
 POSIX.1. Con la \acr{glibc} per l'accesso a queste funzioni è necessario
 definire la macro \macro{\_ATFILE\_SOURCE}.
@@ -1600,16 +1600,15 @@ sarà la base della risoluzione dei \itindsub{pathname}{relativo}
 passare il relativo file descriptor alle varie funzioni che useranno quella
 directory come punto di partenza per la risoluzione. In questo modo, anche
 quando si lavora con i \itindex{thread} \textit{thread}, si può mantenere una
-\index{directory~di~lavoro} directory di lavoro diversa per ciascuno di essi.
+directory di lavoro diversa per ciascuno di essi.
 
-Questo metodo, oltre a risolvere i problemi di \itindex{race~condition}
-\textit{race condition}, consente anche di ottenere aumenti di prestazioni
-significativi quando si devono eseguire molte operazioni su sezioni
-dell'albero dei file che prevedono delle gerarchie di sottodirectory molto
-profonde. Infatti in questo caso basta eseguire la risoluzione del
-\textit{pathname} della directory di partenza una sola volta (nell'apertura
-iniziale) e non tutte le volte che si deve accedere a ciascun file che essa
-contiene.
+Questo metodo, oltre a risolvere i problemi di \textit{race condition},
+consente anche di ottenere aumenti di prestazioni significativi quando si
+devono eseguire molte operazioni su sezioni dell'albero dei file che prevedono
+delle gerarchie di sottodirectory molto profonde. Infatti in questo caso basta
+eseguire la risoluzione del \textit{pathname} della directory di partenza una
+sola volta (nell'apertura iniziale) e non tutte le volte che si deve accedere
+a ciascun file che essa contiene.
 
 La sintassi generale di queste nuove funzioni è che esse prevedono come primo
 argomento il file descriptor della directory da usare come base per la
@@ -1621,8 +1620,7 @@ esame la nuova funzione di sistema \funcd{openat}, avremo il prototipo:
 \fhead{fcntl.h}
 \fdecl{int openat(int dirfd, const char *pathname, int flags)}
 \fdecl{int openat(int dirfd, const char *pathname, int flags, mode\_t mode)}
-\fdesc{Apre un file a partire da una directory di \index{directory~di~lavoro}
-  lavoro.} 
+\fdesc{Apre un file a partire da una directory di lavoro.} 
 }
 
 {La funzione ritorna gli stessi valori e gli stessi codici di errore di
@@ -1642,11 +1640,11 @@ relativo questo sarà risolto rispetto alla directory indicata
 da \param{dirfd}. Qualora invece si usi un \itindsub{pathname}{assoluto}
 \textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine
 se per \param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la
-risoluzione sarà effettuata rispetto alla directory di
-\index{directory~di~lavoro} lavoro corrente del processo. Si tenga presente
-però che questa, come le altre costanti \texttt{AT\_*}, è definita in
-\headfile{fcntl.h}, pertanto se la si vuole usare occorrerà includere comunque
-questo file, anche per le funzioni che non sono definite in esso.
+risoluzione sarà effettuata rispetto alla directory di lavoro corrente del
+processo. Si tenga presente però che questa, come le altre costanti
+\texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole
+usare occorrerà includere comunque questo file, anche per le funzioni che non
+sono definite in esso.
 
 Così come il comportamento, anche i valori di ritorno e le condizioni di
 errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli
@@ -1704,6 +1702,11 @@ anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
 % altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi
 % http://lwn.net/Articles/562488/ 
 % TODO manca prototipo di utimensat, verificare se metterlo o metter menzione
+% TODO manca prototipo di renameat2, introdotta nel 3.15, vedi
+% http://lwn.net/Articles/569134/ 
+% TODO manca prototipo di execveat, introdotta nel 3.19, vedi
+% https://lwn.net/Articles/626150/ cerca anche fexecve
+
 
 Per tutte le funzioni che lo prevedono, a parte \func{unlinkat} e
 \funcd{faccessat}, l'ulteriore argomento è stato introdotto solo per fornire
@@ -1871,6 +1874,8 @@ precisione fino al nanosecondo.
 % inserita nello stesso standard e da usare con openat, vedi 
 % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
 
+% TODO: manca prototipo e motivazione di execveat, vedi
+% http://man7.org/linux/man-pages/man2/execveat.2.html 
 
 \subsection{Le operazioni di controllo}
 \label{sec:file_fcntl_ioctl}
@@ -1931,9 +1936,11 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di
   descrittori consentito.
 
+\itindbeg{close-on-exec}
+
 \item[\const{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma
-  in più attiva il flag di \itindex{close-on-exec} \textit{close-on-exec} sul
-  file descriptor duplicato, in modo da evitare una successiva chiamata con
+  in più attiva il flag di \textit{close-on-exec} sul file descriptor
+  duplicato, in modo da evitare una successiva chiamata con
   \const{F\_SETFD}. La funzionalità è stata introdotta con il kernel 2.6.24 ed
   è prevista nello standard POSIX.1-2008 (si deve perciò definire
   \macro{\_POSIX\_C\_SOURCE} ad un valore adeguato secondo quanto visto in
@@ -1943,20 +1950,21 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
     flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il
   terzo argomento viene ignorato. Non sono previsti errori diversi da
   \errval{EBADF}. Al momento l'unico flag usato è quello di
-  \itindex{close-on-exec} \textit{close-on-exec}, identificato dalla costante
-  \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
-  esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore
-  nullo significa pertanto che il flag non è impostato.
+  \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, che
+  serve a richiedere che il file venga chiuso nella esecuzione di una
+  \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore nullo significa
+  pertanto che il flag non è impostato.
 
 \item[\const{F\_SETFD}] imposta il valore dei \textit{file descriptor flags}
   al valore specificato con \param{arg}, ritorna un valore nullo in caso di
   successo e $-1$ in caso di errore. Non sono previsti errori diversi da
   \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di
-  \itindex{close-on-exec} \textit{close-on-exec}, identificato dalla costante
-  \const{FD\_CLOEXEC}, tutti gli altri bit di \param{arg}, anche se impostati,
-  vengono ignorati.\footnote{questo almeno è quanto avviene fino al kernel
-    3.2, come si può evincere dal codice della funzione \texttt{do\_fcntl} nel
-    file \texttt{fs/fcntl.c} dei sorgenti del kernel.}
+  \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC},
+  tutti gli altri bit di \param{arg}, anche se impostati, vengono
+  ignorati.\footnote{questo almeno è quanto avviene fino al kernel 3.2, come
+    si può evincere dal codice della funzione \texttt{do\_fcntl} nel file
+    \texttt{fs/fcntl.c} dei sorgenti del kernel.}
+\itindend{close-on-exec}
 
 \item[\const{F\_GETFL}] ritorna il valore dei \textit{file status flags} di
   \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento
@@ -2171,7 +2179,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   sufficiente per creare il \textit{file lease}, \errcode{EACCES} se non si è
   il proprietario del file e non si hanno i privilegi di
   amministratore.\footnote{per la precisione occorre la capacità
-    \itindex{capabilities} \const{CAP\_LEASE}.}
+     \const{CAP\_LEASE}.}
 
   Il supporto il supporto per i \textit{file lease}, che consente ad un
   processo che detiene un \textit{lease} su un file di riceve una notifica
@@ -2195,7 +2203,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   del buffer associato alla \textit{pipe} \param{fd} (vedi
   sez.~\ref{sec:ipc_pipes}) o $-1$ in caso di errore, il terzo argomento viene
   ignorato. Non sono previsti errori diversi da \errval{EBADF}, che viene
-  restituito anche se il file descriptor non è una pipe. Il comando è
+  restituito anche se il file descriptor non è una \textit{pipe}. Il comando è
   specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è
   utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}.
 
@@ -2211,12 +2219,12 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   inferiore, il valore specificato viene in genere arrotondato per eccesso al
   valore ritenuto più opportuno dal sistema, pertanto una volta eseguita la
   modifica è opportuno rileggere la nuova dimensione con
-  \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{{per la
-      precisione occorre la capacità \itindex{capabilities}
-      \const{CAP\_SYS\_RESOURCE}.}} non possono impostare un valore valore
-  superiore a quello indicato da \sysctlfile{fs/pipe-size-max}.  Il comando è
-  specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è
-  utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}.
+  \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{per la
+    precisione occorre la capacità \const{CAP\_SYS\_RESOURCE}.} non possono
+  impostare un valore valore superiore a quello indicato da
+  \sysctlfile{fs/pipe-size-max}.  Il comando è specifico di Linux, è
+  disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è
+  definita la macro \macro{\_GNU\_SOURCE}.
 
 \end{basedescript}
 
@@ -2339,14 +2347,12 @@ sono definite nel kernel a livello generale, e vengono sempre interpretate per
 prime, per cui, come illustrato in \cite{LinDevDri}, eventuali operazioni
 specifiche che usino lo stesso valore verrebbero ignorate:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{FIOCLEX}] imposta il flag di \itindex{close-on-exec}
-  \textit{close-on-exec} sul file, in questo caso, essendo usata come
-  operazione logica, \func{ioctl} non richiede un terzo argomento, il cui
-  eventuale valore viene ignorato.
-\item[\const{FIONCLEX}] cancella il flag di \itindex{close-on-exec}
-  \textit{close-on-exec} sul file, in questo caso, essendo usata come
-  operazione logica, \func{ioctl} non richiede un terzo argomento, il cui
-  eventuale valore viene ignorato.
+\item[\const{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in
+  questo caso, essendo usata come operazione logica, \func{ioctl} non richiede
+  un terzo argomento, il cui eventuale valore viene ignorato.
+\item[\const{FIONCLEX}] cancella il flag di \textit{close-on-exec} sul file,
+  in questo caso, essendo usata come operazione logica, \func{ioctl} non
+  richiede un terzo argomento, il cui eventuale valore viene ignorato.
 \item[\const{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul
   file (vedi sez.~\ref{sec:signal_driven_io}); il terzo argomento
   deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *})
@@ -2367,7 +2373,7 @@ specifiche che usino lo stesso valore verrebbero ignorate:
 \item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul
   file descriptor; questa operazione è disponibile solo su alcuni file
   descriptor, in particolare sui socket (vedi sez.~\ref{sec:sock_ioctl_IP}) o
-  sui file descriptor di \textit{epoll} (vedi sez.~\ref{sec:file_epoll}); il
+  sui file descriptor di \textit{epoll} (vedi sez.~\ref{sec:file_epoll}), il
   terzo argomento deve essere un puntatore ad un intero (cioè di tipo
   \texttt{int *}) su cui sarà restituito il valore.
 \item[\const{FIOQSIZE}] restituisce la dimensione corrente di un file o di una
@@ -2394,7 +2400,7 @@ due funzioni sono rimaste.
 % TODO trovare qualche posto per la eventuale documentazione delle seguenti
 % (bassa/bassissima priorità)
 % EXT4_IOC_MOVE_EXT (dal 2.6.31)
-
+% ioctl di btrfs, vedi http://lwn.net/Articles/580732/
 
 % \chapter{}
 
@@ -2407,12 +2413,11 @@ sono gestibili a basso livello con l'interfaccia standard unix, che ricorre
 direttamente alle \textit{system call} messe a disposizione dal kernel.
 
 Questa interfaccia però non provvede le funzionalità previste dallo standard
-ANSI C, che invece sono realizzate attraverso opportune funzioni di libreria,
-queste, insieme alle altre funzioni definite dallo standard (queste funzioni
-sono state implementate la prima volta da Ritchie nel 1976 e da allora sono
-rimaste sostanzialmente immutate), vengono a costituire il nucleo delle
-\acr{glibc} per la gestione dei file.
-
+ANSI C, che invece sono realizzate attraverso opportune funzioni di libreria.
+Queste funzioni di libreria, insieme alle altre funzioni definite dallo
+standard (che sono state implementate la prima volta da Ritchie nel 1976 e da
+allora sono rimaste sostanzialmente immutate), vengono a costituire il nucleo
+delle \acr{glibc} per la gestione dei file.
 
 Esamineremo in questa sezione le funzioni base dell'interfaccia degli
 \textit{stream}, analoghe a quelle di sez.~\ref{sec:file_unix_interface} per i
@@ -2452,7 +2457,7 @@ essere sempre considerato come composto da un flusso continuo di dati, da cui
 deriva appunto il nome \textit{stream}.
 
 A parte i dettagli legati alla gestione delle operazioni di lettura e
-scrittura, sia per quel che riguarda la bufferizzazione, che le formattazioni,
+scrittura, sia per quel che riguarda la bufferizzazione che le formattazioni,
 per tutto il resto i \textit{file stream} restano del tutto equivalenti ai
 file descriptor (sui quali sono basati), ed in particolare continua a valere
 quanto visto in sez.~\ref{sec:file_shared_access} a proposito dell'accesso
@@ -2490,10 +2495,10 @@ nell'header \headfile{stdio.h} che sono:
     output} cioè il \textit{file stream} su cui il processo invia
   ordinariamente i dati in uscita. Normalmente è associato dalla shell
   all'output del terminale e scrive sullo schermo.
-\item[\var{FILE *stderr}] Lo \textit{standard error} cioè il \textit{file
-    stream} su cui il processo è supposto inviare i messaggi di
-  errore. Normalmente anch'esso è associato dalla shell all'output del
-  terminale e scrive sullo schermo.
+\item[\var{FILE *stderr}] Lo \textit{standard error} \textit{standard error}
+  cioè il \textit{file stream} su cui il processo è supposto inviare i
+  messaggi di errore. Normalmente anch'esso è associato dalla shell all'output
+  del terminale e scrive sullo schermo.
 \end{basedescript}
 
 Nella \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono effettivamente
@@ -2729,7 +2734,7 @@ usare una delle funzioni \func{fseek}, \func{fsetpos} o \func{rewind}. Anche
 un'operazione nominalmente nulla come \code{fseek(file, 0, SEEK\_CUR)} è
 sufficiente a garantire la sincronizzazione.
 
-Una volta completate le operazioni su di esso \textit{stream} può essere
+Una volta completate le operazioni su di esso uno \textit{stream} può essere
 chiuso con la funzione \funcd{fclose}, il cui prototipo è:
 
 \begin{funcproto}{
@@ -2777,59 +2782,57 @@ sez.~\ref{sec:proc_conclusion}).
 
 
 \subsection{Gestione dell'I/O e posizionamento su uno \textit{stream}}
- \label{sec:file_io}
-
- Una delle caratteristiche più utili dell'interfaccia degli \textit{stream} è
- la ricchezza delle funzioni disponibili per le operazioni di lettura e
- scrittura sui file. Sono infatti previste ben tre diverse modalità modalità di
- input/output non formattato:
- \begin{itemize}
- \item\textsl{binario} in cui si leggono e scrivono blocchi di dati di
+\label{sec:file_io}
+
+Una delle caratteristiche più utili dell'interfaccia degli \textit{stream} è
+la ricchezza delle funzioni disponibili per le operazioni di lettura e
+scrittura sui file. Sono infatti previste ben tre diverse modalità modalità di
+input/output non formattato:
+\begin{itemize}
+\item\textsl{binario} in cui si leggono e scrivono blocchi di dati di
    dimensione arbitraria, (analogo della modalità ordinaria dell'I/O sui file
    descriptor), trattato in sez.~\ref{sec:file_binary_io}.
- \item\textsl{a caratteri} in cui si legge e scrive un carattere alla volta,
+\item\textsl{a caratteri} in cui si legge e scrive un carattere alla volta,
    con la bufferizzazione che viene gestita automaticamente dalla libreria,
    trattato in sez.~\ref{sec:file_char_io}.
- \item\textsl{di linea} in cui si legge e scrive una linea alla volta,
+\item\textsl{di linea} in cui si legge e scrive una linea alla volta,
    (terminata dal carattere di newline \verb|'\n'|), trattato in
    sez.~\ref{sec:file_line_io}.
- \end{itemize}
- a cui si aggiunge la modalità di input/output formattato, trattato in
- sez.~\ref{sec:file_formatted_io}.
-
- Ognuna di queste modalità utilizza per l'I/O delle funzioni specifiche che
- vedremo nelle sezioni citate, affronteremo qui tutte gli argomenti e le
- funzioni che si applicano in generale a tutte le modalità di I/O.
-
- A differenza di quanto avviene con l'interfaccia dei file descriptor, con gli
- \textit{stream} il raggiungimento della fine del file viene considerato un
- errore, e viene notificato come tale dai valori di uscita delle varie
- funzioni. Nella maggior parte dei casi questo avviene con la restituzione del
- valore intero (di tipo \ctyp{int}) \val{EOF} definito anch'esso nell'header
- \headfile{stdlib.h}. La costante deve essere negativa perché in molte
- funzioni un valore positivo indica la quantità di dati scritti, le
- \acr{glibc} usano il valore $-1$, ma altre implementazioni possono avere
- valori diversi.
-
- Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di
- libreria che si appoggiano a delle \textit{system call}, esse non impostano
- direttamente la variabile \var{errno}, che mantiene sempre il valore
- impostato dalla \textit{system call} invocata internamente che ha riportato
- l'errore.
-
- Siccome la condizione di \textit{end-of-file} è anch'essa segnalata come
- errore, nasce il problema di come distinguerla da un errore effettivo;
- basarsi solo sul valore di ritorno della funzione e controllare il valore di
- \var{errno} infatti non basta, dato che quest'ultimo potrebbe essere stato
- impostato in una altra occasione, (si veda sez.~\ref{sec:sys_errno} per i
- dettagli del funzionamento di \var{errno}).
-
- Per questo motivo tutte le implementazioni delle librerie standard mantengono
- per ogni \textit{stream} almeno due flag all'interno dell'oggetto \type{FILE},
- il flag di \textit{end-of-file}, che segnala che si è raggiunta la fine del
- file in lettura, e quello di errore, che segnala la presenza di un qualche
- errore nelle operazioni di input/output; questi due flag possono essere
- riletti dalle funzioni \funcd{feof} e \funcd{ferror}, i cui prototipi sono:
+\end{itemize}
+a cui si aggiunge la modalità di input/output formattato, trattato in
+sez.~\ref{sec:file_formatted_io}.
+
+Ognuna di queste modalità utilizza per l'I/O delle funzioni specifiche che
+vedremo nelle sezioni citate, affronteremo qui tutte gli argomenti e le
+funzioni che si applicano in generale a tutte le modalità di I/O.
+
+A differenza di quanto avviene con l'interfaccia dei file descriptor, con gli
+\textit{stream} il raggiungimento della fine del file viene considerato un
+errore, e viene notificato come tale dai valori di uscita delle varie
+funzioni. Nella maggior parte dei casi questo avviene con la restituzione del
+valore intero (di tipo \ctyp{int}) \val{EOF} definito anch'esso nell'header
+\headfile{stdlib.h}. La costante deve essere negativa perché in molte funzioni
+un valore positivo indica la quantità di dati scritti, le \acr{glibc} usano il
+valore $-1$, ma altre implementazioni possono avere valori diversi.
+
+Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di
+libreria che si appoggiano a delle \textit{system call}, esse non impostano
+direttamente la variabile \var{errno}, che mantiene sempre il valore impostato
+dalla \textit{system call} invocata internamente che ha riportato l'errore.
+
+Siccome la condizione di \textit{end-of-file} è anch'essa segnalata come
+errore, nasce il problema di come distinguerla da un errore effettivo; basarsi
+solo sul valore di ritorno della funzione e controllare il valore di
+\var{errno} infatti non basta, dato che quest'ultimo potrebbe essere stato
+impostato in una altra occasione, (si veda sez.~\ref{sec:sys_errno} per i
+dettagli del funzionamento di \var{errno}).
+
+Per questo motivo tutte le implementazioni delle librerie standard mantengono
+per ogni \textit{stream} almeno due flag all'interno dell'oggetto \type{FILE},
+il flag di \textit{end-of-file}, che segnala che si è raggiunta la fine del
+file in lettura, e quello di errore, che segnala la presenza di un qualche
+errore nelle operazioni di input/output; questi due flag possono essere
+riletti dalle funzioni \funcd{feof} e \funcd{ferror}, i cui prototipi sono:
 
 \begin{funcproto}{
 \fhead{stdio.h}
@@ -2872,12 +2875,11 @@ sez.~\ref{sec:file_stream_thread}).
 Come per i file descriptor anche per gli \textit{stream} è possibile spostarsi
 all'interno di un file per effettuare operazioni di lettura o scrittura in un
 punto prestabilito, sempre che l'operazione di riposizionamento sia supportata
-dal file sottostante lo \textit{stream}, nel caso cioè in cui si ha a che
-fare con quello che viene detto un file ad \textsl{accesso casuale}. Dato che
-in un sistema Unix esistono vari tipi di file, come le fifo ed i
-\index{file!di~dispositivo} file di dispositivo (ad esempio i terminali), non
-è scontato che questo sia vero in generale, pur essendolo sempre nel caso di
-file di dati.
+dal file sottostante lo \textit{stream}, nel caso cioè in cui si ha a che fare
+con quello che viene detto un file ad \textsl{accesso casuale}. Dato che in un
+sistema Unix esistono vari tipi di file, come le fifo ed i file di dispositivo
+(ad esempio i terminali), non è scontato che questo sia vero in generale, pur
+essendolo sempre nel caso di file di dati.
 
 Con Linux ed in generale in ogni sistema unix-like la posizione nel file, come
 abbiamo già visto in sez.~\ref{sec:file_lseek}, è espressa da un intero
@@ -3092,9 +3094,8 @@ rispettivi prototipi sono:
 
 La funzione \func{getc} legge un byte da \param{stream} e lo restituisce come
 intero, ed in genere è implementata come una macro per cui può avere
-\itindex{side~effects} \textit{side effects}, mentre \func{fgetc} è assicurato
-essere sempre una funzione. Infine \func{getchar} è equivalente a
-\code{getc(stdin)}.
+\textit{side effects}, mentre \func{fgetc} è assicurato essere sempre una
+funzione. Infine \func{getchar} è equivalente a \code{getc(stdin)}.
 
 A parte \func{getchar}, che si usa in genere per leggere un carattere da
 tastiera, le altre due funzioni sono sostanzialmente equivalenti. La
@@ -3290,11 +3291,11 @@ adiacente al buffer.\footnote{questa tecnica è spiegata in dettaglio e con
 Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non
 autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare
 una stringa sufficientemente lunga ed opportunamente forgiata per
-sovrascrivere gli indirizzi di ritorno nello \itindex{stack} \textit{stack}
-(supposto che la \func{gets} sia stata chiamata da una subroutine), in modo da
-far ripartire l'esecuzione nel codice inviato nella stringa stessa, che in
-genere contiene uno \textit{shell code}, cioè una sezione di programma che
-lancia una shell da cui si potranno poi eseguire altri programmi.
+sovrascrivere gli indirizzi di ritorno nello \textit{stack} (supposto che la
+\func{gets} sia stata chiamata da una subroutine), in modo da far ripartire
+l'esecuzione nel codice inviato nella stringa stessa, che in genere contiene
+uno \textit{shell code}, cioè una sezione di programma che lancia una shell da
+cui si potranno poi eseguire altri programmi.
 
 La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in quanto
 prende in ingresso la dimensione del buffer \param{size}, che non verrà mai
@@ -3328,11 +3329,11 @@ all'indirizzo \param{string} sullo \itindex{standard~output} \textit{standard
   output} mentre \func{puts} la scrive sul file indicato da \param{stream}.
 Dato che in questo caso si scrivono i dati in uscita \func{puts} non ha i
 problemi di \func{gets} ed è in genere la forma più immediata per scrivere
-messaggi sullo \itindex{standard~output} standard output; la funzione prende
-una stringa terminata da uno zero ed aggiunge automaticamente il ritorno a
-capo. La differenza con \func{fputs} (a parte la possibilità di specificare un
-file diverso da \var{stdout}) è che quest'ultima non aggiunge il
-\textit{newline}, che deve essere previsto esplicitamente.
+messaggi sullo \itindex{standard~output} \textit{standard output}; la funzione
+prende una stringa terminata da uno zero ed aggiunge automaticamente il
+ritorno a capo. La differenza con \func{fputs} (a parte la possibilità di
+specificare un file diverso da \var{stdout}) è che quest'ultima non aggiunge
+il \textit{newline}, che deve essere previsto esplicitamente.
 
 Come per le analoghe funzioni di input/output a caratteri, anche per l'I/O di
 linea esistono delle estensioni per leggere e scrivere linee di caratteri
@@ -3414,10 +3415,9 @@ dimensioni del buffer suddetto.
 Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta
 subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova
 dimensione ed il nuovo puntatore vengono restituiti indietro, si noti infatti
-come entrambi gli argomenti siano dei \itindex{value~result~argument}
-\textit{value result argument}, per i quali vengono passati dei puntatori
-anziché i valori delle variabili, secondo quanto abbiamo descritto in
-sez.~\ref{sec:proc_var_passing}).
+come entrambi gli argomenti siano dei \textit{value result argument}, per i
+quali vengono passati dei puntatori anziché i valori delle variabili, secondo
+quanto abbiamo descritto in sez.~\ref{sec:proc_var_passing}).
 
 Se si passa alla funzione l'indirizzo di un puntatore impostato a \val{NULL} e
 \var{*n} è zero, la funzione provvede da sola all'allocazione della memoria
@@ -3425,13 +3425,12 @@ necessaria a contenere la linea. In tutti i casi si ottiene dalla funzione un
 puntatore all'inizio del testo della linea letta. Un esempio di codice può
 essere il seguente: 
 \includecodesnip{listati/getline.c} 
-e per evitare \itindex{memory~leak} \textit{memory leak} occorre ricordarsi di
-liberare la memoria allocata dalla funzione eseguendo una \func{free} su
-\var{ptr}.
+e per evitare \textit{memory leak} occorre ricordarsi di liberare la memoria
+allocata dalla funzione eseguendo una \func{free} su \var{ptr}.
 
 Il valore di ritorno di \func{getline} indica il numero di caratteri letti
 dallo \textit{stream}, quindi compreso il \textit{newline}, ma non lo zero di
-terminazione). Questo permette anche di distinguere anche gli eventuali zeri
+terminazione. Questo permette anche di distinguere anche gli eventuali zeri
 letti come dati dallo \textit{stream} da quello inserito dalla funzione dopo
 il \textit{newline} per terminare la stringa.  Se si è alla fine del file e
 non si è potuto leggere nulla o se c'è stato un errore la funzione restituisce
@@ -3457,8 +3456,7 @@ La funzione è identica a \func{getline} solo che usa \param{delim} al posto
 del carattere di \textit{newline} come separatore di linea. Il comportamento
 di \func{getdelim} è identico a quello di \func{getline}, che può essere
 implementata da \func{getdelim} passando ``\verb|\n|'' come valore
-dell'argomento
-\param{delim}.
+dell'argomento \param{delim}.
 
 
 \subsection{Input/output formattato}
@@ -3490,17 +3488,17 @@ L'output formattato viene eseguito con una delle 13 funzioni della famiglia
 
 
 Le funzioni usano la stringa \param{format} come indicatore del formato con
-cui dovrà essere scritto il contenuto degli argomenti, il cui numero
-\index{funzioni!variadic} è variabile e dipende dal formato stesso.
+cui dovrà essere scritto il contenuto degli argomenti, il cui numero è
+variabile e dipende dal formato stesso.
 
 Le prime due servono per scrivere su file (lo \itindex{standard~output}
 \textit{standard output} o quello specificato) la terza permette di scrivere
 su una stringa, in genere l'uso di \func{sprintf} è sconsigliato in quanto è
 possibile, se non si ha la sicurezza assoluta sulle dimensioni del risultato
 della stampa, eccedere le dimensioni di \param{str}, con conseguente
-sovrascrittura di altre variabili e possibili \itindex{buffer~overflow}
-\textit{buffer overflow}. Per questo motivo si consiglia l'uso
-dell'alternativa \funcd{snprintf}, il cui prototipo è:
+sovrascrittura di altre variabili e possibili \textit{buffer overflow}. Per
+questo motivo si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui
+prototipo è:
 
 \begin{funcproto}{
 \fhead{stdio.h}
@@ -3563,12 +3561,12 @@ non possa essere sovrascritto.
 La parte più complessa delle funzioni di scrittura formattata è il formato
 della stringa \param{format} che indica le conversioni da fare, e da cui
 deriva anche il numero degli argomenti che dovranno essere passati a seguire:
-si noti come tutte queste funzioni siano \index{funzioni!variadic}
-\textit{variadic}, prendendo un numero di argomenti variabile che dipende
-appunto da quello che si è specificato in \param{format}.
+si noti come tutte queste funzioni siano ``\textit{variadic}'', prendendo un
+numero di argomenti variabile che dipende appunto da quello che si è
+specificato in \param{format}.
 
 La stringa di formato è costituita da caratteri normali (tutti eccetto
-``\texttt{\%}''), che vengono passati invariati all'output, e da direttive di
+``\texttt{\%}''), che vengono passati invariati in uscita, e da direttive di
 conversione, in cui devono essere sempre presenti il carattere
 ``\texttt{\%}'', che introduce la direttiva, ed uno degli specificatori di
 conversione (riportati in tab.~\ref{tab:file_format_spec}) che la conclude.
@@ -3644,11 +3642,11 @@ dettagliate dei vari formati possono essere trovati nella pagina di manuale di
     \cmd{L}  & Una conversione in virgola mobile corrisponde a un
                \ctyp{double}.\\
     \cmd{q}  & Sinonimo di \cmd{ll}.\\
-    \cmd{j}  & Una conversione intera corrisponde a un \type{intmax\_t} o 
-               \type{uintmax\_t}.\\
-    \cmd{z}  & Una conversione intera corrisponde a un \type{size\_t} o 
-               \type{ssize\_t}.\\
-    \cmd{t}  & Una conversione intera corrisponde a un \type{ptrdiff\_t}.\\
+    \cmd{j}  & Una conversione intera corrisponde a un \ctyp{intmax\_t} o 
+               \ctyp{uintmax\_t}.\\
+    \cmd{z}  & Una conversione intera corrisponde a un \ctyp{size\_t} o 
+               \ctyp{ssize\_t}.\\
+    \cmd{t}  & Una conversione intera corrisponde a un \ctyp{ptrdiff\_t}.\\
     \hline
   \end{tabular}
   \caption{Il modificatore di tipo di dato per il formato di \func{printf}}
@@ -3666,7 +3664,7 @@ sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf}, \funcd{vfprintf} e
 \fdesc{Scrive una stringa formattata sullo \itindex{standard~output}
   \textit{standard output}.} 
 \fdecl{int vfprintf(FILE *stream, const char *format, va\_list ap)}
-\fdesc{Scrive una stringa formattata su un \textit{stream}.}
+\fdesc{Scrive una stringa formattata su uno \textit{stream}.}
 \fdecl{int vsprintf(char *str, const char *format, va\_list ap)}
 \fdesc{Scrive una stringa formattata su un buffer.}
 }
@@ -3678,11 +3676,10 @@ sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf}, \funcd{vfprintf} e
 Con queste funzioni diventa possibile selezionare gli argomenti che si
 vogliono passare ad una funzione di stampa, passando direttamente la lista
 tramite l'argomento \param{ap}. Per poter far questo ovviamente la lista
-variabile\index{funzioni!variadic} degli argomenti dovrà essere opportunamente
-trattata (l'argomento è esaminato in sez.~\ref{sec:proc_variadic}), e dopo
-l'esecuzione della funzione l'argomento
-\param{ap} non sarà più utilizzabile (in generale dovrebbe essere eseguito un
-\code{va\_end(ap)} ma in Linux questo non è necessario). 
+variabile degli argomenti dovrà essere opportunamente trattata (l'argomento è
+esaminato in sez.~\ref{sec:proc_variadic}), e dopo l'esecuzione della funzione
+l'argomento \param{ap} non sarà più utilizzabile (in generale dovrebbe essere
+eseguito un \code{va\_end(ap)} ma in Linux questo non è necessario).
 
 Come per \func{sprintf} anche per \func{vsprintf} esiste una analoga
 \funcd{vsnprintf} che pone un limite sul numero di caratteri che vengono
@@ -3698,8 +3695,7 @@ scritti sulla stringa di destinazione:
   \func{vsprintf}.}
 \end{funcproto}
 
-\noindent in modo da evitare possibili \itindex{buffer~overflow} buffer
-overflow.
+\noindent in modo da evitare possibili \textit{buffer overflow}.
 
 
 Per eliminare alla radice questi problemi, la \acr{glibc} supporta una
@@ -3723,11 +3719,10 @@ sono:
 Entrambe le funzioni prendono come argomento \param{strptr} che deve essere
 l'indirizzo di un puntatore ad una stringa di caratteri, in cui verrà
 restituito (si ricordi quanto detto in sez.~\ref{sec:proc_var_passing} a
-proposito dei \itindex{value~result~argument} \textit{value result argument})
-l'indirizzo della stringa allocata automaticamente dalle funzioni. Occorre
-inoltre ricordarsi di invocare \func{free} per liberare detto puntatore quando
-la stringa non serve più, onde evitare \itindex{memory~leak} \textit{memory
-  leak}.
+proposito dei \textit{value result argument}) l'indirizzo della stringa
+allocata automaticamente dalle funzioni. Occorre inoltre ricordarsi di
+invocare \func{free} per liberare detto puntatore quando la stringa non serve
+più, onde evitare \textit{memory leak}.
 
 % TODO verificare se mettere prototipi di \func{dprintf} e \func{vdprintf}
 
@@ -3956,12 +3951,12 @@ Ovviamente se si usa un buffer specificato dall'utente questo deve essere
 stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo
 \textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo
 dopo la chiusura del file; ma fintanto che il file è usato all'interno di una
-funzione, può anche essere usata una \index{variabili!automatiche} variabile
-automatica. In \headfile{stdio.h} è definita la macro \const{BUFSIZ}, che
-indica le dimensioni generiche del buffer di uno \textit{stream}, queste
-vengono usate dalla funzione \func{setbuf}.  Non è detto però che tale
-dimensione corrisponda sempre al valore ottimale (che può variare a seconda
-del dispositivo).
+funzione, può anche essere usata una variabile automatica. In
+\headfile{stdio.h} è definita la macro \const{BUFSIZ}, che indica le
+dimensioni generiche del buffer di uno \textit{stream}, queste vengono usate
+dalla funzione \func{setbuf}.  Non è detto però che tale dimensione
+corrisponda sempre al valore ottimale (che può variare a seconda del
+dispositivo).
 
 Dato che la procedura di allocazione manuale è macchinosa, comporta dei
 rischi, come delle scritture accidentali sul buffer, e non assicura la scelta
@@ -4043,7 +4038,7 @@ scelta, si può forzare lo scarico dei dati sul file con la funzione
 
 \noindent anche di questa funzione esiste una analoga \func{fflush\_unlocked}
 (accessibile definendo \macro{\_BSD\_SOURCE} o \macro{\_SVID\_SOURCE} o
-\macro{\_GNU\_SOURCE}) che non effettua il blocco dello stream.
+\macro{\_GNU\_SOURCE}) che non effettua il blocco dello \textit{stream}.
 
 % TODO aggiungere prototipo \func{fflush\_unlocked}?
 
@@ -4051,8 +4046,8 @@ Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
 \textit{stream} aperti. Esistono però circostanze, ad esempio quando si vuole
 essere sicuri che sia stato eseguito tutto l'output su terminale, in cui serve
 poter effettuare lo scarico dei dati solo per gli \textit{stream} in modalità
-line buffered. Per fare questo le \acr{glibc} supportano una estensione di
-Solaris, la funzione \funcd{\_flushlbf}, il cui prototipo è:
+\textit{line buffered}. Per fare questo le \acr{glibc} supportano una
+estensione di Solaris, la funzione \funcd{\_flushlbf}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{stdio-ext.h}