Trattati gli sparse file e gli hole dei file, e aggiunte varie correzioni
[gapil.git] / fileunix.tex
index 397e657b89cb88c24a6029a62683ce056d2cffa3..cfc948f2298951acf344ed9b9ef70f55240f37a4 100644 (file)
@@ -1,6 +1,6 @@
 %% fileunix.tex
 %%
 %% fileunix.tex
 %%
-%% Copyright (C) 2000-2007 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2009 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",
@@ -350,6 +350,9 @@ ritorno il file descriptor con il valore pi
                          alle dimensioni dei blocchi del filesystem; per il
                          kernel 2.6 basta che siano allineati a multipli di 512
                          byte.\\
                          alle dimensioni dei blocchi del filesystem; per il
                          kernel 2.6 basta che siano allineati a multipli di 512
                          byte.\\
+    \const{O\_CLOEXEC} & Attiva la modalità di \textit{close-on-exec} (vedi
+                         sez.~\ref{sec:file_sharing} e
+                         \ref{sec:file_fcntl}).\footnotemark\\  
     \hline
   \end{tabular}
   \caption{Valori e significato dei vari bit del \textit{file status flag}.}
     \hline
   \end{tabular}
   \caption{Valori e significato dei vari bit del \textit{file status flag}.}
@@ -369,7 +372,7 @@ ritorno il file descriptor con il valore pi
 \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
 \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.}
+  zero da parte di \func{read} ha il significato di una \textit{end-of-file}.}
 
 \footnotetext[6]{l'opzione è stata introdotta dalla SGI in IRIX, e serve
   sostanzialmente a permettere ad alcuni programmi (in genere database) la
 
 \footnotetext[6]{l'opzione è stata introdotta dalla SGI in IRIX, e serve
   sostanzialmente a permettere ad alcuni programmi (in genere database) la
@@ -378,6 +381,10 @@ ritorno il file descriptor con il valore pi
   anche in FreeBSD, senza limiti di allineamento dei buffer. In Linux è stata
   introdotta con il kernel 2.4.10, le versioni precedenti la ignorano.}
 
   anche in FreeBSD, senza limiti di allineamento dei buffer. In Linux è stata
   introdotta con il kernel 2.4.10, le versioni precedenti la ignorano.}
 
+\footnotetext[7]{introdotto con il kernel 2.6.23, per evitare una
+  \itindex{race~condition} \textit{race condition} che si può verificare con i
+  \itindex{thread} \textit{thread}, fra l'apertura del file e l'impostazione
+  della suddetta modalità con \func{fcntl}.}
 
 Questa caratteristica permette di prevedere qual è il valore del file
 descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
 
 Questa caratteristica permette di prevedere qual è il valore del file
 descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
@@ -393,10 +400,11 @@ sez.~\ref{sec:file_sharing}) ed 
 all'inizio del file.
 
 L'argomento \param{mode} indica i permessi con cui il file viene creato; i
 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_perm_management}) per il processo.
+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 \itindex{umask} \textit{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
 
 La funzione prevede diverse opzioni, che vengono specificate usando vari bit
 dell'argomento \param{flags}.  Alcuni di questi bit vanno anche a costituire
@@ -515,8 +523,10 @@ file. 
     successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno
     dei valori:
   \begin{errlist}
     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 o una fifo.
+    \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo.
     \item[\errcode{EINVAL}] \param{whence} non è un valore valido.
     \item[\errcode{EINVAL}] \param{whence} non è un valore valido.
+    \item[\errcode{EOVERFLOW}] \param{offset} non può essere rappresentato nel
+      tipo \type{off\_t}.
   \end{errlist}
   ed inoltre \errval{EBADF}.}
 \end{functions}
   \end{errlist}
   ed inoltre \errval{EBADF}.}
 \end{functions}
