Aggiornamento al 2010 delle note di copyright
[gapil.git] / fileunix.tex
index 1b4edcef570024767a173bb753c8788fedf87132..3a9d1c0ba63e5a10f116f159ec9fa3ff549feab6 100644 (file)
@@ -1,6 +1,6 @@
 %% fileunix.tex
 %%
 %% fileunix.tex
 %%
-%% Copyright (C) 2000-2007 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2010 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",
@@ -261,34 +261,34 @@ ritorno il file descriptor con il valore pi
                          titolarità del file viste in
                          sez.~\ref{sec:file_ownership_management}. Con questa
                          opzione l'argomento \param{mode} deve essere
                          titolarità del file viste in
                          sez.~\ref{sec:file_ownership_management}. Con questa
                          opzione l'argomento \param{mode} deve essere
-                         specificato. \\ 
+                         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
     \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}. \\ 
+                         \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
     \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}). \\
+                         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
     \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}). \\ 
+                         (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, 
     \const{O\_SHLOCK}  & Apre il file con uno shared lock (vedi
                          sez.~\ref{sec:file_locking}). Specifica di BSD, 
-                         assente in Linux. \\ 
+                         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
     \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. \\ 
+                         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 è
     \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. \\
+                         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 
     \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 
@@ -297,11 +297,11 @@ ritorno il file descriptor con il valore pi
                          \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
                          \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
+                         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
                          grandi dimensioni consente di aprire file le cui
                          dimensioni non possono essere rappresentate da numeri
-                         a 31 bit. \\
+                         a 31 bit.\\
     \hline
     \hline  % modalità di operazione coi file
     \const{O\_APPEND}  & Il file viene aperto in \itindex{append~mode}
     \hline
     \hline  % modalità di operazione coi file
     \const{O\_APPEND}  & Il file viene aperto in \itindex{append~mode}
@@ -317,24 +317,24 @@ ritorno il file descriptor con il valore pi
                          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
                          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. \\ 
+                         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
     \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. \\  
+                         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\_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\_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\_DSYNC}   & Variante di I/O sincrono definita da POSIX; presente
                          dal kernel 2.1.130 come sinonimo di
-                         \const{O\_SYNC}. \\
+                         \const{O\_SYNC}.\\
     \const{O\_RSYNC}   & Variante analoga alla precedente, trattata allo stesso
     \const{O\_RSYNC}   & Variante analoga alla precedente, trattata allo stesso
-                         modo. \\
+                         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
     \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
@@ -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ò
@@ -888,7 +948,7 @@ di una singola system call (per i dettagli sull'uso di questa caratteristica
 si veda sez.~\ref{sec:ipc_file_lock}).
 
 
 si veda sez.~\ref{sec:ipc_file_lock}).
 
 
-\subsection{La funzioni \func{sync} e \func{fsync}}
+\subsection{Le funzioni \func{sync} e \func{fsync}}
 \label{sec:file_sync}
 
 Come accennato in sez.~\ref{sec:file_close} tutte le operazioni di scrittura
 \label{sec:file_sync}
 
 Come accennato in sez.~\ref{sec:file_close} tutte le operazioni di scrittura
@@ -922,9 +982,9 @@ valore tradizionale, usato da BSD, per l'update dei dati 
 in Linux il valore utilizzato è di 5 secondi; con le nuove versioni\footnote{a
   partire dal kernel 2.2.8} poi, è il kernel che si occupa direttamente di
 tutto quanto attraverso il demone interno \cmd{bdflush}, il cui comportamento
 in Linux il valore utilizzato è di 5 secondi; con le nuove versioni\footnote{a
   partire dal kernel 2.2.8} poi, è il kernel che si occupa direttamente di
 tutto quanto attraverso il demone interno \cmd{bdflush}, il cui comportamento
-può essere controllato attraverso il file \file{/proc/sys/vm/bdflush} (per il
-significato dei valori si può leggere la documentazione allegata al kernel in
-\file{Documentation/sysctl/vm.txt}).
+può essere controllato attraverso il file \procfile{/proc/sys/vm/bdflush} (per
+il significato dei valori si può leggere la documentazione allegata al kernel
+in \file{Documentation/sysctl/vm.txt}).
 
 Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere
 sicuri che i dati di un database sono stati registrati su disco) si possono
 
 Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere
 sicuri che i dati di un database sono stati registrati su disco) si possono
@@ -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).
@@ -960,7 +1020,7 @@ disco) che deve essere effettuata esplicitamente.\footnote{in realt
   delle directory.}
 
 
   delle directory.}
 
 
-\subsection{La funzioni \func{dup} e \func{dup2}}
+\subsection{Le funzioni \func{dup} e \func{dup2}}
 \label{sec:file_dup}
 
 Abbiamo già visto in sez.~\ref{sec:file_sharing} come un processo figlio
 \label{sec:file_dup}
 
 Abbiamo già visto in sez.~\ref{sec:file_sharing} come un processo figlio
@@ -991,7 +1051,7 @@ alla stessa voce nella \textit{file table}; per questo si dice che il nuovo
 file descriptor è \textsl{duplicato}, da cui il nome della funzione.
 
 \begin{figure}[htb]
 file descriptor è \textsl{duplicato}, da cui il nome della funzione.
 
 \begin{figure}[htb]
-  \centering \includegraphics[width=15cm]{img/filedup}
+  \centering \includegraphics[width=14cm]{img/filedup}
   \caption{Schema dell'accesso ai file duplicati}
   \label{fig:file_dup}
 \end{figure}
   \caption{Schema dell'accesso ai file duplicati}
   \label{fig:file_dup}
 \end{figure}
@@ -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,17 +1673,25 @@ 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}
 
-Si noti però come la gran parte di queste operazioni (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 molto simili e la presenza
-di questa sovrapposizione è principalmente dovuta al fatto che alle origini di
-Unix i progettisti considerarono che era necessario trattare diversamente
-rispetto alle operazione di controllo delle modalità di I/O file e dispositivi
-usando \func{fcntl} per i primi e \func{ioctl} per i
-secondi;\footnote{all'epoca tra l'altro i dispositivi che usavano \func{ioctl}
-  erano sostanzialmente solo i terminali, il che spiega l'uso comune di
-  \errcode{ENOTTY} come codice di errore.} oggi non è più così ma le due
-funzioni sono rimaste.
+% 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
+molto simili e la presenza di questa sovrapposizione è principalmente dovuta
+al fatto che alle origini di Unix i progettisti considerarono che era
+necessario trattare diversamente rispetto alle operazione di controllo delle
+modalità di I/O file e dispositivi usando \func{fcntl} per i primi e
+\func{ioctl} per i secondi;\footnote{all'epoca tra l'altro i dispositivi che
+  usavano \func{ioctl} erano sostanzialmente solo i terminali, il che spiega
+  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:  descriptor system call cap like kernel sez l'inode inode VFS tab
@@ -1583,10 +1717,11 @@ 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