Lavoro fatto a casa senza ADSL, correzioni multiple agli indici, documentato
[gapil.git] / fileunix.tex
index b3190f18db45a9e59ac1f5f038e0104c964b0358..2d297ec77c517d8f7a2515e8b2bc628a304092be 100644 (file)
@@ -1,6 +1,6 @@
 %% fileunix.tex
 %%
 %% fileunix.tex
 %%
-%% Copyright (C) 2000-2004 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2005 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",
 %% 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",
@@ -34,7 +34,9 @@ tutte le implementazione di un sistema unix-like.
 \subsection{L'architettura dei \textit{file descriptor}}
 \label{sec:file_fd}
 
 \subsection{L'architettura dei \textit{file descriptor}}
 \label{sec:file_fd}
 
-\index{file!descriptor|(} Per poter accedere al contenuto di un file occorre
+\index{file!descriptor|(} 
+
+Per poter accedere al contenuto di un file occorre
 creare un canale di comunicazione con il kernel che renda possibile operare su
 di esso (si ricordi quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si
 fa aprendo il file con la funzione \func{open} che provvederà a localizzare
 creare un canale di comunicazione con il kernel che renda possibile operare su
 di esso (si ricordi quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si
 fa aprendo il file con la funzione \func{open} che provvederà a localizzare
@@ -52,16 +54,16 @@ valore come argomento alle varie funzioni dell'interfaccia.
 
 Per capire come funziona il meccanismo occorre spiegare a grandi linee come il
 kernel gestisce l'interazione fra processi e file.  Il kernel mantiene sempre
 
 Per capire come funziona il meccanismo occorre spiegare a grandi linee come il
 kernel gestisce l'interazione fra processi e file.  Il kernel mantiene sempre
-un elenco dei processi attivi nella cosiddetta \textit{process table} ed un
-elenco dei file aperti nella \textit{file table}.
-
-La \textit{process table} è una tabella che contiene una voce per ciascun
-processo attivo nel sistema. In Linux ciascuna voce è costituita da una
-struttura di tipo \struct{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 \struct{files\_struct}, in cui
-sono contenute le informazioni relative ai file che il processo ha aperto, ed
-in particolare:
+un elenco dei processi attivi nella cosiddetta \itindex{process~table}
+\textit{process table} ed un elenco dei file aperti nella \textit{file table}.
+
+La \itindex{process~table} \textit{process table} è una tabella che contiene
+una voce per ciascun processo attivo nel sistema. In Linux ciascuna voce è
+costituita da una struttura di tipo \struct{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
+\struct{files\_struct}, in cui sono contenute le informazioni relative ai file
+che il processo ha aperto, ed in particolare:
 \begin{itemize*}
 \item i flag relativi ai file descriptor.
 \item il numero di file aperti.
 \begin{itemize*}
 \item i flag relativi ai file descriptor.
 \item il numero di file aperti.
@@ -91,6 +93,11 @@ file, fra cui:
 In fig.~\ref{fig:file_proc_file} si è riportato uno schema in cui è illustrata
 questa architettura, ed in cui si sono evidenziate le interrelazioni fra le
 varie strutture di dati sulla quale essa è basata.
 In fig.~\ref{fig:file_proc_file} si è riportato uno schema in cui è illustrata
 questa architettura, ed in cui si sono evidenziate le interrelazioni fra le
 varie strutture di dati sulla quale essa è basata.
+Ritorneremo su questo schema più volte, dato che esso è fondamentale per
+capire i dettagli del funzionamento dell'interfaccia dei \textit{file
+  descriptor}.  
+\index{file!descriptor|)}
+
 \begin{figure}[htb]
   \centering
   \includegraphics[width=13cm]{img/procfile}
 \begin{figure}[htb]
   \centering
   \includegraphics[width=13cm]{img/procfile}
@@ -98,11 +105,6 @@ varie strutture di dati sulla quale essa 
   l'interfaccia dei \textit{file descriptor}.}
   \label{fig:file_proc_file}
 \end{figure}
   l'interfaccia dei \textit{file descriptor}.}
   \label{fig:file_proc_file}
 \end{figure}
-Ritorneremo su questo schema più volte, dato che esso è fondamentale per
-capire i dettagli del funzionamento dell'interfaccia dei \textit{file
-  descriptor}.  
-\index{file!descriptor|)}
-
 
 
 
 
 
 
@@ -115,23 +117,23 @@ assegnati in successione tutte le volte che si apre un nuovo file (se non ne 
 stato chiuso nessuno in precedenza).
 
 In tutti i sistemi unix-like esiste una convenzione generale per cui ogni
 stato chiuso nessuno in precedenza).
 
 In tutti i sistemi unix-like esiste una convenzione generale per cui ogni
-processo viene lanciato con almeno tre file aperti. Questi, per quanto appena
-detto, avranno come \textit{file descriptor}\index{file!descriptor} i valori
-0, 1 e 2.  Benché questa sia soltanto una convenzione, essa è seguita dalla
-gran parte delle applicazioni, e non aderirvi potrebbe portare a gravi
-problemi di interoperabilità.
-
-Il primo file è sempre associato a quello che viene chiamato \textit{standard
-  input}. È cioè il file da cui il processo si aspetta di ricevere i dati in
-ingresso (nel caso della shell, è associato all'ingresso dal terminale, e
-quindi alla lettura della tastiera). Il secondo file è il cosiddetto
-\textit{standard output}, cioè il file su cui ci si aspetta debbano essere
-inviati i dati in uscita (sempre nel caso della shell, è associato all'uscita
-del terminale, e quindi alla scrittura sullo schermo). Il terzo è lo
-\textit{standard error}, su cui viene inviato l'output relativo agli errori,
-ed è anch'esso associato all'uscita del terminale.  Lo standard POSIX.1
-provvede tre costanti simboliche, definite nell'header \file{unistd.h}, al
-posto di questi valori numerici:
+processo viene lanciato dalla shell con almeno tre file aperti. Questi, per
+quanto appena detto, avranno come \textit{file
+  descriptor}\index{file!descriptor} i valori 0, 1 e 2.  Benché questa sia
+soltanto una convenzione, essa è seguita dalla gran parte delle applicazioni,
+e non aderirvi potrebbe portare a gravi problemi di interoperabilità.
+
+Il primo file è sempre associato al cosiddetto \textit{standard input}; è cioè
+il file da cui il processo si aspetta di ricevere i dati in ingresso. Il
+secondo file è il cosiddetto \textit{standard output}, cioè quello su cui ci
+si aspetta debbano essere inviati i dati in uscita. Il terzo è lo
+\textit{standard error}, su cui viene inviata l'uscita relativa agli errori.
+Nel caso della shell tutti questi file sono associati al terminale di
+controllo, e corrispondono quindi alla lettura della tastiera per l'ingresso e
+alla scrittura sul terminale per l'uscita.  Lo standard POSIX.1 provvede, al
+posto dei valori numerici, tre costanti simboliche, definite in
+tab.~\ref{tab:file_std_files}.
+
 \begin{table}[htb]
   \centering
   \footnotesize
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -153,11 +155,11 @@ posto di questi valori numerici:
   \label{tab:file_std_files}
 \end{table}
 
   \label{tab:file_std_files}
 \end{table}
 
-In tab.~\ref{tab:file_std_files} si è utilizzata questa situazione come
-esempio, facendo riferimento ad un programma in cui lo \textit{standard input}
-è associato ad un file mentre lo \textit{standard output} e lo
-\textit{standard error} sono entrambi associati ad un altro file (e quindi
-utilizzano lo stesso inode\index{inode}).
+In fig.~\ref{fig:file_proc_file} si è rappresentata una situazione diversa,
+facendo riferimento ad un programma in cui lo \textit{standard input} è
+associato ad un file mentre lo \textit{standard output} e lo \textit{standard
+  error} sono entrambi associati ad un altro file (e quindi utilizzano lo
+stesso inode\index{inode}).
 
 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
 numero di file aperti era anche soggetto ad un limite massimo dato dalle
 
 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
 numero di file aperti era anche soggetto ad un limite massimo dato dalle
@@ -175,20 +177,18 @@ sez.~\ref{sec:sys_limits}).
 L'interfaccia standard Unix per l'input/output sui file è basata su cinque
 funzioni fondamentali: \func{open}, \func{read}, \func{write}, \func{lseek} e
 \func{close}, usate rispettivamente per aprire, leggere, scrivere, spostarsi e
 L'interfaccia standard Unix per l'input/output sui file è basata su cinque
 funzioni fondamentali: \func{open}, \func{read}, \func{write}, \func{lseek} e
 \func{close}, usate rispettivamente per aprire, leggere, scrivere, spostarsi e
-chiudere un file. 
-
-La gran parte delle operazioni sui file si effettua attraverso queste cinque
-funzioni, esse vengono chiamate anche funzioni di I/O non bufferizzato dato
-che effettuano le operazioni di lettura e scrittura usando direttamente le
-system call del kernel.
+chiudere un file.  La gran parte delle operazioni sui file si effettua
+attraverso queste cinque funzioni, esse vengono chiamate anche funzioni di I/O
+non bufferizzato dato che effettuano le operazioni di lettura e scrittura
+usando direttamente le system call del kernel.
 
 
 \subsection{La funzione \func{open}}
 \label{sec:file_open}
 
 La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
 
 
 \subsection{La funzione \func{open}}
 \label{sec:file_open}
 
 La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
-quella che crea l'associazione fra un pathname ed un file descriptor, il suo
-prototipo è:
+quella che crea l'associazione fra un \itindex{pathname}\textit{pathname} ed
+un file descriptor, il suo prototipo è:
 \begin{functions}
   \headdecl{sys/types.h}
   \headdecl{sys/stat.h}
 \begin{functions}
   \headdecl{sys/types.h}
   \headdecl{sys/stat.h}
@@ -199,9 +199,9 @@ prototipo 
   \param{flags}, e, nel caso il file sia creato, con gli eventuali permessi
   specificati da \param{mode}.
   
   \param{flags}, e, nel caso il file sia creato, con gli eventuali permessi
   specificati da \param{mode}.
   
-  \bodydesc{La funzione ritorna il file descriptor in caso di successo e -1 in
-    caso di errore. In questo caso la variabile \var{errno} assumerà uno dei
-    valori:
+  \bodydesc{La funzione ritorna il file descriptor in caso di successo e $-1$
+    in caso di errore. In questo caso la variabile \var{errno} assumerà uno
+    dei valori:
   \begin{errlist}
   \item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
     \const{O\_CREAT} e \const{O\_EXCL}.  
   \begin{errlist}
   \item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
     \const{O\_CREAT} e \const{O\_EXCL}.  
@@ -217,18 +217,32 @@ prototipo 
     dispositivo che non esiste.
   \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine
     di un programma in esecuzione.
     dispositivo che non esiste.
   \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine
     di un programma in esecuzione.
-  \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel risolvere
-    pathname o si è indicato \const{O\_NOFOLLOW} e \param{pathname} è un link
-    simbolico.
+  \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel
+    risolvere il \textit{pathname} o si è indicato \const{O\_NOFOLLOW} e
+    \param{pathname} è un link simbolico.
   \end{errlist}
   ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOENT},
   \errval{EROFS}, \errval{EFAULT}, \errval{ENOSPC}, \errval{ENOMEM},
   \errval{EMFILE} e \errval{ENFILE}.}
 \end{functions}
 
   \end{errlist}
   ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOENT},
   \errval{EROFS}, \errval{EFAULT}, \errval{ENOSPC}, \errval{ENOMEM},
   \errval{EMFILE} e \errval{ENFILE}.}
 \end{functions}
 