@@ -538,14 +548,12 @@ seguenti valori\footnote{per compatibilit
   per ottenere la nuova posizione corrente.
 \end{basedescript}
 
   per ottenere la nuova posizione corrente.
 \end{basedescript}
 
-Come accennato in sez.~\ref{sec:file_file_size} con \func{lseek} è possibile
-impostare la posizione corrente anche oltre la fine del file, e alla
-successiva scrittura il file sarà esteso. La chiamata non causa nessun accesso
-al file, si limita a modificare la posizione corrente (cioè il valore
-\var{f\_pos} in \param{file}, vedi fig.~\ref{fig:file_proc_file}).  Dato che la
-funzione ritorna la nuova posizione, usando il valore zero per \param{offset}
-si può riottenere la posizione corrente nel file chiamando la funzione con
-\code{lseek(fd, 0, SEEK\_CUR)}.
+Si tenga presente che la chiamata a \func{lseek} non causa nessun accesso al
+file, si limita a modificare la posizione corrente (cioè il valore
+\var{f\_pos} in \param{file}, vedi fig.~\ref{fig:file_proc_file}).  Dato che
+la funzione ritorna la nuova posizione, usando il valore zero
+per \param{offset} si può riottenere la posizione corrente nel file chiamando
+la funzione con \code{lseek(fd, 0, SEEK\_CUR)}.
 
 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
 
 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
@@ -555,20 +563,72 @@ essersi spostata, ma noi scriveremo alla posizione impostata in precedenza
   condition}, vedi sez.~\ref{sec:file_atomic}).
 
 Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
   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
-i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non
-supportano questa funzione, come ad esempio per i file di
+questo caso la funzione ritorna l'errore \errcode{ESPIPE}. Questo, oltre che
+per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che
+non supportano questa funzione, come ad esempio per i file di
 terminale.\footnote{altri sistemi, usando \const{SEEK\_SET}, in questo caso
   ritornano il numero di caratteri che vi sono stati scritti.} Lo standard
 terminale.\footnote{altri sistemi, usando \const{SEEK\_SET}, in questo caso
   ritornano il numero di caratteri che vi sono stati scritti.} Lo standard
-POSIX però non specifica niente in proposito. Infine alcuni file speciali, ad
+POSIX però non specifica niente in proposito. Inoltre alcuni file speciali, ad
 esempio \file{/dev/null}, non causano un errore ma restituiscono un valore
 indefinito.
 
 esempio \file{/dev/null}, non causano un errore ma restituiscono un valore
 indefinito.
 
-
-\subsection{La funzione \func{read}}
+\itindbeg{sparse~file} 
+
+Infine si tenga presente che, come accennato in sez.~\ref{sec:file_file_size},
+con \func{lseek} è possibile impostare una posizione anche oltre la corrente
+fine del file; ed in tal caso alla successiva scrittura il file sarà esteso a
+partire da detta posizione. In questo caso si ha quella che viene chiamata la
+creazione di un \index{file!\textit{hole}} \textsl{buco} nel file, accade cioè
+che nonostante la dimensione del file sia cresciuta in seguito alla scrittura
+effettuata, lo spazio vuoto fra la precedente fine del file ed la nuova parte
+scritta dopo lo spostamento, non corrisponda ad una allocazione effettiva di
+spazio su disco, che sarebbe inutile dato che quella zona è effettivamente
+vuota.
+
+Questa è una delle caratteristiche spcifiche della gestione dei file di un
+sistema unix-like, ed in questo caso si ha appunto quello che in gergo si
+chiama un \index{file!\textit{hole}} \textit{hole} nel file e si dice che il
+file in questione è uno \textit{sparse file}. In sostanza, se si ricorda la
+struttura di un filesystem illustrata in fig.~\ref{fig:file_filesys_detail},
+quello che accade è che nell'\textit{inode} del file viene segnata
+l'allocazione di un blocco di dati a partire dalla nuova posizione, ma non
+viene allocato nulla per le posizioni intermedie; in caso di lettura
+sequenziale del contenuto del file il kernel si accorgerà della presenza del
+buco, e restituirà degli zeri come contenuto di quella parte del file.
+
+Questa funzionalità comporta una delle caratteristiche della gestione dei file
+su Unix che spesso genera più confusione in chi non la conosce, per cui
+sommando le dimensioni dei file si può ottenere, se si hanno molti
+\textit{sparse file}, un totale anche maggiore della capacità del proprio
+disco e comunque maggiore della dimensione che riporta un comando come
+\cmd{du}, che calcola lo spazio disco occupato in base al numero dei blocchi
+effettivamente allocati per il file.
+
+Questo avviene proprio perché in un sistema unix-like la dimensione di un file
+è una caratteristica del tutto indipendente dalla quantità di spazio disco
+effettivamente allocato, e viene registrata sull'\textit{inode} come le altre
+proprietà del file. La dimensione viene aggiornata automaticamente quando si
+estende un file scrivendoci, e viene riportata dal campo \var{st\_size} di una
+struttura \struct{stat} quando si effettua chiamata ad una delle funzioni
+\texttt{*stat} viste in sez.~\ref{sec:file_stat}.
+
+Questo comporta che in generale, fintanto che lo si è scritto sequenzialmente,
+la dimensione di un file sarà più o meno corrispondente alla quantità di
+spazio disco da esso occupato, ma esistono dei casi, come questo in cui ci si
+sposta in una posizione oltre la fine corrente del file, o come quello
+accennato in in sez.~\ref{sec:file_file_size} in cui si estende la dimensione
+di un file con una \func{truncate}, in cui in sostanza di modifica il valore
+della dimensione di \var{st\_size} senza allocare spazio su disco. Questo
+consente di creare inizialmente file di dimensioni anche molto grandi, senza
+dover occupare da subito dello spazio disco che in realtà sarebbe
+inutilizzato.
+
+\itindend{sparse~file}
+
+
+\subsection{Le funzioni \func{read} e \func{pread}}
 \label{sec:file_read}
 
 \label{sec:file_read}
 
