Aggiornamenti del copyright all'anno nuovo, e risistemazione delle
[gapil.git] / fileunix.tex
index 950f6ffb4733cd6925e87ec96a63d869c8d55454..7ff6ca06bba698eef71005f7cb5da3fa8e95dd36 100644 (file)
@@ -1,9 +1,9 @@
 %% fileunix.tex
 %%
-%% Copyright (C) 2000-2004 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2007 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 "Prefazione",
+%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
@@ -13,7 +13,7 @@
 
 
 Esamineremo in questo capitolo la prima delle due interfacce di programmazione
-per i file, quella dei \textit{file descriptor}\index{file!descriptor},
+per i file, quella dei \index{file!descriptor} \textit{file descriptor},
 nativa di Unix. Questa è l'interfaccia di basso livello provvista direttamente
 dalle system call, che non prevede funzionalità evolute come la
 bufferizzazione o funzioni di lettura o scrittura formattata, e sulla quale è
@@ -34,12 +34,14 @@ tutte le implementazione di un sistema unix-like.
 \subsection{L'architettura dei \textit{file descriptor}}
 \label{sec:file_fd}
 
-\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
-l'inode\index{inode} del file e inizializzare i puntatori che rendono
-disponibili le funzioni che il VFS mette a disposizione (riportate in
+\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 \index{inode} l'inode
+del file e inizializzare i puntatori che rendono disponibili le funzioni che
+il VFS mette a disposizione (riportate in
 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.
@@ -52,37 +54,38 @@ 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
-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
+\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. 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.
 \item una tabella che contiene un puntatore alla relativa voce nella
-  \textit{file table} per ogni file aperto.
+  \itindex{file~table} \textit{file table} per ogni file aperto.
 \end{itemize*}
 il \textit{file descriptor} in sostanza è l'intero positivo che indicizza
 quest'ultima tabella.
 
-La \textit{file table} è una tabella che contiene una voce per ciascun file
-che è stato aperto nel sistema. In Linux è costituita da strutture di tipo
-\struct{file}; in ciascuna di esse sono tenute varie informazioni relative al
-file, fra cui:
+La \itindex{file~table} \textit{file table} è una tabella che contiene una
+voce per ciascun file che è stato aperto nel sistema. In Linux è costituita da
+strutture di tipo \struct{file}; in ciascuna di esse sono tenute varie
+informazioni relative al file, fra cui:
 \begin{itemize*}
 \item lo stato del file (nel campo \var{f\_flags}).
 \item il valore della posizione corrente (l'\textit{offset}) nel file (nel
   campo \var{f\_pos}).
-\item un puntatore all'inode\index{inode}\footnote{nel kernel 2.4.x si è in
-    realtà passati ad un puntatore ad una struttura \struct{dentry} che punta a
-    sua volta all'inode\index{inode} passando per la nuova struttura del VFS.}
-  del file.
+\item un puntatore \index{inode} all'inode\footnote{nel kernel 2.4.x si è in
+    realtà passati ad un puntatore ad una struttura \struct{dentry} che punta
+    a sua volta \index{inode} all'inode passando per la nuova struttura del
+    VFS.}  del file.
 %\item un puntatore alla tabella delle funzioni \footnote{la struttura
 %    \var{f\_op} descritta in sez.~\ref{sec:file_vfs_work}} che si possono usare
 %  sul file.
@@ -91,6 +94,12 @@ 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.
+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}
@@ -98,11 +107,6 @@ varie strutture di dati sulla quale essa 
   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 +119,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
-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 \index{file!descriptor} \textit{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
@@ -153,11 +157,11 @@ posto di questi valori numerici:
   \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 \index{inode} 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
@@ -175,20 +179,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
-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 è
-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 \index{file!descriptor} file descriptor, il suo prototipo è:
 \begin{functions}
   \headdecl{sys/types.h}
   \headdecl{sys/stat.h}
@@ -199,9 +201,9 @@ prototipo 
   \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}.  
@@ -217,18 +219,32 @@ prototipo 
     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}
 