-La funzione apre il file, usando il primo file descriptor libero, e crea
-l'opportuna voce (cioè la struttura \struct{file}) nella file table.  Viene
-usato sempre il file descriptor con il valore più basso.
+
+La funzione apre il file usando il primo file descriptor libero, e crea
+l'opportuna voce, cioè la struttura \struct{file}, nella \textit{file table}
+del processo.  Viene sempre restituito come valore di ritorno il file
+descriptor con il valore più basso disponibile.
+
+\footnotetext[2]{la pagina di manuale di \func{open} segnala che questa
+  opzione è difettosa su NFS, e che i programmi che la usano per stabilire un
+  \textsl{file di lock}\index{file!di lock} possono incorrere in una
+  \textit{race condition}\itindex{race~condition}.  Si consiglia come
+  alternativa di usare un file con un nome univoco e la funzione \func{link}
+  per verificarne l'esistenza (vedi sez.~\ref{sec:ipc_file_lock}).}
+
+\footnotetext[3]{acronimo di \textit{Denial of
+    Service}\itindex{Denial~of~Service~(DoS)}, si chiamano così attacchi
+  miranti ad impedire un servizio causando una qualche forma di carico
+  eccessivo per il sistema, che resta bloccato nelle risposte all'attacco.}
 
 \begin{table}[!htb]
   \centering
 
 \begin{table}[!htb]
   \centering
@@ -238,90 +252,109 @@ usato sempre il file descriptor con il valore pi
     \textbf{Flag} & \textbf{Descrizione} \\
     \hline
     \hline % modalità di accesso al file
     \textbf{Flag} & \textbf{Descrizione} \\
     \hline
     \hline % modalità di accesso al file
-    \const{O\_RDONLY} & apre il file in sola lettura. \\
-    \const{O\_WRONLY} & apre il file in sola scrittura. \\
-    \const{O\_RDWR} & apre il file in lettura/scrittura. \\
+    \const{O\_RDONLY}  & Apre il file in sola lettura, le \acr{glibc}
+                         definiscono anche \const{O\_READ} come sinonimo. \\
+    \const{O\_WRONLY}  & Apre il file in sola scrittura, le \acr{glibc}
+                         definiscono anche \const{O\_WRITE} come sinonimo. \\
+    \const{O\_RDWR}    & Apre il file sia in lettura che in scrittura. \\
     \hline % modalità di apertura del file
     \hline
     \hline % modalità di apertura del file
     \hline
-    \const{O\_CREAT} & se il file non esiste verrà creato, con le regole di
-    titolarità del file viste in sez.~\ref{sec:file_ownership}. L'argomento
-    \param{mode} deve essere specificato. \\
-    \const{O\_EXCL} & usato in congiunzione con \const{O\_CREAT} fa sì che
-    l'esistenza del file diventi un errore\protect\footnotemark\ che fa fallire
-    \func{open} con \errcode{EEXIST}. \\
-    \const{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo
-    valore specifica anche una modalità di operazione (vedi sotto), e 
-    comporta che \func{open} ritorni immediatamente (l'opzione ha senso 
-    solo per le fifo, torneremo questo in sez.~\ref{sec:ipc_named_pipe}). \\
-    \const{O\_NOCTTY} & se \param{pathname} si riferisce ad un dispositivo di
-    terminale, questo non diventerà il terminale di controllo, anche se il
-    processo non ne ha ancora uno (si veda sez.~\ref{sec:sess_ctrl_term}). \\
-    \const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
-    sez.~\ref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
-    \const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
-    sez.~\ref{sec:file_locking}) sul file. Non è disponibile in Linux. \\
-    \const{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di
-    apertura consente la scrittura, allora la sua lunghezza verrà troncata a
-    zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli
-    altri casi il comportamento non è specificato. \\
-    \const{O\_NOFOLLOW} & se \param{pathname} è un link simbolico la chiamata
-    fallisce. Questa è un'estensione BSD aggiunta in Linux dal kernel 2.1.126.
-    Nelle versioni precedenti i link simbolici sono sempre seguiti, e questa
-    opzione è ignorata. \\
-    \const{O\_DIRECTORY} & se \param{pathname} non è una directory la chiamata
-    fallisce. Questo flag è specifico di Linux ed è stato introdotto con il
-    kernel 2.1.126 per evitare dei
-    \textit{DoS}\index{DoS}\protect\footnotemark\ quando  
-    \func{opendir} viene chiamata su una 
-    fifo o su un device di unità a nastri, non deve essere utilizzato al di 
-    fuori dell'implementazione di \func{opendir}. \\
-    \const{O\_LARGEFILE} & nel caso di sistemi a 32 bit che supportano file di
-    grandi dimensioni consente di aprire file le cui dimensioni non possono
-    essere rappresentate da numeri a 31 bit. \\
+    \const{O\_CREAT}   & Se il file non esiste verrà creato, con le regole di
+                         titolarità del file viste in
+                         sez.~\ref{sec:file_ownership}. Con questa opzione
+                         l'argomento \param{mode} deve essere specificato. \\
+    \const{O\_EXCL}    & Usato in congiunzione con \const{O\_CREAT} fa sì che
+                         la precedente esistenza del file diventi un
+                         errore\protect\footnotemark\ che fa fallire
+                         \func{open} con \errcode{EEXIST}. \\ 
+    \const{O\_NONBLOCK}& Apre il file in modalità non bloccante, e
+                         comporta che \func{open} ritorni immediatamente anche
+                         quando dovrebbe bloccarsi (l'opzione ha senso solo per
+                         le fifo, vedi sez.~\ref{sec:ipc_named_pipe}). \\
+    \const{O\_NOCTTY}  & Se \param{pathname} si riferisce ad un dispositivo di
+                         terminale, questo non diventerà il terminale di
+                         controllo, anche se il processo non ne ha ancora uno
+                         (si veda sez.~\ref{sec:sess_ctrl_term}). \\ 
+    \const{O\_SHLOCK}  & Apre il file con uno shared lock (vedi
+                         sez.~\ref{sec:file_locking}). Specifica di BSD, 
+                         assente in Linux. \\ 
+    \const{O\_EXLOCK}  & Apre il file con un lock esclusivo (vedi
+                         sez.~\ref{sec:file_locking}). Specifica di BSD, 
+                         assente in Linux.\\ 
+    \const{O\_TRUNC}   & Se usato su un file di dati aperto in scrittura,
+                         ne tronca la lunghezza a zero; con un terminale o una
+                         fifo viene ignorato, negli altri casi il
+                         comportamento non è specificato. \\ 
+    \const{O\_NOFOLLOW}& Se \param{pathname} è un link simbolico la chiamata
+                         fallisce. Questa è un'estensione BSD aggiunta in Linux
+                         dal kernel 2.1.126. Nelle versioni precedenti i link
+                         simbolici sono sempre seguiti, e questa opzione è
+                         ignorata. \\
+    \const{O\_DIRECTORY}&Se \param{pathname} non è una directory la chiamata
+                         fallisce. Questo flag è specifico di Linux ed è stato
+                         introdotto con il kernel 2.1.126 per evitare dei 
+                         \itindex{Denial~of~Service~(DoS)}
+                         \textit{DoS}\protect\footnotemark\ quando 
+                         \func{opendir} viene chiamata su una fifo o su un
+                         device di unità a nastri, non deve essere utilizzato
+                         al di fuori dell'implementazione di \func{opendir}. \\
+    \const{O\_LARGEFILE}&nel caso di sistemi a 32 bit che supportano file di
+                         grandi dimensioni consente di aprire file le cui
+                         dimensioni non possono essere rappresentate da numeri
+                         a 31 bit. \\
     \hline
     \hline
-    \hline  % modalità di operazione col file
-    \const{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna
-    scrittura la posizione corrente viene sempre impostata alla fine del
-    file. Può causare corruzione del file con NFS se più di un processo scrive
-    allo stesso tempo.\footnotemark\\
-    \const{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per
-    le operazioni di I/O (che tratteremo in sez.~\ref{sec:file_noblocking}): 
-    questo significa il fallimento di \func{read} in assenza di dati da 
-    leggere e quello di \func{write} in caso di impossibilità di scrivere 
-    immediatamente. Questa modalità ha senso solo per le fifo e per alcuni 
-    file di dispositivo. \\
-    \const{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di 
-    \const{O\_NONBLOCK}.\\
-    \const{O\_ASYNC} & apre il file per l'I/O in modalità
-    asincrona (vedi sez.~\ref{sec:file_asyncronous_io}). Quando è impostato 
-    viene generato il segnale \const{SIGIO} tutte le volte che sono disponibili
-    dati in input sul file. \\ 
-    \const{O\_SYNC} & apre il file per l'input/output sincrono: ogni
-    \func{write} bloccherà fino al completamento della scrittura di tutti i
-    dati sull'hardware sottostante.\\
-    \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}. \\
-    \const{O\_NOATIME} & blocca l'aggiornamento dei tempi di accesso dei
-    file (vedi sez.~\ref{sec:file_file_times}). Per molti filesystem questa
-    funzionalità non è disponibile per il singolo file ma come opzione in fase
-    di montaggio.\\
+    \hline  % modalità di operazione coi file
+    \const{O\_APPEND}  & Il file viene aperto in append mode. Prima di ciascuna
+                         scrittura la posizione corrente viene sempre impostata
+                         alla fine del file. Con NFS si può avere una
+                         corruzione del file se più di un processo scrive allo
+                         stesso tempo.\footnotemark\\ 
+    \const{O\_NONBLOCK}& Il file viene aperto in modalità non bloccante per
+                         le operazioni di I/O (che tratteremo in
+                         sez.~\ref{sec:file_noblocking}): questo significa il
+                         fallimento di \func{read} in assenza di dati da
+                         leggere e quello di \func{write} in caso di
+                         impossibilità di scrivere immediatamente. Questa
+                         modalità ha senso solo per le fifo e per alcuni file
+                         di dispositivo. \\ 
+    \const{O\_NDELAY}  & In Linux\footnotemark\ è sinonimo di 
+                         \const{O\_NONBLOCK}.\\
+    \const{O\_ASYNC}   & Apre il file per l'I/O in modalità asincrona (vedi
+                         sez.~\ref{sec:file_asyncronous_io}). Quando è
+                         impostato viene generato il segnale \const{SIGIO}
+                         tutte le volte che sono disponibili dati in input
+                         sul file. \\  
+    \const{O\_SYNC}    & Apre il file per l'input/output sincrono: ogni
+                         \func{write} bloccherà fino al completamento della
+                         scrittura di tutti i dati sull'hardware
+                         sottostante.\\  
+    \const{O\_FSYNC}   & sinonimo di \const{O\_SYNC}, usato da BSD. \\
+    \const{O\_DSYNC}   & Variante di I/O sincrono definita da POSIX; presente
+                         dal kernel 2.1.130 come sinonimo di
+                         \const{O\_SYNC}. \\
+    \const{O\_RSYNC}   & Variante analoga alla precedente, trattata allo stesso
+                         modo. \\
+    \const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei
+                         file (vedi sez.~\ref{sec:file_file_times}). Per molti
+                         filesystem questa funzionalità non è disponibile per
+                         il singolo file ma come opzione generale da
+                         specificare in fase di montaggio.\\
+    \const{O\_DIRECT}  & Esegue l'I/O direttamente dai buffer in user space
+                         in maniera sincrona, in modo da scavalcare i
+                         meccanismi di caching del kernel. In genere questo
+                         peggiora le prestazioni tranne quando le
+                         applicazioni\footnotemark ottimizzano il proprio
+                         caching. Per i kernel della serie 2.4 si deve
+                         garantire che i buffer in user space siano allineati
+                         alle dimensioni dei blocchi del filesystem; per il
+                         kernel 2.6 basta che siano allineati a multipli di 512
+                         byte.\\
     \hline
   \end{tabular}
   \caption{Valori e significato dei vari bit del \textit{file status flag}.}
   \label{tab:file_open_flags}
 \end{table}
 
     \hline
   \end{tabular}
   \caption{Valori e significato dei vari bit del \textit{file status flag}.}
   \label{tab:file_open_flags}
 \end{table}
 
-\footnotetext[2]{la pagina di manuale di \func{open} segnala che questa
-  opzione è difettosa su NFS, e che i programmi che la usano per stabilire un
-  \textsl{file di lock}\index{file!di lock} possono incorrere in una race
-  condition\index{race condition}.  Si consiglia come alternativa di usare un
-  file con un nome univoco e la funzione \func{link} per verificarne
-  l'esistenza (vedi sez.~\ref{sec:ipc_file_lock}).}
-
-\footnotetext[3]{\textit{Denial of Service}\index{DoS}, si chiamano così
-  attacchi miranti ad impedire un servizio causando una qualche forma di
-  carico eccessivo per il sistema, che resta bloccato nelle risposte
-  all'attacco.}
-
 \footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed
   il kernel deve simularla, ma questo comporta la possibilità di una race
   condition, vedi sez.~\ref{sec:file_atomic}.}
 \footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed
   il kernel deve simularla, ma questo comporta la possibilità di una race
   condition, vedi sez.~\ref{sec:file_atomic}.}
@@ -331,16 +364,26 @@ usato sempre il file descriptor con il valore pi
   un'ambiguità, dato che come vedremo in sez.~\ref{sec:file_read} il ritorno di
   zero da parte di \func{read} ha il significato di una end-of-file.}
 
   un'ambiguità, dato che come vedremo in sez.~\ref{sec:file_read} il ritorno di
   zero da parte di \func{read} ha il significato di una end-of-file.}
 
-Questa caratteristica permette di prevedere qual'è il valore del file
+\footnotetext[6]{l'opzione è stata introdotta dalla SGI in IRIX, e serve
+  sostanzialmente a permettere ad alcuni programmi (in genere database) la
+  gestione diretta della bufferizzazione dell'I/O in quanto essi sono in grado
+  di ottimizzarla al meglio per le loro prestazioni; l'opzione è presente
+  anche in FreeBSD, senza limiti di allineamento dei buffer. In Linux è stata
+  introdotta con il kernel 2.4.10, le versioni precedenti la ignorano.}
+
+
+Questa caratteristica permette di prevedere qual è il valore del file
 descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
 alcune applicazioni per sostituire i file corrispondenti ai file standard
 visti in sez.~\ref{sec:file_std_descr}: se ad esempio si chiude lo standard
 input e si apre subito dopo un nuovo file questo diventerà il nuovo standard
 descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
 alcune applicazioni per sostituire i file corrispondenti ai file standard
 visti in sez.~\ref{sec:file_std_descr}: se ad esempio si chiude lo standard
 input e si apre subito dopo un nuovo file questo diventerà il nuovo standard
-input (avrà cioè il file descriptor 0).  Il nuovo file descriptor non è
-condiviso con nessun altro processo (torneremo sulla condivisione dei file, in
-genere accessibile dopo una \func{fork}, in sez.~\ref{sec:file_sharing}) ed è
-impostato per restare aperto attraverso una \func{exec} (come accennato in
-sez.~\ref{sec:proc_exec}); l'offset è impostato all'inizio del file.
+input (avrà cioè il file descriptor 0).  
+
+Il nuovo file descriptor non è condiviso con nessun altro processo (torneremo
+sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in
+sez.~\ref{sec:file_sharing}) ed è impostato per restare aperto attraverso una
+\func{exec} (come accennato in sez.~\ref{sec:proc_exec}); l'offset è impostato
+all'inizio del file.
 
 L'argomento \param{mode} indica i permessi con cui il file viene creato; i
 valori possibili sono gli stessi già visti in sez.~\ref{sec:file_perm_overview}
 
 L'argomento \param{mode} indica i permessi con cui il file viene creato; i
 valori possibili sono gli stessi già visti in sez.~\ref{sec:file_perm_overview}
@@ -403,8 +446,8 @@ descriptor ritorna disponibile; il suo prototipo 
 \begin{prototype}{unistd.h}{int close(int fd)}
   Chiude il descrittore \param{fd}. 
   
 \begin{prototype}{unistd.h}{int close(int fd)}
   Chiude il descrittore \param{fd}. 
   
-  \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
-    con \var{errno} che assume i valori:
+  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
+    errore, con \var{errno} che assume i valori:
   \begin{errlist}
     \item[\errcode{EBADF}]  \param{fd} non è un descrittore valido.
     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
   \begin{errlist}
     \item[\errcode{EBADF}]  \param{fd} non è un descrittore valido.
     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
@@ -460,8 +503,8 @@ ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo 
   Imposta la posizione attuale nel file. 
   
   \bodydesc{La funzione ritorna il valore della posizione corrente in caso di
   Imposta la posizione attuale nel file. 
   
   \bodydesc{La funzione ritorna il valore della posizione corrente in caso di
-    successo e -1 in caso di errore nel qual caso \var{errno} assumerà uno dei
-    valori:
+    successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno
+    dei valori:
   \begin{errlist}
   \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket\index{socket} o una
     fifo.
   \begin{errlist}
   \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket\index{socket} o una
     fifo.
@@ -500,8 +543,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
 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 \textit{race condition}
-\index{race condition}, vedi sez.~\ref{sec:file_atomic}).
+(questa è una potenziale sorgente di \itindex{race~condition}\textit{race
+  condition}, vedi sez.~\ref{sec:file_atomic}).
 
 Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
 questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per
 
 Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
 questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per
@@ -527,7 +570,7 @@ prototipo 
   \param{buf}.
   
   \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
   \param{buf}.
   
   \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
-    -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+    $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di
     aver potuto leggere qualsiasi dato.
   \begin{errlist}
   \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di
     aver potuto leggere qualsiasi dato.
@@ -570,19 +613,21 @@ con un numero di byte inferiore a quelli richiesti.
 Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un
 socket\index{socket}, come vedremo in sez.~\ref{sec:sock_io_behav}), o per la
 lettura da certi file di dispositivo, come le unità a nastro, che
 Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un
 socket\index{socket}, come vedremo in sez.~\ref{sec:sock_io_behav}), o per la
 lettura da certi file di dispositivo, come le unità a nastro, che
-restituiscono sempre i dati ad un singolo blocco alla volta.  
-
-In realtà anche le due condizioni segnalate dagli errori \errcode{EINTR} e
-\errcode{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è
-bloccata in attesa di dati in ingresso e viene interrotta da un segnale; in
-tal caso l'azione da intraprendere è quella di rieseguire la funzione.
-Torneremo in dettaglio sull'argomento in sez.~\ref{sec:sig_gen_beha}.  La
-seconda si verifica quando il file è in modalità non bloccante (vedi
-sez.~\ref{sec:file_noblocking}) e non ci sono dati in ingresso: la funzione
-allora ritorna immediatamente con un errore \errcode{EAGAIN}\footnote{BSD usa
-  per questo errore la costante \errcode{EWOULDBLOCK}, in Linux, con le
-  \acr{glibc}, questa è sinonima di \errcode{EAGAIN}.} che indica soltanto che
-occorrerà provare a ripetere la lettura.
+restituiscono sempre i dati ad un singolo blocco alla volta, o come le linee
+seriali, che restituiscono solo i dati ricevuti fino al momento della lettura.
+
+Infine anche le due condizioni segnalate dagli errori \errcode{EINTR} ed
+\errcode{EAGAIN} non sono propriamente degli errori. La prima si verifica
+quando la \func{read} è bloccata in attesa di dati in ingresso e viene
+interrotta da un segnale; in tal caso l'azione da intraprendere è quella di
+rieseguire la funzione.  Torneremo in dettaglio sull'argomento in
+sez.~\ref{sec:sig_gen_beha}.  La seconda si verifica quando il file è aperto
+in modalità non bloccante (vedi sez.~\ref{sec:file_noblocking}) e non ci sono
+dati in ingresso: la funzione allora ritorna immediatamente con un errore
+\errcode{EAGAIN}\footnote{BSD usa per questo errore la costante
+  \errcode{EWOULDBLOCK}, in Linux, con le \acr{glibc}, questa è sinonima di
+  \errcode{EAGAIN}.} che indica soltanto che non essendoci al momento dati
+disponibili occorre provare a ripetere la lettura in un secondo tempo.
 
 La funzione \func{read} è una delle system call fondamentali, esistenti fin
 dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix
 
 La funzione \func{read} è una delle system call fondamentali, esistenti fin
 dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix
@@ -599,35 +644,47 @@ definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo 
 Cerca di leggere \param{count} byte dal file \param{fd}, a partire dalla
 posizione \param{offset}, nel buffer \param{buf}.
   
 Cerca di leggere \param{count} byte dal file \param{fd}, a partire dalla
 posizione \param{offset}, nel buffer \param{buf}.
   
-\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1
-  in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per
-  \func{read} e \func{lseek}.}
+\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
+  $-1$ in caso di errore, nel qual caso \var{errno} assumerà i valori già
+  visti per \func{read} e \func{lseek}.}
 \end{prototype}
 \end{prototype}