-
 Una volta che un file è stato aperto (con il permesso in lettura) si possono
 leggere i dati che contiene utilizzando la funzione \funcd{read}, il cui
 prototipo è:
 Una volta che un file è stato aperto (con il permesso in lettura) si possono
 leggere i dati che contiene utilizzando la funzione \funcd{read}, il cui
 prototipo è:
@@ -632,7 +692,7 @@ 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
 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{EAGAIN}\footnote{in BSD si 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.
   \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.
@@ -644,7 +704,7 @@ dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix
   l'emulazione per i vecchi kernel che non hanno la system call, è stato
   aggiunto con la versione 2.1, in versioni precedenti sia del kernel che
   delle librerie la funzione non è disponibile.} (quello che viene chiamato
   l'emulazione per i vecchi kernel che non hanno la system call, è stato
   aggiunto con la versione 2.1, in versioni precedenti sia del kernel che
   delle librerie la funzione non è disponibile.} (quello che viene chiamato
-normalmente Unix98, vedi sez.~\ref{sec:intro_opengroup}) è stata introdotta la
+normalmente Unix98, vedi sez.~\ref{sec:intro_xopen}) è stata introdotta la
 definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo è:
 \begin{prototype}{unistd.h}
 {ssize\_t pread(int fd, void * buf, size\_t count, off\_t offset)}
 definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo è:
 \begin{prototype}{unistd.h}
 {ssize\_t pread(int fd, void * buf, size\_t count, off\_t offset)}
@@ -681,7 +741,7 @@ dichiarazioni \file{unistd.h}.
 
 
 
 
 
 
-\subsection{La funzione \func{write}}
+\subsection{Le funzioni \func{write} e \func{pwrite}}
 \label{sec:file_write}
 
 Una volta che un file è stato aperto (con il permesso in scrittura) si può
 \label{sec:file_write}
 
 Una volta che un file è stato aperto (con il permesso in scrittura) si può
@@ -932,7 +992,7 @@ usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono:
 \begin{functions}
   \headdecl{unistd.h}
   \funcdecl{int fsync(int fd)}
 \begin{functions}
   \headdecl{unistd.h}
   \funcdecl{int fsync(int fd)}
-  Sincronizza dati e metadati del file \param{fd}
+  Sincronizza dati e meta-dati del file \param{fd}
   \funcdecl{int fdatasync(int fd)}
   Sincronizza i dati del file \param{fd}.
   
   \funcdecl{int fdatasync(int fd)}
   Sincronizza i dati del file \param{fd}.
   
@@ -947,7 +1007,7 @@ usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono:
 
 Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del
 file specificato, ed attendono fino alla conclusione delle operazioni;
 
 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
+\func{fsync} forza anche la sincronizzazione dei meta-dati del file (che
 riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
 altri dati contenuti \index{inode} nell'inode che si leggono con \func{fstat},
 come i tempi del file).
 riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
 altri dati contenuti \index{inode} nell'inode che si leggono con \func{fstat},
 come i tempi del file).
@@ -1065,40 +1125,47 @@ parallelo alla chiamata a \func{open}, e questo lascia aperta la possibilit
 di una \itindex{race~condition} \textit{race condition}.
 
 Inoltre come già accennato, la directory di lavoro corrente è una proprietà
 di una \itindex{race~condition} \textit{race condition}.
 
 Inoltre come già accennato, la directory di lavoro corrente è una proprietà
-del singolo processo; questo significa che quando si lavora con i thread essa
-sarà la stessa per tutti, ma esistono molti casi in cui sarebbe invece utile
-che ogni singolo thread avesse la sua directory di lavoro. 
+del singolo processo; questo significa che quando si lavora con i
+\itindex{thread} \textit{thread} essa sarà la stessa per tutti, ma esistono
+molti casi in cui sarebbe invece utile che ogni singolo \itindex{thread}
+\textit{thread} avesse la sua directory di lavoro.
 
 Per risolvere questi problemi, riprendendo una interfaccia già presente in
 Solaris, a fianco delle normali funzioni che operano sui file (come
 \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
 
 Per risolvere questi problemi, riprendendo una interfaccia già presente in
 Solaris, a fianco delle normali funzioni che operano sui file (come
 \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
-funzioni, contraddistinte dal suffisso \texttt{at}, che permettono che
-permettano l'apertura di un file (o le rispettive altre operazioni) usando un
-pathname relativo ad una directory specificata.\footnote{l'introduzione è
-  avvenuta su proposta dello sviluppatore principale delle \acr{glibc} Urlich
-  Drepper; le corrispondenti system call sono state inserite nel kernel
-  ufficiale a partire dalla versione 2.6.16, in precedenza era disponibile una
-  emulazione che, sia pure con prestazioni inferiori, funzionava facendo
-  ricorso all'uso del filesystem \textit{proc} con l'apertura del file
-  attraverso il riferimento a pathname del tipo di
-  \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste non siano
-funzioni standard esse sono disponibili anche su altri Unix\footnote{oltre al
-  citato Solaris ne è prevista l'inclusione anche in BSD.} e sono state
-proposte per l'inclusione nello standard POSIX.1, nelle future revisioni dello
-stesso.
-
-L'idea è che si apra prima la directory che si vuole usare come base dei
-pathname relativo, e si passi il file descriptor alla funzione che userà
-quella directory come punto di partenza per la risoluzione.\footnote{in questo
-  modo, anche quando si lavora con i thread, si può mantenere anche una
-  directory di lavoro diversa per ciascuno di essi.}  Con queste funzioni si
-possono anche ottenere grossi aumenti di prestazioni quando si devono eseguire
-operazioni su delle sezioni di albero dei file che prevedono gerarchie molto
-profonde e grandi quantità di file e directory, dato che basta eseguire la
-risoluzione di un pathname una sola volta (nell'apertura della directory) e
-non per ciascun file che essa contiene.
-
-La sintassi generale di queste nuove funzioni è che esse prendano come primo
+funzioni, contraddistinte dal suffisso \texttt{at}, che permettono l'apertura
+di un file (o le rispettive altre operazioni) usando un pathname relativo ad
+una directory specificata.\footnote{l'introduzione è avvenuta su proposta
+  dello sviluppatore principale delle \acr{glibc} Urlich Drepper; le
+  corrispondenti system call sono state inserite nel kernel ufficiale a
+  partire dalla versione 2.6.16, in precedenza era disponibile una emulazione
+  che, sia pure con prestazioni inferiori, funzionava facendo ricorso all'uso
+  del filesystem \textit{proc} con l'apertura del file attraverso il
+  riferimento a pathname del tipo di
+  \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste funzioni non
+siano presenti negli standard tradizionali esse sono state adottate da vari
+Unix\footnote{oltre a Linux e Solaris sono presenti in vari BSD.} fino ad
+essere incluse nella recente revisione (la POSIX.1-2008) dello standard
+POSIX.1; con le \acr{glibc} per l'accesso a queste funzioni è necessario
+definire la macro \macro{\_ATFILE\_SOURCE}.
+
+L'uso di queste funzioni prevede una apertura iniziale della directory che
+sarà la base della risoluzione dei pathname relativi che verranno usati in
+seguito, dopo di che si dovrà passare il relativo file descriptor alle varie
+funzioni che useranno quella directory come punto di partenza per la
+risoluzione.\footnote{in questo modo, anche quando si lavora con i
+  \itindex{thread} \textit{thread}, si può mantenere una directory di lavoro
+  diversa per ciascuno di essi.} 
+
+Questo metodo, oltre a risolvere i problemi di \itindex{race~condition}
+\textit{race condition}, consente anche di ottenere aumenti di prestazioni
+significativi quando si devono eseguire molte operazioni su sezioni
+dell'albero dei file che prevedono delle gerarchie di sottodirectory molto
+profonde; infatti in questo caso basta eseguire la risoluzione del pathname
+della directory di partenza una sola volta (nell'apertura iniziale) e non
+tutte le volte che si deve accedere a ciascun file che essa contiene.
+
+La sintassi generale di queste nuove funzioni è che esse prevedono come primo
 argomento il file descriptor della directory da usare come base, mentre gli
 argomenti successivi restano identici a quelli della corrispondente funzione
 ordinaria; ad esempio nel caso di \funcd{openat} avremo che essa è definita
 argomento il file descriptor della directory da usare come base, mentre gli
 argomenti successivi restano identici a quelli della corrispondente funzione
 ordinaria; ad esempio nel caso di \funcd{openat} avremo che essa è definita
@@ -1120,36 +1187,61 @@ come:
   \end{errlist}}
 \end{functions}
 
   \end{errlist}}
 \end{functions}
 
+Il comportamento delle nuove funzioni è del tutto analogo a quello delle
+corrispettive classiche, con la sola eccezione del fatto che se fra i loro
+argomenti si utilizza un pathname relativo questo sarà risolto rispetto alla
+directory indicata da \param{dirfd}; qualora invece si usi un pathname
+assoluto \param{dirfd} verrà semplicemente ignorato. Infine se per
+\param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa,
+  come le altre costanti \texttt{AT\_*}, è definita in \texttt{fcntl.h},
+  pertanto se la si vuole usare occorrerà includere comunque questo file,
+  anche per le funzioni che non sono definite in esso.} la risoluzione sarà
+effettuata rispetto alla directory di lavoro corrente del processo.
+
+Così come il comportamento, anche i valori di ritorno e le condizioni di
+errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli
+errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in
+particolare si avrà un errore di \errcode{EBADF} se esso non è un file
+descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa riferimento
+ad una directory.\footnote{tranne il caso in cui si sia specificato un
+  pathname assoluto, nel qual caso, come detto, il valore di \param{dirfd}
+  sarà completamente ignorato.}
+
 In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte
 con questa nuova interfaccia, con a fianco la corrispondente funzione
 In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte
 con questa nuova interfaccia, con a fianco la corrispondente funzione
-classica. Tranne che nel caso di \func{faccessat} e \func{unlinkat} tutti i
-loro prototipi seguono la convenzione appena vista per \func{openat}, in cui
-agli argomenti della corrispondente funzione classica viene anteposto
-l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarli uno per
-  uno.} 
+classica.\footnote{in realtà, come visto in sez.~\ref{sec:file_temp_file}, le
+  funzioni \func{utimes} e \func{lutimes} non sono propriamente le
+  corrispondenti di \func{utimensat}, dato che questa ha una maggiore
+  precisione nella indicazione dei tempi dei file.} La gran parte di queste
+seguono la convenzione appena vista per \func{openat}, in cui agli argomenti
+della corrispondente funzione classica viene anteposto
+l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarle una per
+  una.} Per una parte di queste, indicate dal contenuto della omonima colonna
+di tab.~\ref{tab:file_atfunc_corr}, oltre al nuovo argomento iniziale, è
+prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
 
 \begin{table}[htb]
   \centering
   \footnotesize
 
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|l|}
+  \begin{tabular}[c]{|l|c|l|}
     \hline
     \hline
-    \textbf{Funzione} & \textbf{Corrispondente} \\
+    \textbf{Funzione} &\textbf{Flags} &\textbf{Corrispondente} \\
     \hline
     \hline
     \hline
     \hline
-     \func{faccessat} &\func{access}  \\
-     \func{fchmodat}  &\func{chmod}   \\
-     \func{fchownat}  &\func{chown}   \\
-     \func{fstatat}   &\func{stat}    \\
-     \func{futimesat} &\func{utimes}  \\
-     \func{linkat}    &\func{link}    \\
-     \func{mkdirat}   &\func{mkdir}   \\
-     \func{mknodat}   &\func{mknod}   \\
-     \func{openat}    &\func{open}    \\
-     \func{readlinkat}&\func{readlink}\\
-     \func{renameat}  &\func{rename}  \\
-     \func{symlinkat} &\func{symlink} \\
-     \func{unlinkat}  &\func{unlink}  \\
-     \func{mkfifoat}  &\func{mkfifo}  \\
+     \func{faccessat} &$\bullet$&\func{access}  \\
+     \func{fchmodat}  &$\bullet$&\func{chmod}   \\
+     \func{fchownat}  &$\bullet$&\func{chown},\func{lchown}\\
+     \func{fstatat}   &$\bullet$&\func{stat},\func{lstat}  \\
+     \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\
+     \func{linkat}    &$\bullet$\footnotemark&\func{link}    \\
+     \func{mkdirat}   & --      &\func{mkdir}   \\
+     \func{mknodat}   & --      &\func{mknod}   \\
+     \func{openat}    & --      &\func{open}    \\
+     \func{readlinkat}& --      &\func{readlink}\\
+     \func{renameat}  & --      &\func{rename}  \\
+     \func{symlinkat} & --      &\func{symlink} \\
+     \func{unlinkat}  &$\bullet$&\func{unlink},\func{rmdir}  \\
+     \func{mkfifoat}  & --      &\func{mkfifo}  \\
     \hline
   \end{tabular}
   \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le
     \hline
   \end{tabular}
   \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le
@@ -1157,31 +1249,54 @@ l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarli uno per
   \label{tab:file_atfunc_corr}
 \end{table}
 
   \label{tab:file_atfunc_corr}
 \end{table}
 
-% TODO documentare utimesat, introdotta in 2.6.22
-% http://kernelnewbies.org/Linux_2_6_22
+\footnotetext{in questo caso l'argomento \param{flags} è disponibile ed
+  utilizzabile solo a partire dal kernel 2.6.18.}
+
+Per tutte le funzioni che lo prevedono, a parte \func{unlinkat} e
+\funcd{faccessat}, l'ulteriore argomento è stato introdotto solo per fornire
+un meccanismo con cui modificarne il comportamento nel caso si stia operando
+su un link simbolico, così da poter scegliere se far agire la funzione
+direttamente sullo stesso o sul file da esso referenziato. Dato che in certi
+casi esso può fornire ulteriori indicazioni per modificare il comportamento
+delle funzioni, \param{flags} deve comunque essere passato come maschera
+binaria, ed impostato usando i valori delle appropriate costanti
+\texttt{AT\_*}, definite in \texttt{fcntl.h}.
+
+Come esempio di questo secondo tipo di funzioni possiamo considerare
+\funcd{fchownat}, che può essere usata per sostituire sia \func{chown}
+che \func{lchown}; il suo prototipo è:
+\begin{functions}
+  \headdecl{unistd.h} \headdecl{fcntl.h} 
 
 
-Il comportamento delle nuove funzioni è del tutto analogo a quello delle
-corrispettive classiche, con la sola eccezione del fatto che se fra i loro
-argomenti si utilizza un pathname relativo questo sarà risolto rispetto alla
-directory indicata da \param{dirfd}; qualora invece si usi un pathname
-assoluto \param{dirfd} verrà semplicemente ignorato. Infine se per
-\param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la risoluzione sarà
-effettuata rispetto alla directory di lavoro corrente del processo.
+  \funcdecl{int fchownat(int dirfd, const char *pathname, uid\_t owner, gid\_t
+    group, int flags)}
 
 
-Così come il comportamento, anche i valori di ritorno e le condizioni di
-errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli
-errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in
-particolare si avrà un errore di \errcode{EBADF} se esso non è un file
-descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa riferimento
-ad una directory.\footnote{tranne il caso in cui si sia specificato un
-  pathname assoluto, nel qual caso, come detto, il valore di \param{dirfd}
-  sarà completamente ignorato.}
+  .Modifica la proprietà di un file.
+  
+  \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
+    errore di \func{chown}, ed in più:
+  \begin{errlist}
+  \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+  \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
+  \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
+    \param{dirfd} fa riferimento ad un file. 
+  \end{errlist}}
+\end{functions}
 
 
-Come accennato ci sono due eccezioni alla precedente regola, \func{faccessat}
-e \func{unlinkat}, che tratteremo esplicitamente. Dette funzioni, oltre a
-prendere \param{dirfd} come primo argomento aggiuntivo, prendono un ulteriore
-argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di
-\funcd{faccessat} avremo cioè:
+In questo caso il valore di \param{flags} stabilisce il comportamento della
+funzione quando la si applica ad un link simbolico, e l'unico valore
+utilizzabile è \const{AT\_SYMLINK\_NOFOLLOW}\footnote{in \texttt{fcntl.h} è
+  definito anche \const{AT\_SYMLINK\_FOLLOW}, che richiede di dereferenziare i
+  link simbolici, essendo questo però il comportamento adottato per un valore
+  nullo di \param{flags} questo valore non viene mai usato.} che se impostato
+indica alla funzione di non eseguire la dereferenziazione di un eventuale link
+simbolico, facendo comportare \func{fchownat} come \func{lchown} invece che
+come \func{chown}.
+
+Come accennato fra tutte quelle marcate in tab.~\ref{tab:file_atfunc_corr}
+solo due funzioni possono usare l'argomento \param{flags} con valori diversi
+da \const{AT\_SYMLINK\_NOFOLLOW}, la prima di queste è \funcd{faccessat}, ed
+il suo prototipo è:
 \begin{functions}
   \headdecl{unistd.h}
   \funcdecl{int faccessat(int dirfd, const char *path, int mode, int flags)}
 \begin{functions}
   \headdecl{unistd.h}
   \funcdecl{int faccessat(int dirfd, const char *path, int mode, int flags)}