-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 \itindex{file~table}
+\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
+  \index{file!di lock} \textsl{file di lock} possono incorrere in una
+  \itindex{race~condition} \textit{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 \itindex{Denial~of~Service~(DoS)} \textit{Denial
+    of Service}, 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
@@ -238,115 +254,148 @@ usato sempre il file descriptor con il valore pi
     \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
-    \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_management}. 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
+                         dispositivo associato ad una unità a nastri, non deve
+                         dispositivo 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  % 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 dati
-    sul 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}). In Linux questa opzione non è
-    disponibile per il singolo file ma come opzione per il filesystem in fase
-    di montaggio.\\
+    \hline  % modalità di operazione coi file
+    \const{O\_APPEND}  & Il file viene aperto in \itindex{append~mode}
+                         \textit{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}
 
-\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
+  \itindex{append~mode} \textit{append}, ed il kernel deve simularla, ma
+  questo comporta la possibilità di una \itindex{race~condition} \textit{race
+    condition}, vedi sez.~\ref{sec:file_atomic}.}
 
 \footnotetext[5]{l'opzione origina da SVr4, dove però causava il ritorno da
   una \func{read} con un valore nullo e non con un errore, questo introduce
   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
-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}
 e possono essere specificati come OR binario delle costanti descritte in
 tab.~\ref{tab:file_bit_perm}. Questi permessi sono filtrati dal valore di
-\var{umask} (vedi sez.~\ref{sec:file_umask}) per il processo.
+\var{umask} (vedi sez.~\ref{sec:file_perm_management}) per il processo.
 
 La funzione prevede diverse opzioni, che vengono specificate usando vari bit
 dell'argomento \param{flags}.  Alcuni di questi bit vanno anche a costituire
@@ -403,8 +452,8 @@ descriptor ritorna disponibile; il suo prototipo 
 \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.
@@ -412,12 +461,13 @@ descriptor ritorna disponibile; il suo prototipo 
   ed inoltre \errval{EIO}.}
 \end{prototype}
 
-La chiusura di un file rilascia ogni blocco (il \textit{file
-  locking}\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che
-il processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
+La chiusura di un file rilascia ogni blocco (il \textit{file locking}
+\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che il
+processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
 riferimento (di eventuali copie) ad un file aperto, tutte le risorse nella
-file table vengono rilasciate. Infine se il file descriptor era l'ultimo
-riferimento ad un file su disco quest'ultimo viene cancellato.
+\itindex{file~table} \textit{file table} vengono rilasciate. Infine se il file
+descriptor era l'ultimo riferimento ad un file su disco quest'ultimo viene
+cancellato.
 
 Si ricordi che quando un processo termina anche tutti i suoi file descriptor
 vengono chiusi, molti programmi sfruttano questa caratteristica e non usano
@@ -450,9 +500,10 @@ positivo come 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à \const{O\_APPEND}) questa
-posizione viene impostata a zero all'apertura del file. È possibile impostarla
-ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo è:
+In genere (a meno di non avere richiesto la modalità \itindex{append~mode}
+\const{O\_APPEND}) questa posizione viene impostata a zero all'apertura del
+file. È possibile impostarla ad un valore qualsiasi con la funzione
+\funcd{lseek}, il cui prototipo è:
 \begin{functions}
   \headdecl{sys/types.h}
   \headdecl{unistd.h}
@@ -460,11 +511,10 @@ 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
-    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.
+  \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo.
     \item[\errcode{EINVAL}] \param{whence} non è un valore valido.
   \end{errlist}
   ed inoltre \errval{EBADF}.}
@@ -500,8 +550,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 \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
@@ -527,7 +577,7 @@ prototipo 
   \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.
@@ -567,22 +617,24 @@ 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\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.
+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
+di dispositivo, come le unità a nastro, che 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
@@ -599,35 +651,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}.
   
-\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}
-\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. Identico è 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}
+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}
 
-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
-    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.
@@ -651,11 +715,11 @@ scrivere su di esso utilizzando la funzione \funcd{write}, il cui 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à \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 non è detto che tutti i filesystem
-supportino questa capacità.
+modalità \itindex{append~mode} \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
+non è detto che tutti i filesystem supportino questa capacità.
 
 Se \param{count} è zero la funzione restituisce zero senza fare nient'altro.
 Per i file ordinari il numero di byte scritti è sempre uguale a quello
@@ -671,9 +735,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}.
   
-\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}.
 
@@ -705,34 +769,35 @@ confronti dell'accesso allo stesso file da parte di processi diversi.
   \label{fig:file_mult_acc}
 \end{figure}
 