-\noindent che però diventa accessibile solo con la definizione della macro:
+
+La funzione prende esattamente gli stessi argomenti di \func{read} con lo
+stesso significato, a cui si aggiunge l'argomento \func{offset} che indica una
+posizione sul file. Indetico è il comportamento ed il valore di ritorno. La
+funzione serve quando si vogliono leggere dati dal file senza modificare la
+posizione corrente.
+
+L'uso di \func{pread} è equivalente all'esecuzione di una \func{read} seguita
+da una \func{lseek} che riporti al valore precedente la posizione corrente sul
+file, ma permette di eseguire l'operazione atomicamente. Questo può essere
+importante quando la posizione sul file viene condivisa da processi diversi
+(vedi sez.~\ref{sec:file_sharing}).  Il valore di
+\param{offset} fa sempre riferimento all'inizio del file.
+
+La funzione \func{pread} è disponibile anche in Linux, però diventa
+accessibile solo attivando il supporto delle estensioni previste dalle
+\textit{Single Unix Specification} con la definizione della macro:
 \begin{verbatim}
 #define _XOPEN_SOURCE 500
 \end{verbatim}
 \begin{verbatim}
 #define _XOPEN_SOURCE 500
 \end{verbatim}
+e si ricordi di definire questa macro prima dell'inclusione del file di
+dichiarazioni \file{unistd.h}.
 
 
-Questa funzione serve quando si vogliono leggere dati dal file senza
-modificare la posizione corrente. È equivalente all'esecuzione di una
-\func{read} seguita da una \func{lseek} che riporti al valore precedente la
-posizione corrente sul file, ma permette di eseguire l'operazione
-atomicamente. Questo può essere importante quando la posizione sul file viene
-condivisa da processi diversi (vedi sez.~\ref{sec:file_sharing}).  Il valore di
-\param{offset} fa sempre riferimento all'inizio del file.
 
 
 \subsection{La funzione \func{write}}
 \label{sec:file_write}
 
 
 
 \subsection{La funzione \func{write}}
 \label{sec:file_write}
 
-Una volta che un file è stato aperto (con il permesso in scrittura) su può
+Una volta che un file è stato aperto (con il permesso in scrittura) si può
 scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è:
 \begin{prototype}{unistd.h}{ssize\_t write(int fd, void * buf, size\_t count)}
   
   Scrive \param{count} byte dal buffer \param{buf} sul file \param{fd}.
   
   \bodydesc{La funzione ritorna il numero di byte scritti in caso di successo
 scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è:
 \begin{prototype}{unistd.h}{ssize\_t write(int fd, void * buf, size\_t count)}
   
   Scrive \param{count} byte dal buffer \param{buf} sul file \param{fd}.
   
   \bodydesc{La funzione ritorna il numero di byte scritti in caso di successo
-    e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+    e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei
+    valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
     la scrittura.
   \begin{errlist}
   \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
     la scrittura.
@@ -671,9 +728,9 @@ nel file, il suo prototipo 
 Cerca di scrivere sul file \param{fd}, a partire dalla posizione
 \param{offset}, \param{count} byte dal buffer \param{buf}.
   
 Cerca di scrivere sul file \param{fd}, a partire dalla posizione
 \param{offset}, \param{count} byte dal buffer \param{buf}.
   
-\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1
-  in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per
-  \func{write} e \func{lseek}.}
+\bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
+  $-1$ in caso di errore, nel qual caso \var{errno} assumerà i valori già
+  visti per \func{write} e \func{lseek}.}
 \end{prototype}
 \noindent e per essa valgono le stesse considerazioni fatte per \func{pread}.
 
 \end{prototype}
 \noindent e per essa valgono le stesse considerazioni fatte per \func{pread}.
 