@@ -1192,6 +1307,7 @@ argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di
     errore di \func{access}, ed in più:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
     errore di \func{access}, ed in più:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+  \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
   \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
     \param{dirfd} fa riferimento ad un file. 
   \end{errlist}}
   \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
     \param{dirfd} fa riferimento ad un file. 
   \end{errlist}}
@@ -1199,21 +1315,21 @@ argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di
 
 La funzione esegue lo stesso controllo di accesso effettuabile con
 \func{access}, ma si può utilizzare l'argomento \param{flags} per modificarne
 
 La funzione esegue lo stesso controllo di accesso effettuabile con
 \func{access}, ma si può utilizzare l'argomento \param{flags} per modificarne
-il comportamento rispetto a quello ordinario di \func{access}; questo infatti
-può essere specificato come maschera binaria dei seguenti valori:
-\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{AT\_EACCESS}] se impostato esegue il controllo dei permessi
-  usando l'\textsl{user-ID effettivo} invece di quello reale (il comportamento
-  di default, che riprende quello di \func{access}).
-\item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato non esegue la
-  dereferenziazione del link simbolico (il comportamento di default, che
-  riprende quello di \func{access}), ma effettua il controllo sui permessi del
-  link simbolico stesso.
+il comportamento rispetto a quello ordinario di \func{access}. In questo caso
+esso può essere specificato come maschera binaria di due valori:
+\begin{basedescript}{\desclabelwidth{3.0cm}}
+\item[\const{AT\_EACCESS}] se impostato \funcd{faccessat} esegue il controllo
+  dei permessi usando l'\textsl{user-ID effettivo} invece di quello reale (il
+  comportamento di default, che riprende quello di \func{access}).
+\item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato \funcd{faccessat} non esegue
+  la dereferenziazione dei link simbolici, effettuando il controllo dei
+  permessi direttamente sugli stessi.
 \end{basedescript}
 
 \end{basedescript}
 