-Il primo caso è quello in cui due processi diversi aprono lo stesso file
-su disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
+Il primo caso è quello in cui due processi diversi aprono lo stesso file su
+disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
 situazione come quella illustrata in fig.~\ref{fig:file_mult_acc}: ciascun
 processo avrà una sua voce nella \textit{file table} referenziata da un
 diverso file descriptor nella sua \struct{file\_struct}. Entrambe le voci
-nella \textit{file table} faranno però riferimento allo stesso
-inode\index{inode} su disco.
+nella \itindex{file~table} \textit{file table} faranno però riferimento allo
+stesso \index{inode} inode su disco.
 
 Questo significa che ciascun processo avrà la sua posizione corrente sul file,
 la sua modalità di accesso e versioni proprie di tutte le proprietà che
-vengono mantenute nella sua voce della \textit{file table}. Questo ha
-conseguenze specifiche sugli effetti della possibile azione simultanea sullo
-stesso file, in particolare occorre tenere presente che:
+vengono mantenute nella sua voce della \itindex{file~table} \textit{file
+  table}. Questo ha conseguenze specifiche sugli effetti della possibile
+azione simultanea sullo stesso file, in particolare occorre tenere presente
+che:
 \begin{itemize}
 \item ciascun processo può scrivere indipendentemente; dopo ciascuna
   \func{write} la posizione corrente sarà cambiata solo nel processo. Se la
   scrittura eccede la dimensione corrente del file questo verrà esteso
-  automaticamente con l'aggiornamento del campo \var{i\_size}
-  nell'inode\index{inode}.
-\item se un file è in modalità \const{O\_APPEND} tutte le volte che viene
-  effettuata una scrittura la posizione corrente viene prima impostata alla
-  dimensione corrente del file letta dall'inode\index{inode}. Dopo la
-  scrittura il file viene automaticamente esteso.
+  automaticamente con l'aggiornamento del campo \var{i\_size} \index{inode}
+  nell'inode.
+\item se un file è in modalità \itindex{append~mode} \const{O\_APPEND} tutte
+  le volte che viene effettuata una scrittura la posizione corrente viene
+  prima impostata alla dimensione corrente del file letta \index{inode}
+  dall'inode. Dopo la scrittura il file viene automaticamente esteso.
 \item l'effetto di \func{lseek} è solo quello di cambiare il campo
-  \var{f\_pos} nella struttura \struct{file} della \textit{file table}, non
-  c'è nessuna operazione sul file su disco. Quando la si usa per porsi alla
-  fine del file la posizione viene impostata leggendo la dimensione corrente
-  dall'inode\index{inode}.
+  \var{f\_pos} nella struttura \struct{file} della \itindex{file~table}
+  \textit{file table}, non c'è nessuna operazione sul file su disco. Quando la
+  si usa per porsi alla fine del file la posizione viene impostata leggendo la
+  dimensione corrente \index{inode} dall'inode.
 \end{itemize}
 
 \begin{figure}[htb]
@@ -743,12 +808,13 @@ stesso file, in particolare occorre tenere presente che:
 \end{figure}
 
 Il secondo caso è quello in cui due file descriptor di due processi diversi
-puntino alla stessa voce nella \textit{file table}; questo è ad esempio il
-caso dei file aperti che vengono ereditati dal processo figlio all'esecuzione
-di una \func{fork} (si ricordi quanto detto in sez.~\ref{sec:proc_fork}). La
-situazione è illustrata in fig.~\ref{fig:file_acc_child}; dato che il processo
-figlio riceve una copia dello spazio di indirizzi del padre, riceverà anche
-una copia di \struct{file\_struct} e relativa tabella dei file aperti.
+puntino alla stessa voce nella \itindex{file~table} \textit{file table};
+questo è ad esempio il caso dei file aperti che vengono ereditati dal processo
+figlio all'esecuzione di una \func{fork} (si ricordi quanto detto in
+sez.~\ref{sec:proc_fork}). La situazione è illustrata in
+fig.~\ref{fig:file_acc_child}; dato che il processo figlio riceve una copia
+dello spazio di indirizzi del padre, riceverà anche una copia di
+\struct{file\_struct} e relativa tabella dei file aperti.
 
 In questo modo padre e figlio avranno gli stessi file descriptor che faranno
 riferimento alla stessa voce nella \textit{file table}, condividendo così la