@@ -788,13 +845,13 @@ sez.~\ref{sec: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
 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 \textit{race
-  condition}\index{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 nostro
-primo processo avrà ancora la posizione corrente impostata con la \func{lseek}
-che non corrisponde più alla fine del file, e la successiva \func{write}
-sovrascriverà i dati del secondo processo.
+fine del file e poi scrivere può condurre ad una
+\itindex{race~condition}\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 nostro primo processo avrà ancora la posizione corrente impostata con la
+\func{lseek} che non corrisponde più alla fine del file, e la successiva
+\func{write} sovrascriverà i dati del secondo processo.
 
 Il problema è che usare due system call in successione non è un'operazione
 atomica; il problema è stato risolto introducendo la modalità
 
 Il problema è che usare due system call in successione non è un'operazione
 atomica; il problema è stato risolto introducendo la modalità
@@ -808,9 +865,9 @@ Un altro caso tipico in cui 
 creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file
 esiste. In questo caso la sequenza logica porterebbe a verificare prima
 l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat};
 creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file
 esiste. In questo caso la sequenza logica porterebbe a verificare prima
 l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat};
-di nuovo avremmo la possibilità di una race condition\index{race condition} da
-parte di un altro processo che crea lo stesso file fra il controllo e la
-creazione.
+di nuovo avremmo la possibilità di una \textit{race
+  condition}\itindex{race~condition} da parte di un altro processo che crea lo
+stesso file fra il controllo e la creazione.
 
 Per questo motivo sono stati introdotti per \func{open} i due flag
 \const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo
 
 Per questo motivo sono stati introdotti per \func{open} i due flag
 \const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo
@@ -868,8 +925,8 @@ usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono:
   \funcdecl{int fdatasync(int fd)}
   Sincronizza i dati del file \param{fd}.
   
   \funcdecl{int fdatasync(int fd)}
   Sincronizza i dati del file \param{fd}.
   
-  \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
-    nel qual caso \var{errno} assume i valori:
+  \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
+    errore, nel qual caso \var{errno} assume i valori:
   \begin{errlist}
   \item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la
     sincronizzazione.
   \begin{errlist}
   \item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la
     sincronizzazione.
@@ -904,7 +961,7 @@ prototipo 
   Crea una copia del file descriptor \param{oldfd}.
   
   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
   Crea una copia del file descriptor \param{oldfd}.
   
   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
-    -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei
+    $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei
     valori:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto.
     valori:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto.
@@ -936,7 +993,7 @@ sull'altro (dato che quello che viene modificato 
 della \textit{file table} a cui entrambi fanno riferimento). L'unica
 differenza fra due file descriptor duplicati è che ciascuno avrà il suo
 \textit{file descriptor flag}; a questo proposito va specificato che nel caso
 della \textit{file table} a cui entrambi fanno riferimento). L'unica
 differenza fra due file descriptor duplicati è che ciascuno avrà il suo
 \textit{file descriptor flag}; a questo proposito va specificato che nel caso
-di \func{dup} il flag di \textit{close-on-exec}\index{close-on-exec} (vedi
+di \func{dup} il flag di \textit{close-on-exec}\itindex{close-on-exec} (vedi
 sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre cancellato
 nella copia.
 
 sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre cancellato
 nella copia.
 
@@ -951,14 +1008,14 @@ disponibile.
 
 Dato che questa è l'operazione più comune, è prevista una diversa versione
 della funzione, \funcd{dup2}, che permette di specificare esplicitamente
 
 Dato che questa è l'operazione più comune, è prevista una diversa versione
 della funzione, \funcd{dup2}, che permette di specificare esplicitamente
-qual'è il valore di file descriptor che si vuole avere come duplicato; il suo
+qual è il valore di file descriptor che si vuole avere come duplicato; il suo
 prototipo è:
 \begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
   
   Rende \param{newfd} una copia del file descriptor \param{oldfd}.
   
   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
 prototipo è:
 \begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
   
   Rende \param{newfd} una copia del file descriptor \param{oldfd}.
   
   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
-    -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+    $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
   \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.
   \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.
@@ -972,9 +1029,9 @@ sar
 allo stesso valore per il file descriptor).
 
 La duplicazione dei file descriptor può essere effettuata anche usando la
 allo stesso valore per il file descriptor).
 
 La duplicazione dei file descriptor può essere effettuata anche usando la
-funzione di controllo dei file \func{fnctl} (che esamineremo in
+funzione di controllo dei file \func{fcntl} (che esamineremo in
 sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}.  L'operazione ha
 sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}.  L'operazione ha
-la sintassi \code{fnctl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
+la sintassi \code{fcntl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
 \param{newfd} diventa equivalente a \func{dup}. 
 
 La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
 \param{newfd} diventa equivalente a \func{dup}. 
 
 La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
@@ -1010,8 +1067,8 @@ il cui prototipo 
   sul file \param{fd}.
   
   \bodydesc{La funzione ha valori di ritorno diversi a seconda
   sul file \param{fd}.
   
   \bodydesc{La funzione ha valori di ritorno diversi a seconda
-    dell'operazione. In caso di errore il valore di ritorno è sempre -1 ed il
-    codice dell'errore è restituito nella variabile \var{errno}; i codici
+    dell'operazione. In caso di errore il valore di ritorno è sempre $-1$ ed
+    il codice dell'errore è restituito nella variabile \var{errno}; i codici
     possibili dipendono dal tipo di operazione, l'unico valido in generale è:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
     possibili dipendono dal tipo di operazione, l'unico valido in generale è:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
@@ -1030,73 +1087,75 @@ per \var{cmd} 
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore
   maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. Ritorna il
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore
   maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. Ritorna il
-  nuovo file descriptor in caso di successo e -1 in caso di errore. Gli errori
-  possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore del
-  massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il
+  nuovo file descriptor in caso di successo e $-1$ in caso di errore. Gli
+  errori possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore
+  del massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il
   massimo numero di descrittori consentito.
 \item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al
   valore specificato con \param{arg}. Al momento l'unico bit usato è quello di
   massimo numero di descrittori consentito.
 \item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al
   valore specificato con \param{arg}. Al momento l'unico bit usato è quello di
-  \textit{close-on-exec}\index{close-on-exec}, identificato dalla costante
+  \textit{close-on-exec}\itindex{close-on-exec}, identificato dalla costante
   \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
   \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
-  esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Ritorna un
-  valore nullo in caso di successo e -1 in caso di errore.
+  esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}).  Ritorna un
+  valore nullo in caso di successo e $-1$ in caso di errore.
 \item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
 \item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
-  \param{fd} o -1 in caso di errore; se \const{FD\_CLOEXEC} è impostato i file
-  descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il
-  comportamento predefinito) restano aperti.
+  \param{fd} o $-1$ in caso di errore; se \const{FD\_CLOEXEC} è impostato i
+  file descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti
+  (il comportamento predefinito) restano aperti.
 \item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag} in
 \item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag} in
-  caso di successo o -1 in caso di errore; permette cioè di rileggere quei bit
-  impostati da \func{open} all'apertura del file che vengono memorizzati
+  caso di successo o $-1$ in caso di errore; permette cioè di rileggere quei
+  bit impostati da \func{open} all'apertura del file che vengono memorizzati
   (quelli riportati nella prima e terza sezione di
   tab.~\ref{tab:file_open_flags}).
 \item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore
   (quelli riportati nella prima e terza sezione di
   tab.~\ref{tab:file_open_flags}).
 \item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore
-  specificato da \param{arg}, ritorna un valore nullo in caso di successo o -1
-  in caso di errore. Possono essere impostati solo i bit riportati nella terza
-  sezione di tab.~\ref{tab:file_open_flags}.\footnote{la pagina di manuale
-    riporta come impostabili solo \const{O\_APPEND}, \const{O\_NONBLOCK} e
-    \const{O\_ASYNC}.}
+  specificato da \param{arg}, ritorna un valore nullo in caso di successo o
+  $-1$ in caso di errore. Possono essere impostati solo i bit riportati nella
+  terza sezione di tab.~\ref{tab:file_open_flags}.\footnote{la pagina di
+    manuale riporta come impostabili solo \const{O\_APPEND},
+    \const{O\_NONBLOCK} e \const{O\_ASYNC}.}
 \item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da
 \item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da
-  \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato,
-  ritorna un valore nullo in caso di successo o -1 in caso di errore.  Questa
+  \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato;
+  ritorna un valore nullo in caso di successo o $-1$ in caso di errore.  Questa
   funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
 \item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
   specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da
   funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
 \item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
   specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da
-  qualcun'altro ritorna immediatamente restituendo -1 e imposta \var{errno} a
+  qualcun altro ritorna immediatamente restituendo $-1$ e imposta \var{errno} a
   \errcode{EACCES} o \errcode{EAGAIN}, in caso di successo ritorna un valore
   nullo. Questa funzionalità è trattata in dettaglio in
   sez.~\ref{sec:file_posix_lock}.
 \item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
   la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se
   \errcode{EACCES} o \errcode{EAGAIN}, in caso di successo ritorna un valore
   nullo. Questa funzionalità è trattata in dettaglio in
   sez.~\ref{sec:file_posix_lock}.
 \item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
   la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se
-  l'attesa viene interrotta da un segnale la funzione restituisce -1 e imposta
-  \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore nullo.
-  Questa funzionalità è trattata in dettaglio in
+  l'attesa viene interrotta da un segnale la funzione restituisce $-1$ e
+  imposta \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore
+  nullo.  Questa funzionalità è trattata in dettaglio in
   sez.~\ref{sec:file_posix_lock}.
 \item[\const{F\_GETOWN}] restituisce il \acr{pid} del processo o
   sez.~\ref{sec:file_posix_lock}.
 \item[\const{F\_GETOWN}] restituisce il \acr{pid} del processo o
-  l'identificatore del process group\footnote{i \texttt{process group} sono
+  l'identificatore del \itindex{process~group} \textit{process
+    group}\footnote{i \itindex{process~group} \textit{process group} sono
     (vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel
     controllo di sessione; a ciascuno di essi è associato un identificatore
     (un numero positivo analogo al \acr{pid}).}  che è preposto alla ricezione
   dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
     (vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel
     controllo di sessione; a ciascuno di essi è associato un identificatore
     (un numero positivo analogo al \acr{pid}).}  che è preposto alla ricezione
   dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
-  descriptor \param{fd}. Nel caso di un process group viene restituito un
-  valore negativo il cui valore assoluto corrisponde all'identificatore del
-  process group. In caso di errore viene restituito -1.
+  descriptor \param{fd}. Nel caso di un \textit{process group} viene
+  restituito un valore negativo il cui valore assoluto corrisponde
+  all'identificatore del \itindex{process~group}\textit{process group}.  In
+  caso di errore viene restituito $-1$.
 \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
 \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
-  l'identificatore del processo o del \textit{process group} che riceverà i
-  segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
-  descriptor \param{fd}, ritorna un valore nullo in caso di successo o -1 in
-  caso di errore.  Come per \const{F\_GETOWN}, per impostare un
-  \textit{process group} si deve usare per \param{arg} un valore negativo, il
-  cui valore assoluto corrisponde all'identificatore del \textit{process
-    group}.
+  l'identificatore del processo o del \itindex{process~group} \textit{process
+    group} che riceverà i segnali \const{SIGIO} e \const{SIGURG} per gli
+  eventi associati al file descriptor \param{fd}, ritorna un valore nullo in
+  caso di successo o $-1$ in caso di errore.  Come per \const{F\_GETOWN}, per
+  impostare un \itindex{process~group} \textit{process group} si deve usare
+  per \param{arg} un valore negativo, il cui valore assoluto corrisponde
+  all'identificatore del \itindex{process~group} \textit{process group}.
 \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
   sono dati disponibili in ingresso su un file descriptor aperto ed impostato
   per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0
   indica il valore predefinito (che è \const{SIGIO}), un valore diverso da
   zero indica il segnale richiesto, (che può essere anche lo stesso
 \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
   sono dati disponibili in ingresso su un file descriptor aperto ed impostato
   per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0
   indica il valore predefinito (che è \const{SIGIO}), un valore diverso da
   zero indica il segnale richiesto, (che può essere anche lo stesso
-  \const{SIGIO}). In caso di errore ritorna -1.
+  \const{SIGIO}). In caso di errore ritorna $-1$.
 \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa
   possibile effettuare I/O sul file descriptor in caso di I/O asincrono,
 \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa
   possibile effettuare I/O sul file descriptor in caso di I/O asincrono,
-  ritorna un valore nullo in caso di successo o -1 in caso di errore. Il
+  ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
   valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro
   valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il
   segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è
   valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro
   valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il
   segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è
@@ -1107,27 +1166,28 @@ per \var{cmd} 
   (come vedremo in sez.~\ref{sec:file_asyncronous_io}).\footnote{i due comandi
     \const{F\_SETSIG} e \const{F\_GETSIG} sono una estensione specifica di
     Linux.}
   (come vedremo in sez.~\ref{sec:file_asyncronous_io}).\footnote{i due comandi
     \const{F\_SETSIG} e \const{F\_GETSIG} sono una estensione specifica di
     Linux.}
-\item[\const{F\_SETLEASE}] imposta o rimuove un \textit{file
-    lease}\footnote{questa è una nuova funzionalità, specifica di Linux, e
-    presente solo a partire dai kernel della serie 2.4.x, in cui il processo
-    che detiene un \textit{lease} su un file riceve una notifica qualora un
-    altro processo cerca di eseguire una \func{open} o una \func{truncate} su
-    di esso.} sul file descriptor \var{fd} a seconda del valore del terzo
-  argomento, che in questo caso è un \ctyp{int}, ritorna un valore nullo in
-  caso di successo o -1 in caso di errore. Questa funzionalità avanzata è
-  trattata in dettaglio in sez.~\ref{sec:file_asyncronous_operation}.
-\item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il
-  processo detiene nei confronti del file descriptor \var{fd} o -1 in caso di
-  errore. Con questo comando il terzo argomento può essere omesso. Questa
+\item[\const{F\_SETLEASE}] imposta o rimuove un \index{file!lease}
+  \textit{file lease}\footnote{questa è una nuova funzionalità, specifica di
+    Linux, e presente solo a partire dai kernel della serie 2.4.x, in cui il
+    processo che detiene un \textit{lease} su un file riceve una notifica
+    qualora un altro processo cerca di eseguire una \func{open} o una
+    \func{truncate} su di esso.} sul file descriptor \var{fd} a seconda del
+  valore del terzo argomento, che in questo caso è un \ctyp{int}, ritorna un
+  valore nullo in caso di successo o $-1$ in caso di errore. Questa
   funzionalità avanzata è trattata in dettaglio in
   funzionalità avanzata è trattata in dettaglio in
-  sez.~\ref{sec:file_asyncronous_operation}.
+  sez.~\ref{sec:file_asyncronous_lease}.
+\item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease}
+  \index{file!lease} che il processo detiene nei confronti del file descriptor
+  \var{fd} o $-1$ in caso di errore. Con questo comando il terzo argomento può
+  essere omesso. Questa funzionalità avanzata è trattata in dettaglio in
+  sez.~\ref{sec:file_asyncronous_lease}.
 \item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene
   riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro
   segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
   direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
 \item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene
   riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro
   segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
   direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
-  in essa contenuti; ritorna un valore nullo in caso di successo o -1 in caso
+  in essa contenuti; ritorna un valore nullo in caso di successo o $-1$ in caso
   di errore. Questa funzionalità avanzata, disponibile dai kernel della serie
   di errore. Questa funzionalità avanzata, disponibile dai kernel della serie
-  2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_operation}.
+  2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
 \end{basedescript}
 
 La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per
 \end{basedescript}
 
 La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per
@@ -1135,11 +1195,10 @@ poter essere affrontate in tutti i loro aspetti a questo punto; saranno
 pertanto riprese più avanti quando affronteremo le problematiche ad esse
 relative. In particolare le tematiche relative all'I/O asincrono e ai vari
 meccanismi di notifica saranno trattate in maniera esaustiva in
 pertanto riprese più avanti quando affronteremo le problematiche ad esse
 relative. In particolare le tematiche relative all'I/O asincrono e ai vari
 meccanismi di notifica saranno trattate in maniera esaustiva in
-sez.~\ref{sec:file_asyncronous_operation} mentre quelle relative al
-\textit{file locking}\index{file!locking} saranno esaminate in
+sez.~\ref{sec:file_asyncronous_access} mentre quelle relative al \textit{file
+  locking}\index{file!locking} saranno esaminate in
 sez.~\ref{sec:file_locking}).
 
 sez.~\ref{sec:file_locking}).
 
-
 Si tenga presente infine che quando si usa la funzione per determinare le
 modalità di accesso con cui è stato aperto il file (attraverso l'uso del
 comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel
 Si tenga presente infine che quando si usa la funzione per determinare le
 modalità di accesso con cui è stato aperto il file (attraverso l'uso del
 comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel
@@ -1171,14 +1230,14 @@ di una funzione apposita, \funcd{ioctl}, con cui poter compiere le operazioni
 specifiche di ogni dispositivo particolare, usando come riferimento il solito
 file descriptor.  Il prototipo di questa funzione è:
 \begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}  
 specifiche di ogni dispositivo particolare, usando come riferimento il solito
 file descriptor.  Il prototipo di questa funzione è:
 \begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}  
-  Manipola il dispositivo sottostante, usando il parametro \param{request} per
-  specificare l'operazione richiesta ed il terzo parametro (usualmente di tipo
+  Manipola il dispositivo sottostante, usando l'argomento \param{request} per
+  specificare l'operazione richiesta ed il terzo argomento (usualmente di tipo
   \param{char * argp} o \param{int argp}) per il trasferimento
   dell'informazione necessaria.
   
   \bodydesc{La funzione nella maggior parte dei casi ritorna 0, alcune
     operazioni usano però il valore di ritorno per restituire informazioni. In
   \param{char * argp} o \param{int argp}) per il trasferimento
   dell'informazione necessaria.
   
   \bodydesc{La funzione nella maggior parte dei casi ritorna 0, alcune
     operazioni usano però il valore di ritorno per restituire informazioni. In
-    caso di errore viene sempre restituito -1 ed \var{errno} assumerà uno dei
+    caso di errore viene sempre restituito $-1$ ed \var{errno} assumerà uno dei
     valori:
   \begin{errlist}
   \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un device, o
     valori:
   \begin{errlist}
   \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un device, o
@@ -1230,13 +1289,17 @@ effettuata attraverso \func{ioctl} in quasi tutte le implementazioni di Unix),
 qui riportiamo solo i valori di alcuni comandi che sono definiti per ogni
 file:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 qui riportiamo solo i valori di alcuni comandi che sono definiti per ogni
 file:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{FIOCLEX}] Imposta il bit di \textit{close on exec}.
-\item[\const{FIONCLEX}] Cancella il bit di \textit{close on exec}.
+\item[\const{FIOCLEX}] Imposta il flag di
+  \textit{close-on-exec}\itindex{close-on-exec}.
+\item[\const{FIONCLEX}] Cancella il flag di
+  \textit{close-on-exec}\itindex{close-on-exec}.
 \item[\const{FIOASYNC}] Abilita l'I/O asincrono.
 \item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante.
 \end{basedescript}
 relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}.
 
 \item[\const{FIOASYNC}] Abilita l'I/O asincrono.
 \item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante.
 \end{basedescript}
 relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}.
 
+% TODO estendere la lista delle ioctl
+
 
 %%% Local Variables: 
 %%% mode: latex
 
 %%% Local Variables: 
 %%% mode: latex