-Nel caso di \func{unlinkat} l'ulteriore argomento \param{flags} viene inserito
-perché detta funzione può comportarsi sia come analogo di \func{unlink} che di
-\func{rmdir}; pertanto il suo prototipo è:
+La seconda eccezione è \func{unlinkat}, in questo caso l'ulteriore
+argomento \param{flags} viene utilizzato perché tramite esso la funzione possa
+comportarsi sia come analogo di \func{unlink} che di \func{rmdir}; il suo
+prototipo è:
 \begin{functions}
   \headdecl{fcntl.h}
   \funcdecl{int unlinkat(int dirfd, const char *pathname, int flags)}
 \begin{functions}
   \headdecl{fcntl.h}
   \funcdecl{int unlinkat(int dirfd, const char *pathname, int flags)}
@@ -1225,17 +1341,20 @@ perch
     \param{flags}, ed in più:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
     \param{flags}, ed in più:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
+  \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
   \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
     \param{dirfd} fa riferimento ad un file. 
   \end{errlist}}
 \end{functions}
 
 Di default il comportamento di \func{unlinkat} è equivalente a quello che
   \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma
     \param{dirfd} fa riferimento ad un file. 
   \end{errlist}}
 \end{functions}
 
 Di default il comportamento di \func{unlinkat} è equivalente a quello che
-avrebbe \func{unlink} applicata a \param{pathname}, fallendo se questo è una
-directory, se però si imposta \param{flags} al valore di
+avrebbe \func{unlink} applicata a \param{pathname}, fallendo in tutti i casi
+in cui questo è una directory, se però si imposta \param{flags} al valore di
 \const{AT\_REMOVEDIR},\footnote{anche se \param{flags} è una maschera binaria,
 \const{AT\_REMOVEDIR},\footnote{anche se \param{flags} è una maschera binaria,
-  essendo questo l'unico flag disponibile, lo si può assegnare direttamente.}
-essa si comporterà come \func{rmdir}.
+  essendo questo l'unico flag disponibile per questa funzione, lo si può
+  assegnare direttamente.}  essa si comporterà come \func{rmdir}, in tal
+caso \param{pathname} deve essere una directory, che sarà rimossa qualora
+risulti vuota.
 
 
 \subsection{La funzione \func{fcntl}}
 
 
 \subsection{La funzione \func{fcntl}}
@@ -1329,15 +1448,22 @@ per \var{cmd} 
     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
     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 \textit{process group} viene
-  restituito un valore negativo il cui valore assoluto corrisponde
+    (un numero positivo analogo al \acr{pid}).} che è preposto alla ricezione
+  dei segnali \const{SIGIO}\footnote{o qualunque altro segnale alternativo
+    impostato con \const{F\_FSETSIG}.} per gli eventi associati al file
+  descriptor \param{fd}\footnote{il segnale viene usato sia per il
+    \textit{Signal Drive I/O}, che tratteremo in
+    sez.~\ref{sec:file_asyncronous_operation}, e dai vari meccanismi di
+    notifica asincrona, che tratteremo in
+    sez.~\ref{sec:file_asyncronous_lease}.} e \const{SIGURG} per la notifica
+  dei dati urgenti di un socket.\footnote{vedi
+    sez.~\ref{sec:TCP_urgent_data}.} 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 \itindex{process~group} \textit{process
   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 \itindex{process~group} \textit{process
-    group} che riceverà i segnali \const{SIGIO} e \const{SIGURG} per gli
+    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
   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
@@ -1547,6 +1673,9 @@ operazioni che sono predefinite per qualunque file,\footnote{in particolare
   (cioè di tipo \texttt{int *}) su cui sarà restituito il valore.
 \end{basedescript}
 
   (cioè di tipo \texttt{int *}) su cui sarà restituito il valore.
 \end{basedescript}
 
+% TODO aggiungere FIBMAP e FIEMAP, vedi http://lwn.net/Articles/260832
+
+
 Si noti però come la gran parte di queste operazioni specifiche dei file (per
 essere precisi le prime sei dell'elenco) siano effettuabili in maniera
 generica anche tramite l'uso di \func{fcntl}. Le due funzioni infatti sono
 Si noti però come la gran parte di queste operazioni specifiche dei file (per
 essere precisi le prime sei dell'elenco) siano effettuabili in maniera
 generica anche tramite l'uso di \func{fcntl}. Le due funzioni infatti sono
@@ -1559,6 +1688,11 @@ modalit
   l'uso comune di \errcode{ENOTTY} come codice di errore.} oggi non è più così
 ma le due funzioni sono rimaste.
 
   l'uso comune di \errcode{ENOTTY} come codice di errore.} oggi non è più così
 ma le due funzioni sono rimaste.
 
+% TODO trovare qualche posto per la eventuale documentazione delle seguenti
+% (bassa/bassissima priorità)
+% EXT4_IOC_MOVE_EXT (dal 2.6.31)
+
+
 
 % 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:  descriptor system call cap like kernel sez l'inode inode VFS tab
 % LocalWords:  process table struct files flags pos all'inode dentry fig shell
@@ -1583,10 +1717,11 @@ ma le due funzioni sono rimaste.
 % LocalWords:  FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME redirezione FIOSETOWN
 % LocalWords:  FIOGETOWN FIONREAD mkdirat thread Solaris mkdir at Urlich proc
 % LocalWords:  Drepper path dirfd faccessat unlinkat access fchmodat chmod Di
 % LocalWords:  FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME redirezione FIOSETOWN
 % LocalWords:  FIOGETOWN FIONREAD mkdirat thread Solaris mkdir at Urlich proc
 % LocalWords:  Drepper path dirfd faccessat unlinkat access fchmodat chmod Di
-% LocalWords:  fchownat chown fstatat futimesat utimes linkat mknodat mknod
-% LocalWords:  readlinkat readlink renameat rename symlinkat symlink unlink
+% LocalWords:  fchownat chown fstatat futimesat utimes linkat mknodat mknod uid
+% LocalWords:  readlinkat readlink renameat rename symlinkat symlink unlink gid
 % LocalWords:  mkfifoat mkfifo FDCWD EACCESS dereferenziazione rmdir REMOVEDIR
 % LocalWords:  mkfifoat mkfifo FDCWD EACCESS dereferenziazione rmdir REMOVEDIR
-% LocalWords:  epoll lsattr chattr FIOQSIZE
+% LocalWords:  epoll lsattr chattr FIOQSIZE ATFILE lutimes utimensat lchown
+% LocalWords:  lstat owner FOLLOW
 
 %%% Local Variables: 
 %%% mode: latex
 
 %%% Local Variables: 
 %%% mode: latex