@@ -781,36 +847,37 @@ Se dal punto di vista della lettura dei dati questo non comporta nessun
 problema, quando si andrà a scrivere le operazioni potranno mescolarsi in
 maniera imprevedibile.  Il sistema però fornisce in alcuni casi la possibilità
 di eseguire alcune operazioni di scrittura in maniera coordinata anche senza
-utilizzare meccanismi di sincronizzazione più complessi (come il \textit{file
-  locking}\index{file!locking}, che esamineremo in
+utilizzare meccanismi di sincronizzazione più complessi (come il
+\index{file!locking} \textit{file locking}, che esamineremo in
 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
-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à
-\const{O\_APPEND}. In questo caso infatti, come abbiamo descritto in
-precedenza, è il kernel che aggiorna automaticamente la posizione alla fine
-del file prima di effettuare la scrittura, e poi estende il file. Tutto questo
-avviene all'interno di una singola system call (la \func{write}) che non
-essendo interrompibile da un altro processo costituisce un'operazione atomica.
+\itindex{append~mode} \const{O\_APPEND}. In questo caso infatti, come abbiamo
+descritto in precedenza, è il kernel che aggiorna automaticamente la posizione
+alla fine del file prima di effettuare la scrittura, e poi estende il file.
+Tutto questo avviene all'interno di una singola system call (la \func{write})
+che non essendo interrompibile da un altro processo costituisce un'operazione
+atomica.
 
 Un altro caso tipico in cui è necessaria l'atomicità è quello in cui si vuole
-creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file
+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 \itindex{race~condition} \textit{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
@@ -868,8 +935,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}.
   
-  \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.
@@ -881,7 +948,7 @@ Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del
 file specificato, ed attendono fino alla conclusione delle operazioni;
 \func{fsync} forza anche la sincronizzazione dei metadati del file (che
 riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
-altri dati contenuti nell'inode\index{inode} che si leggono con \func{fstat},
+altri dati contenuti \index{inode} nell'inode che si leggono con \func{fstat},
 come i tempi del file).
 
 Si tenga presente che questo non comporta la sincronizzazione della
@@ -904,7 +971,7 @@ prototipo 
   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.
@@ -936,7 +1003,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
-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.
 
@@ -951,14 +1018,14 @@ disponibile.
 
 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
-    -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.
@@ -972,9 +1039,9 @@ sar
 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
-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
@@ -994,8 +1061,8 @@ descriptor, che non riguardano la normale lettura e scrittura di dati, ma la
 gestione sia delle loro proprietà, che di tutta una serie di ulteriori
 funzionalità che il kernel può mettere a disposizione.\footnote{ad esempio si
   gestiscono con questa funzione varie modalità di I/O asincrono (vedi
-  sez.~\ref{sec:file_asyncronous_operation}) e il file
-  locking\index{file!locking} (vedi sez.~\ref{sec:file_locking}).}
+  sez.~\ref{sec:file_asyncronous_operation}) e il \index{file!locking}
+  \textit{file locking} (vedi sez.~\ref{sec:file_locking}).}
 
 Per queste operazioni di manipolazione e di controllo delle varie proprietà e
 caratteristiche di un file descriptor, viene usata la funzione \funcd{fcntl},
@@ -1010,8 +1077,8 @@ il cui prototipo 
   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.
@@ -1030,73 +1097,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
-  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
-  \textit{close-on-exec}\index{close-on-exec}, identificato dalla costante
+  \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}). 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
-  \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
-  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
-  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
-  \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
-  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
-  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
-  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
-  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},
-  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
-  \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,
-  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 è
@@ -1107,27 +1176,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.}
-\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
-  sez.~\ref{sec:file_asyncronous_operation}.
+  sez.~\ref{sec:file_asyncronous_lease}.
+\item[\const{F\_GETLEASE}] restituisce il tipo di \index{file!lease}
+  \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 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
-  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
-  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
@@ -1135,10 +1205,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
-sez.~\ref{sec:file_asyncronous_operation} mentre quelle relative al
-\textit{file locking}\index{file!locking} saranno esaminate in
-sez.~\ref{sec:file_locking}).
-
+sez.~\ref{sec:file_asyncronous_access} mentre quelle relative al
+\index{file!locking} \textit{file locking} saranno esaminate in
+sez.~\ref{sec:file_locking}). L'uso di questa funzione con i socket verrà
+trattato in sez.~\ref{sec:sock_ctrl_func}.
 
 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
@@ -1157,7 +1227,7 @@ accesso dal \textit{file status flag}.
 \subsection{La funzione \func{ioctl}}
 \label{sec:file_ioctl}
 
-Benché il concetto di \textit{everything is a file} si sia dimostratato molto
+Benché il concetto di \textit{everything is a file} si sia dimostrato molto
 valido anche per l'interazione con i dispositivi più vari, fornendo una
 interfaccia che permette di interagire con essi tramite le stesse funzioni
 usate per i normali file di dati, esisteranno sempre caratteristiche
@@ -1171,19 +1241,19 @@ 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, ...)}  
-  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
-    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
-    la richiesta non è applicabile all'oggetto a cui fa riferimento
-    \param{fd}.
+  \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un
+    dispositivo, o la richiesta non è applicabile all'oggetto a cui fa
+    riferimento \param{fd}.
   \item[\errcode{EINVAL}] gli argomenti \param{request} o \param{argp} non sono
     validi.
   \end{errlist}
@@ -1224,21 +1294,50 @@ imprevedibili o indesiderati.
 
 Data la assoluta specificità della funzione, il cui comportamento varia da
 dispositivo a dispositivo, non è possibile fare altro che dare una descrizione
-sommaria delle sue caratteristiche; torneremo ad esaminare in seguito quelle
-relative ad alcuni casi specifici (ad esempio la gestione dei terminali è
-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:
+sommaria delle sue caratteristiche; torneremo ad esaminare in
+seguito\footnote{per l'uso di \func{ioctl} con i socket si veda
+  sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici (ad
+esempio la gestione dei terminali è 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}}
-\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 \itindex{close-on-exec}
+  \textit{close-on-exec}.
+\item[\const{FIONCLEX}] Cancella il flag di \itindex{close-on-exec}
+  \textit{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}.
 
 
+
+% TODO estendere la lista delle ioctl sui file
+
+
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+
+% LocalWords:  descriptor system call cap like kernel sez l'inode inode VFS tab
+% LocalWords:  process table struct files flags pos all'inode dentry fig shell
+% LocalWords:  error POSIX STDIN FILENO STDOUT STDERR unistd read write lseek
+% LocalWords:  close pathname sys fcntl int const char errno EEXIST CREAT EXCL
+% LocalWords:  EISDIR ENOTDIR ENXIO NOBLOCK WRONLY fifo ENODEV ETXTBSY ELOOP of
+% LocalWords:  NOFOLLOW EACCES ENAMETOOLONG ENOENT EROFS EFAULT ENOSPC ENOMEM
+% LocalWords:  EMFILE ENFILE NFS lock race condition Denial Service DoS RDONLY
+% LocalWords:  glibc RDWR NONBLOCK NOCTTY SHLOCK shared BSD EXLOCK TRUNC device
+% LocalWords:  opendir LARGEFILE APPEND append NDELAY ASYNC l'I SIGIO SYNC SVr
+% LocalWords:  DSYNC RSYNC filesystem DIRECT caching SGI IRIX dell'I FreeBSD fd
+% LocalWords:  fork exec umask SOURCE creat filedes EBADF EINTR EIO locking off
+% LocalWords:  behind sync flush shutdown whence ESPIPE socket EINVAL INCR XTND
+% LocalWords:  SEEK CUR EPIPE ssize void buf size count EAGAIN EWOULDBLOCK log
+% LocalWords:  Specification pwrite pread EFBIG SIGPIPE nell'inode dall'inode
+% LocalWords:  CLOEXEC stat fsync cache update l'update bdflush Documentation
+% LocalWords:  fdatasync fstat ext dup oldfd newfd DUPFD cmd long arg flock pid
+% LocalWords:  SETFD GETFD GETFL SETFL GETLK SETLK SETLKW GETOWN group SIGURG
+% LocalWords:  SETOWN GETSIG SETSIG sigaction SIGINFO siginfo SETLEASE lease is
+% LocalWords:  truncate GETLEASE NOTIFY all'I AND ACCMODE ioctl everything argp
+% LocalWords:  framebuffer request ENOTTY CDROM nell'header magic number
+% LocalWords:  FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME