Varie correzioni, completata revisione capitolo sull'I/O su file
[gapil.git] / fileio.tex
index d2522e1442955588d0147419db29764fdb6eeed0..6639ac357a5113b5e0f4202eff1561d0afdc9443 100644 (file)
@@ -1,4 +1,4 @@
-%% fileio.tex (merge fileunix.tex - filestd.tex)
+s%% fileio.tex (merge fileunix.tex - filestd.tex)
 %%
 %% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
@@ -1361,16 +1361,22 @@ entrambi. Questo consente una sorta di ``\textsl{sincronizzazione}''
 automatica della posizione sul file fra padre e figlio che occorre tenere
 presente.
 
+\itindbeg{close-on-exec}
+
 Si noti inoltre che in questo caso anche i flag di stato del file, essendo
 mantenuti nella struttura \kstruct{file} della \textit{file table}, vengono
 condivisi, per cui una modifica degli stessi con \func{fcntl} (vedi
 sez.~\ref{sec:file_fcntl_ioctl}) si applicherebbe a tutti processi che
 condividono la voce nella \textit{file table}. Ai file però sono associati
-anche altri flag, dei quali l'unico usato al momento è \constd{FD\_CLOEXEC},
-detti \itindex{file~descriptor~flags} \textit{file descriptor flags}; questi
-invece sono mantenuti in \kstruct{file\_struct}, e perciò sono locali per
-ciascun processo e non vengono modificati dalle azioni degli altri anche in
-caso di condivisione della stessa voce della \textit{file table}.
+anche altri flag detti \itindex{file~descriptor~flags} \textit{file descriptor
+  flags}. Questi invece sono mantenuti in \kstruct{file\_struct}, e perciò
+sono locali per ciascun processo e non vengono modificati dalle azioni degli
+altri anche in caso di condivisione della stessa voce della \textit{file
+  table}; l'unico usato al momento è quello di \textit{close-on-exec} che
+indica che il file descriptor deve essere chiuso in una \func{exec} (vedi
+sez.~\ref{sec:proc_exec}).
+
+\itindend{close-on-exec}
 
 Si tenga presente dunque che in un sistema unix-like è sempre possibile per
 più processi accedere in contemporanea allo stesso file e che non esistono, a
@@ -1467,7 +1473,7 @@ L'unica differenza fra due file descriptor duplicati è che ciascuno avrà un
 suo \textit{file descriptor flag} indipendente. A questo proposito deve essere
 tenuto presente che nel caso in cui si usi \func{dup} per duplicare un file
 descriptor, se questo ha il flag di \textit{close-on-exec} attivo (vedi
-sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}), questo verrà
+sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_shared_access}), questo verrà
 cancellato nel file descriptor restituito come copia.
 
 L'uso principale di questa funzione è nella shell per la redirezione dei file
@@ -1764,7 +1770,6 @@ specificata.\footnote{l'introduzione è avvenuta su proposta dello sviluppatore
 Essendo accomunate dalla stessa interfaccia le tratteremo insieme in questa
 sezione pur non essendo strettamente attinenti l'I/O su file.
 
-
 Benché queste funzioni non siano presenti negli standard tradizionali esse
 sono state adottate da altri sistemi unix-like come Solaris, i vari BSD, fino
 ad essere incluse in una recente revisione dello standard POSIX.1 (la
@@ -1939,10 +1944,11 @@ possibili diversi valori a seconda della funzione usata.
   \label{tab:at-functions_constant_values}
 \end{table}
 
-\footnotetext{si tratta di una funzionalità fornita dal kernel che consente di
-  montare automaticamente una directory quando si accede ad un
-  \textit{pathname} al di sotto di essa, per i dettagli, più di natura
-  sistemistica, si può consultare sez.~5.1.6 di \cite{AGL}.}
+\footnotetext{l'\textit{automount} \itindex{automount} è una funzionalità
+  fornita dal kernel che consente di montare automaticamente una directory
+  quando si accede ad un \textit{pathname} al di sotto di essa, per i
+  dettagli, di natura prevalentemente sistemistica, si può consultare
+  sez.~5.1.6 di \cite{AGL}.}
 
 Si tenga presente che non tutte le funzioni che prevedono l'argomento
 aggiuntivo sono \textit{system call}, ad esempio \func{faccessat} e
@@ -2136,7 +2142,7 @@ utilizzare invece la funzione di sistema \funcd{fstatat}, il cui prototipo è:
 \fhead{sys/stat.h}
 \fdecl{int fstatat(int dirfd, const char *pathname, struct stat *statbuf, int
   flags)} 
-\fdesc{Rimuove una voce da una directory.} 
+\fdesc{Legge le informazioni di un file.} 
 }
 
 {La funzione ritorna gli stessi valori e gli stessi codici di errore di
@@ -2231,7 +2237,6 @@ consentirebbe rendere accessibile all'interno di un \textit{choot} (vedi
 sez.~\ref{sec:file_chroot}) un qualunque file sia stato aperto fuori dallo
 stesso prima di entrarvi.
 
-
 % NOTE per la discussione sui problemi di sicurezza relativi a questa
 % funzionalità vedi http://lwn.net/Articles/562488/
 
@@ -2239,52 +2244,73 @@ Per questo motivo l'uso di \const{AT\_EMPTY\_PATH} richiede comunque privilegi
 amministrativi, anche se, quando è disponibile il filesystem \texttt{/proc}, è
 possibile usare \func{linkat} per creare un file da un qualunque file
 descriptor un processo abbia aperto, usandola con un codice analogo al
-seguente:\footnote{non esiste, al momento, una modalità per evitare i rischi
-  illustrati in precedenza se si sta usando il filesystem \textit{proc}.}
+seguente:\footnote{non esiste al momento, se si sta usando il filesystem
+  \textit{proc}, una modalità per evitare i rischi illustrati in precedenza.}
 \includecodesnip{listati/procfd_linkat.c}
-
-Questa modalità è anche quella con cui è possibile assegnare in un secondo
+e questa modalità è anche quella con cui è possibile assegnare in un secondo
 tempo il nome ad un file anonimo creato usando \func{open} con
 \const{O\_TMPFILE}; ma si deve tenere presente che per questi file la funzione
-ha un comportamento particolare. In generale infatti quando il file sorgente
-di \func{linkat} ha un numero di collegamenti nulli (cosa che avviene ad
-esempio quando si apre un file temporaneo e lo si cancella subito dopo oppure
-quando viene cancellato un file aperto in precedenza) la funzione non consente
-di ricollegarlo ad un altro file riassegnandogli un nuovo nome e fallisce
-sempre, qualunque siano i permessi del processo e che si usi questo approccio
-o \const{AT\_EMPTY\_PATH}, con un errore di \errval{ENOENT}.
-
-Questo non avviene se il file descriptor sorgente è stato ottenuto con
-\const{O\_TMPFILE} e la funzione ha successo, a meno che non si sia usato
-nell'apertura anche \const{O\_EXCL} per impedire questo specifico
-comportamento, e continuare ad ottenere l'errore di \errval{ENOENT}. In fig.
-
-Pertanto la modalità per creare in maniera sicura la versione iniziale di un
-file cui abbiamo accennato a pag.~\pageref{open_o_tmpfile_flag},
-
+ha un comportamento particolare.
+
+In generale infatti quando il file sorgente di \func{linkat} ha un numero di
+collegamenti nulli (cosa che avviene ad esempio quando si apre un file
+temporaneo e lo si cancella subito dopo oppure quando viene cancellato un file
+aperto in precedenza) la funzione non consente di ricollegarlo ad un altro
+file riassegnandogli un nuovo nome e fallisce sempre con un errore di
+\errval{ENOENT} qualunque siano i permessi del processo, e che si usi questo
+approccio o \const{AT\_EMPTY\_PATH}.  Ma questo non avviene se il file
+descriptor è stato ottenuto con \const{O\_TMPFILE}, in tal caso la funzione ha
+successo, a meno che non si sia usato nell'apertura anche \const{O\_EXCL} per
+impedire questo comportamento, e continuare ad ottenere \errval{ENOENT}.
+
+In fig.~\ref{fig:initfile} si è riportato il codice della funzione
+\func{InitFile}, che consente di creare in maniera sicura il contenuto
+iniziale di un file utilizzando \const{O\_TMPFILE} e \func{linkat}, come
+accennato a pag.~\pageref{open_o_tmpfile_flag}. La funzione richiede di
+indicare il file da creare usando la sintassi delle \textit{at-functions},
+specificando la directory in cui crearlo con il corrispondente file descriptor
+passato nell'argomento \texttt{dirfd} ed il pathname relativo ed essa passato
+l'argomento \texttt{file}; il contenuto iniziale del file deve essere fornito
+nel buffer \texttt{buf} di lunghezza \texttt{size}.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
-    \includecodesample{listati/initfile.c}
+    \includecodesample{listati/InitFile.c}
   \end{minipage}
-  \caption{Esempio di codice creare in maniera sicura il contenuto iniziale di
-    un file.} 
+  \caption{Esempio di codice per creare in maniera sicura il contenuto
+    iniziale di un file.}
   \label{fig:initfile}
 \end{figure}
 
-
-
-
-
-
-% TODO: Trattare esempio di inzializzazione di file e successivo collegamento
-% con l'uso di O_TMPFILE e linkat, vedi man open
-
-
-
-% TODO manca prototipo di renameat2, introdotta nel 3.15, vedi
-% http://lwn.net/Articles/569134/ 
-
+La funzione come primo passo (\texttt{\small 6--10}) ottiene un file
+descriptor accessibile in lettura/scrittura invocando \func{openat} con il
+flag \const{O\_TMPFILE} per ottenere un file anonimo, facendo riferimento a
+quella che sarà la directory di destinazione in cui poi verrà collegato lo
+stesso passata dal chiamante in \texttt{dirfd}, usando ``\texttt{.}'' come
+\textit{pathname} relativo. Si noti come nella chiamata si impostino anche
+(per semplicità si è usato un valore fisso) i valori iniziali dei permessi del
+file (lettura e scrittura solo per il proprietario), e come dopo la chiamata
+si controlli la presenza di un eventuale errore, ritornandolo con un messaggio
+qualora avvenga.
+
+Il secondo passo (\texttt{\small 11--15}) è quello di chiamare la funzione
+\func{FullWrite} (che tratteremo in dettaglio in sez.~\ref{sec:sock_io_behav})
+per eseguire la scrittura del contenuto del buffer \texttt{buf} sul file
+anonimo ottenuto con \func{openat}; in sostanza la funzione scrive tutto il
+contenuto del buffer, iterando le scritture qualora non sia possibile eseguire
+tutto con una singola \func{write}, cosa che comunque per i file su disco in
+genere non avviene mai.
+
+Una volta completata con successo la scrittura l'ultimo passo (\texttt{\small
+  17--23}) è collegare il file anonimo con \func{linkat}, per questo però
+occorre utilizzare il \textit{pathname} ad esso associato sotto
+\texttt{/proc}, che viene ottenuto (\texttt{\small 16}) con una
+\func{snprintf} (vedi sez.~\ref{sec:file_formatted_io}) usando file descriptor
+restituito da \func{openat}. Con questo \textit{pathname} si può procedere
+(\texttt{\small 17}) a chiamare \func{linkat} per eseguire il collegamento, in
+cui occorre usare il flag \const{AT\_SYMLINK\_NOFOLLOW} come nell'esempio
+precedente.
 
 Altre due funzioni che utilizzano due \textit{pathname} (e due file
 descriptor) sono \funcd{renameat} e \funcd{renameat2}, corrispondenti alla
@@ -2333,15 +2359,13 @@ aggiuntivo \param{flags}; in questo caso \func{renameat} è totalmente
 equivalente all'utilizzo di \func{renamat2} con un valore nullo per
 \param{flags}.
 
-L'uso di \func{renameat} è identico a quello di \func{rename}, con le solite
-note relative alle estensioni delle \textit{at-functions}, applicate ad
-entrambi i \textit{pathname} passati come argomenti alla funzione. Con
-\func{renameat2} l'introduzione dell'argomento \func{flags} (i cui valori
-possibili sono riportati in tab.~\ref{tab:renameat2_flag_values}) ha permesso
-di aggiungere alcune funzionalità non previste al momento da nessuno standard,
-e specifiche di Linux. Si tenga conto che questa funzione di sistema non viene
-definita nella \acr{glibc} per cui deve essere chiamata utilizzando
-\func{syscall} come illustrato in sez.~\ref{sec:intro_syscall}.
+L'uso di \func{renameat} è identico a quello di \func{rename}, con la sintassi
+delle \textit{at-functions} applicabile ad entrambi i \textit{pathname} passati
+come argomenti alla funzione. Con \func{renameat2} l'introduzione
+dell'argomento \func{flags} (i cui valori possibili sono riportati in
+tab.~\ref{tab:renameat2_flag_values}) ha permesso di aggiungere alcune
+funzionalità specifiche di Linux non previste al momento da nessuno standard
+(la funzione è disponibile nelle \acr{glibc} a partire dalla versione 2.28).
 
 \begin{table}[htb]
   \centering
@@ -2370,13 +2394,12 @@ L'uso dell'argomento \param{flags} in questo caso non attiene alle
 funzionalità relative alla \textit{at-functions}, ma consente di estendere le
 funzionalità di \func{rename}. In particolare \func{renameat2} consente di
 eseguire uno scambio di nomi in maniera atomica usando il flag
-\constd{RENAME\_EXCHANGE}; quando viene specificato la funzione non solo
-rinomina \param{oldpath} in \param{newpath}, ma rinomina anche, senza dover
-effettuare un passaggio intermedio, \param{newpath} in \param{oldpath}. Quando
-si usa questo flag, entrambi i \textit{pathname} passati come argomenti alla
-funzione devono esistere, e non è possibile usare \const{RENAME\_NOREPLACE},
-non ci sono infine restrizioni sul tipo dei file (regolari, directory, link
-simbolici, ecc.) di cui si scambia il nome.
+\constd{RENAME\_EXCHANGE}; se specificato la funzione rinomina in un colpo
+solo \param{oldpath} in \param{newpath} e \param{newpath} in
+\param{oldpath}. Usando questo flag, entrambi i \textit{pathname} passati come
+argomenti devono esistere, e non è possibile usare \const{RENAME\_NOREPLACE},
+non ci sono infine restrizioni sul tipo di file (regolare, directory, link
+simbolici, dispositivo) di cui si scambia il nome.
 
 Il flag \constd{RENAME\_NOREPLACE} consente di richiedere la generazione di un
 errore nei casi in cui \func{rename} avrebbe causato una sovrascrittura della
@@ -2392,38 +2415,427 @@ Infine il flag \constd{RENAME\_WHITEOUT}, introdotto con il kernel 3.18,
 richiede un approfondimento specifico, in quanto attiene all'uso della
 funzione con dei filesystem di tipo \textit{overlay}/\textit{union}, dato che
 il flag ha senso solo quando applicato a file che stanno su questo tipo di
-filesystem. 
-
-Un \textit{overlay} o \texttt{union filesystem} è un filesystem speciale
-strutturato in livelli, in cui si rende scrivibile un filesystem accessibile
-in sola lettura, \textsl{sovrapponendogli} un filesystem scrivibile su cui
-vanno tutte le modifiche. Un tale tipo di filesystem serve ad esempio a
-rendere scrivibili i dati processati quando si fa partire una distribuzione
-\textit{Live} basata su CD o DVD, ad esempio usando una chiavetta o uno spazio
-disco aggiuntivo.
+filesystem.  Un \textit{overlay} o \textit{union filesystem} è un filesystem
+speciale strutturato in livelli, in cui si rende scrivibile un filesystem
+accessibile in sola lettura, \textsl{sovrapponendogli} un filesystem
+scrivibile su cui vanno tutte le modifiche. Un tale tipo di filesystem serve
+ad esempio a rendere scrivibili i dati processati quando si fa partire una
+distribuzione \textit{Live} basata su CD o DVD, ad esempio usando una
+chiavetta o uno spazio disco aggiuntivo.
 
 In questo caso quando si rinomina un file che sta nello strato in sola lettura
-quello che succede è questo viene copiato a destinazione sulla parte
-accessibile in scrittura, ma l'originale non può essere cancellato, per far si
-che esso non appaia più è possibile creare 
+questo viene copiato a destinazione sulla parte accessibile in scrittura, ma
+l'originale non può essere cancellato; per far si che esso non appaia più è
+possibile creare un oggetto speciale del filesystem, chiamato
+\textit{whiteout}, che serve a renderlo non più visibile. La funzione consente
+di creare questo oggetto, che in un filesystem ordinario verrebbe visto come
+un file di dispositivo con \textit{major minor} e \textit{minor number} nulli,
+in maniera atomica quando si rinomina un file.  Dato che l'uso di
+\const{RENAME\_WHITEOUT} comporta in sostanza la creazione di un file di
+dispositivo, l'operazione è privilegiata (occorre la \textit{capability}
+\const{CAP\_MKNOD}), inoltre occorre anche il supporto nel filesystem usato
+come supporto per la scrittura. Infine l'operazione non è compatibile con
+\const{RENAME\_EXCHANGE}.
 
 \itindend{overlay~filesytem}
 \itindend{union~filesytem}
 
+Benché non rientri nelle \textit{at-functions} previste nello standard
+POSIX.1-2008, tratteremo qui anche la funzione di sistema \funcd{statx},
+introdotta con il kernel 4.11 e disponibile dalle versione 2.28 della
+\acr{glibc}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fhead{unistd.h}
+\fhead{fcntl.h}
+\fdecl{int statx(int dirfd, const char *pathname, int flags, \\
+\phantom{int statx(}unsigned int mask, struct statx *statxbuf)} 
+\fdesc{Legge le informazioni di un file.} 
+}
+
+{La funzione ritorna gli stessi valori e gli stessi codici di errore di
+  \func{stat}, \func{fstat}, o \func{lstat} a seconda del valore di
+  \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 o \param{mask}
+    ha un valore riservato.
+  \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+    ma \param{dirfd} fa riferimento ad un file.
+  \end{errlist}
+}  
+\end{funcproto}
+
+La funzione è una estensione specifica di Linux consente di leggere le
+informazioni di un file; ha la stessa sintassi di \func{fstatat} utilizzando
+con lo stesso significato gli argomenti \param{dirfd} e \param{pathname} ed i
+valori \const{AT\_EMPTY\_PATH}, \const{AT\_NO\_AUTOMOUNT} e
+\const{AT\_SYMLINK\_NOFOLLOW} per \param{flags}. Si può pertanto indicare il
+file di cui si vogliono ottenere i dati con un \textit{pathname} assoluto, con
+un \textit{pathname} relativo (sia alla directory corrente che a quella
+indicata da \param{dirfd}) o con un file descriptor ad esso associato.
+
+La funzione però consente di ottenere informazioni più dettagliate rispetto a
+quelle fornite dalle funzioni tradizionali come \func{stat} e \func{fstatat},
+ed è in grado di controllare le modalità con cui le ottiene nel caso un file
+sia posto su un filesystem remoto.  Per questo, oltre ai tre valori
+precedenti, l'argomento \param{flags} consente anche gli ulteriori valori
+elencati in tab.~\ref{tab:statx_flags_const}, con il significato ivi
+illustrato.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Costante} & \textbf{Significato} \\
+    \hline
+    \hline
+    \constd{AT\_STATX\_SYNC\_AS\_STAT}& si comporta esattamente come
+                                        \func{stat}, in questo caso (il default
+                                        se non viene indicato niente) il
+                                        risultato dipende dal tipo di
+                                        filesystem.\\
+    \constd{AT\_STATX\_FORCE\_SYNC}& richiede che i valori degli attributi
+                                     richiesti siano, in caso di un filesystem
+                                     di rete, siano sincronizzati con il server
+                                     remoto, questo può forzare una scrittura
+                                     dei dati (in particolare i tempi del file)
+                                     verso lo stesso.\\
+    \constd{AT\_STATX\_DONT\_SYNC} & chiede di non sincronizzare nessun dato,
+                                     ritornando quanto presente nella cache,
+                                     questo significa che i dati potrebbero
+                                     essere non coerenti ed aggiornati, ma si
+                                     evita, in caso di filesystem di rete, la
+                                     necessità di contattare il server remoto.\\ 
+    \hline
+  \end{tabular}  
+  \caption{Valori specifici di \func{statx} per l'argomento \param{flags}.}
+  \label{tab:statx_flags_const}
+\end{table}
+
+La funzione restituisce le informazioni relative al file richiesto nella
+struttura \struct{statx} puntata dall'argomento \param{statxbuf}.  Inoltre
+data la quantità di informazioni che possono essere richieste, la funzione
+consente, con l'argomento \param{mask} di selezionare quelle volute, questa
+deve essere assegnata ad una maschera binaria dei valori illustrati in
+tab.~\ref{tab:statx_mask_const}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|l|}
+    \hline
+    \textbf{Costante} & \textbf{Significato} \\
+    \hline
+    \hline
+    \constd{STATX\_TYPE}  & Tipo del file (\texttt{stx\_mode \& S\_IFMT}).\\
+    \constd{STATX\_MODE}  & Permessi del file (\texttt{stx\_mode \&
+                            \tild{}S\_IFMT}).\\ 
+    \constd{STATX\_NLINK} & Numero di collegamenti (\textit{hard link},
+                            \texttt{stx\_nlink}).\\ 
+    \constd{STATX\_UID}   & Proprietario del file (per \ids{UID},
+                            \texttt{stx\_uid}).\\
+    \constd{STATX\_GID}   & Gruppo proprietario del file (per \ids{GID},
+                            \texttt{stx\_gid}).\\
+    \constd{STATX\_ATIME} & Tempo di ultimo accesso (\texttt{stx\_atime}).\\
+    \constd{STATX\_MTIME} & Tempo di ultima modifica (\texttt{stx\_mtime}).\\
+    \constd{STATX\_CTIME} & Tempo di ultimo cambiamento (\texttt{stx\_ctime}).\\
+    \constd{STATX\_INO}   & Numero di \textit{inode} (\texttt{stx\_ino}).\\
+    \constd{STATX\_SIZE}  & Dimensione del file (\texttt{stx\_size}).\\
+    \constd{STATX\_BLOCKS}& Numero di blocchi del file (\texttt{stx\_blocks}).\\
+    \constd{STATX\_BASIC\_STATS}& Tutte le informazioni precedenti.\\
+    \constd{STATX\_BTIME} & Tempo di creazione (\texttt{stx\_btime}).\\
+%    \constd{}& .\\
+    \constd{STATX\_ALL}   & Tutte le informazioni.\\
+    \hline
+  \end{tabular}
+  \caption{Le costanti per i valori dell'argomento \param{mask} di
+    \func{statx}.}
+  \label{tab:statx_mask_const}
+\end{table}
+
+Si tenga presente che il kernel non richiede che \param{mask} contenga solo i
+flag di tab.~\ref{tab:statx_mask_const}, valori ulteriori in genere vengono
+ignorati ma non si può comunque indicare un valore qualunque in quanto alcuni
+bit sono riservati per future estensioni.\footnote{in particolare il bit
+  \constd{STATX\_\_RESERVED} che se usato causa il fallimento della funzione
+  con un errore di \errval{EINVAL}.}  Inoltre non è detto che tutte le
+informazioni richieste con \param{mask} siano disponibili, per questo il
+kernel restituisce in un opportuno campo della struttura \struct{statx},
+\var{stx\_mask}, quali sono i dati effettivamente restituiti, che possono in
+alcuni casi essere anche di più di quelli richiesti (se l'informazione
+aggiuntiva è ottenuta senza costi ulteriori) per cui è normale che questo
+valore possa essere diverso da quanto richiesto.
+
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{0.8\textwidth}
+    \includestruct{listati/statx.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{statx} per la lettura delle informazioni dei 
+    file.}
+  \label{fig:file_statx_struct}
+\end{figure}
+
+Si è riportata in fig.~\ref{fig:file_statx_struct} la definizione della
+struttura \struct{statx} come presente in \headfile{sys/stat.h}; i campi
+\var{stx\_mode}, \var{stx\_nlink}, \var{stx\_uid}, \var{stx\_gid},
+\var{stx\_ino}, \var{stx\_size}, \var{stx\_blksize}, \var{stx\_blocks} sono
+identici agli analoghi (con prefisso \texttt{st\_}) dell'ordinaria struttura
+\struct{stat} illustrata in fig.~\ref{fig:file_stat_struct} e vale per essi
+quanto già detto in sez.~\ref{sec:file_stat} e seguenti.
+
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{0.8\textwidth}
+    \includestruct{listati/statx_timestamp.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \structd{statx\_timestamp} per i tempi dei file con
+    \func{statx}. }
+  \label{fig:file_statx_timestamp_struct}
+\end{figure}
+
+Anche i campi \var{stx\_atime}, \var{stx\_mtime}, \var{stx\_ctime} mantengono
+questa analogia, ma esprimono i tempi di ultimo accesso, modifica e
+cambiamento con una precisione ed estensione maggiore grazie all'uso di una
+struttura dedicata \struct{statx\_timestamp} (riportata in
+fig.~\ref{fig:file_statx_timestamp_struct}) che consente di estendere i tempi
+dei file ad una granularità del nanosecondo e con un valore dello \textit{unix
+  time} (vedi sez.~\ref{sec:sys_unix_time}) a 64 bit, che non darà problemi di
+overflow per parecchio tempo (sicuramente ben oltre la durata di questa
+guida).
+
+Oltre ai precedenti, e a \val{stx\_mask} che abbiamo già visto e che indica
+quali delle informazioni richieste alla funzione sono state fornite,
+\func{statx} prevede una serie di informazioni aggiuntive fornite in
+altrettanti nuovi campi, illustrati nell'elenco seguente. È comunque previsto
+che in futuro \struct{statx} venga estesa per supportare ulteriori
+informazioni.
+
+\begin{basedescript}{\desclabelwidth{1.6cm}\desclabelstyle{\nextlinelabel}}
+\item[\var{stx\_btime}] In questo campo viene restituito il \textsl{tempo di
+    creazione} del file. Come detto in sez.~\ref{sec:file_file_times} questo
+  tempo normalmente non esiste in un sistema \textit{unix-like}, ma per
+  migliorare l'interoperabilità è stato aggiunto nelle versioni più recenti di
+  vari filesystem (come XFS, \acr{ext4}, ecc.) in modo che possa essere
+  utilizzato da servizi di condivisione dei file (è usato da \textsl{Samba},
+  ed è previsto nello standard di NFSv4).
+\item[\var{stx\_attributes\_mask}] in questo campo viene restituita una
+  maschera che indica quali sono i bit restituiti in \var{stx\_attributes}
+  effettivamente supportati per il file, e per poter utilizzare quest'ultimo
+  occorre sempre eseguire un AND aritmetico con \var{stx\_attributes\_mask} per
+  ottenere i valori validi.
+\item[\var{stx\_attributes}] in questo campo vengono restituiti gli eventuali
+  attributi addizionali posseduti dal file. Gran parte di questi sono quelli
+  impostati con i comandi \cmd{lsattr} e \cmd{chattr} ed abbiamo già incontrato
+  alcuni di essi in sez.~\ref{sec:file_perm_overview}. Gli attributi vengono
+  restituiti in forma di maschera binaria con i valori delle costanti elencate
+  in tab.~\ref{tab:statx_stx_attributes}, dove si trova anche la relativa
+  descrizione.
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Costante} & \textbf{Significato} \\
+    \hline
+    \hline
+    \constd{STATX\_ATTR\_COMPRESSED}& Il file è compresso automaticamente dal
+                                      filesystem (quindi può richiedere un
+                                      maggior uso di risorse in caso di
+                                      accesso).\\
+    \constd{STATX\_ATTR\_IMMUTABLE} & Il file è marcato come
+                                      \textit{immutable} e non può essere
+                                      modificato in nessun modo (vedi
+                                      sez.~\ref{sec:file_perm_overview}).\\
+    \constd{STATX\_ATTR\_APPEND}    & Il file è marcato come
+                                      \textit{append-only} e può essere
+                                      soltanto esteso in \textit{append} (vedi
+                                      sez.~\ref{sec:file_perm_overview}).\\
+    \constd{STATX\_ATTR\_NODUMP}    & Il file è marcato per essere escluso da
+                                      eventuali backup a livello di filesystem
+                                      come quelli eseguiti con il comando
+                                      \cmd{dump}.\\
+    \constd{STATX\_ATTR\_ENCRYPTED} & Il file è cifrato sul filesystem ed è
+                                      necessaria una chiave di accesso per
+                                      decifrarne il contenuto.\\
+    \constd{STATX\_ATTR\_AUTOMOUNT} & Il file, in questo caso in genere una
+                                      directory, è marcata come punto di
+                                      innesco per un \textit{automount}.\\
+    \hline
+  \end{tabular}
+  \caption{Le costanti degli attributi addizionali restituiti in
+    \var{stx\_attributes}.} 
+  \label{tab:statx_stx_attributes}
+\end{table}
+
+\item[\var{stx\_rdev\_major}, \var{stx\_rdev\_minor}] in questi campi vengono
+  restituiti rispettivamente \textit{major number} e \textit{minor number} del
+  file quando questo è un file di dispositivo (fanno le veci del campo
+  \var{st\_rdev} di \struct{stat}).
+
+\item[\var{stx\_dev\_major}, \var{stx\_dev\_minor}] in questi campi vengono
+  restituiti \textit{major number} e \textit{minor number} del dispositivo su
+  cui risiede il file (fanno le veci del campo \var{st\_dev} di \struct{stat}).
+\end{basedescript}
+
+Di questi campi \var{stx\_mode}, \var{stx\_nlink}, \var{stx\_uid},
+\var{stx\_gid}, \var{stx\_ino}, \var{stx\_size} e \var{stx\_blocks} e quelli
+relativi ai tempi ordinari dei file vengono sempre restituiti, ed il relativo
+valore in \struct{statx} sovrascritto, indipendentemente dal fatto che siano
+stati richiesti o no, con \var{stx\_mask} che indicherà quali sono quelli che
+hanno valori effettivamente validi.
+
+Se un filesystem ha dei campi che non esistono o hanno valori senza
+corrispondenza in un sistema unix-like, questi potranno essere restituiti con
+valori fittizi ricostruiti, ad esempio usando \ids{UID} e \ids{GID} impostati
+in fase di montaggio per un filesystem che non supporta gli utenti; in questi
+casi il relativo bit in \var{stx\_mask} sarà comunque cancellato. In caso di
+cambiamenti al file eseguiti in concorrenza a \func{statx} è possibile che
+campi diversi possano avere informazioni ottenute in momenti diversi, con
+valori precedenti o posteriori il cambiamento. Inoltre, se non richiesti
+esplicitamente, alcuni campi possono avere valori approssimati, ad esempio in
+caso di NFS, questi non vengono mai aggiornati dallo stato sul server remoto.
+
+Il campo \var{stx\_btime} viene restituito solo se richiesto, e si otterrà un
+valore nullo (ed il relativo bit in \var{stx\_mask} cancellato) se questo non
+esiste. Lo stesso vale nel caso si siano richiesti \var{stx\_rdev\_major} o
+\var{stx\_rdev\_minor} ed il file non è un file di dispositivo. I campi
+\var{stx\_dev\_major}, \var{stx\_dev\_minor} e \var{stx\_blksize} attengono
+ad informazioni locali, e sono sempre disponibili in maniera diretta.
+
+% NOTE: per statx https://lwn.net/Articles/707602/ e
+% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f)
+
+Infine trattiamo qui altre due funzioni, \func{fexecve} e \func{execveat}, che
+non attengono che in maniera indiretta all'uso dei file, ma sono comunque
+legate all'interfaccia delle \textit{at-functions}. In realtà la sola
+effettivamente collegata all'interfaccia delle \textit{at-functions} è la
+funzione di sistema \func{execveat}, introdotta con il kernel 3.19, e per la
+quale non è disponibile ancora un'interfaccia diretta nella \acr{glibc} che
+però la usa (quando disponibile) per realizzare \func{fexecve}.
+
+L'introduzione di queste funzioni nasce dall'esigenza di verificare i
+contenuti di un file eseguibile prima di eseguirlo. Fare il controllo (aprendo
+il file e verificandone il contenuto) e poi eseguirlo con \func{execve} è
+suscettibile alla possibilità che fra il controllo e l'esecuzione il nome del
+file o di una directory sovrastante venga cambiato.
+
+Per mitigare il problema nello standard POSIX.1-2008 è stata introdotta la
+funzione \funcd{fexecve} che consente di eseguire un programma usando un file
+descriptor al posto di un \textit{pathname}; il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int fexecve(int fd, char *const argv[], char *const envp[])}
+\fdesc{Esegue un programma da un file descriptor.}
+}
+
+{La funzione non ritorna in caso di successo e ritorna $-1$ per un errore,
+  nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] \param{fd} non è un file descriptor, o \param{argv}
+    o  \param{envp} sono \val{NULL}.
+  \item[\errcode{ENOSYS}] il filesystem \file{proc} non è disponibile (prima
+    del kernel 3.19).   
+  \end{errlist}
+  oltre a tutti gli errori già visti per \func{execve}.}
+\end{funcproto}
+
+La funzione esegue il programma contenuto nel file (su cui il chiamante deve
+avere il permesso di esecuzione) corrispondente a \param{fd}; questo deve
+essere stato ottenuto aprendo il relativo eseguibile in sola lettura o con
+\const{O\_PATH}. Questa funzione fino al kernel 3.19 veniva realizzata nella
+\acr{glibc} usando il filesystem \file{/proc} per ottenere da \param{fd} il
+file corrispondente in \file{/proc/self/fd/}, in maniera analoga a quanto
+visto per l'esempio di fig.~\ref{fig:initfile}.
 
+La funzione di sistema \funcd{execveat} è stata introdotta proprio per rendere
+più sicura l'esecuzione ed evitare la necessità di avere disponibile
+\file{/proc} per poter usare \func{fexecve}, il suo prototipo è:
 
-% TODO trattare anche statx, aggiunta con il kernel 4.11 (vedi
-% https://lwn.net/Articles/707602/ e
-% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f) 
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int execveat(int dirfd, const char *pathname, char *const argv[], \\
+\phantom{int execveat(}char *const envp[], int flags)}
+\fdesc{Esegue un programma relativo ad una directory.} 
+}
+
+{La funzione non ritorna in caso di successo e ritorna $-1$ per un errore, nel
+  qual caso \var{errno} assumerà, inoltre tutti gli errori già visti per
+  \func{execve}, uno dei valori:
+  \begin{errlist}
+    \item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
+    \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
+    \item[\errcode{ELOOP}] si è usato \const{AT\_SYMLINK\_NOFOLLOW} in 
+      \param{flags} ma il file indicato è un link simbolico.
+    \item[\errcode{ENOENT}] il programma di cui si è richiesta l'esecuzione è
+      uno script, ma \func{dirfd} è aperto con il flag di
+      \textit{close-on-exec} e pertanto il programma non sarebbe accessibile
+      all'interprete.
+  \end{errlist}
+}
+\end{funcproto}
 
+La funzione segue la sintassi delle \textit{at-functions} per indicare il file
+da eseguire, e per il resto si comporta esattamente con come \func{execve} (le
+cui caratteristiche sono già state illustrate in
+sez.~\ref{sec:proc_exec}). Diventa così possibile indicare il programma da
+eseguire sia con un \textit{pathname} assoluto che relativo (usando
+\const{AT\_FDCWD} come \param{dirfd}), oppure con un \textit{pathname}
+relativo alla directory indicata da \param{dirfd}. In quest'ultima forma l'uso
+della funzione consente estendere i vantaggi delle \textit{at-functions} anche
+al caso dell'esecuzione di un programma.
+
+Inoltre usando, per \param{flags} il valore \const{AT\_EMPTY\_PATH}, si può
+indicare direttamente il file da eseguire aprendolo e passandone il file
+descriptor nell'argomento \param{dirfd}, ottenendo il comportamento di
+\func{fexecve}; quest'ultima infatti è sostanzialmente equivalente
+all'esecuzione di:
+\includecodesnip{listati/fexecve.c}
+l'unico altro valore utilizzabile per \param{flags} è
+\const{AT\_SYMLINK\_NOFOLLOW}, che fa fallire la funzione con un errore di
+\errval{ELOOP} se il file indicato è un link simbolico.
+
+Quando si usano \func{execveat} o \func{fexecve} per eseguire un programma
+attraverso un file descriptor è naturale impostare sullo stesso il flag di
+\textit{close-on-exec} in modo che questo venga automaticamente chiuso
+all'esecuzione. Questo evita di lasciare aperto inutilmente un file descriptor
+(un programma in genere non ha bisogno di avere un file aperto su se stesso),
+ma soprattutto evita problemi in caso di un eventuale uso ricorsivo di queste
+funzioni, in tal caso infatti, restando aperto ad ogni iterazione un ulteriore
+file descriptor, si potrebbe arrivare all'esaurimento degli stessi.
+
+Tutto questo però non è vero quando si vuole eseguire uno script; in tal caso
+infatti (si ricordi quanto detto a questo riguardo in
+sez.~\ref{sec:proc_exec}) il programma che viene effettivamente messo in
+esecuzione è l'interprete indicato nella riga iniziale dello script, che poi
+legge ed interpreta il codice da eseguire dallo script stesso. Ma se lancia lo
+script usando un file descriptor su cui è attivo il flag di
+\textit{close-on-exec}, questo sarà già chiuso quando l'interprete viene posto
+in esecuzione, rendendo impossibile la lettura del programma da
+interpretare.
+
+Per questo motivo, quando ci si trova in questa situazione, \func{execveat} (e
+quindi anche \func{fexecve}) eseguono un controllo preventivo e falliscono con
+un errore di \errval{ENOENT}. Pertanto se si vuole eseguire uno script
+passandone il file descriptor l'unica possibilità è non attivare il flag di
+\textit{close-on-exec}, esponendosi però al rischio di incorrere nei problemi
+accennati in precedenza.
 
 % TODO: manca prototipo e motivazione di fexecve, da trattare qui in quanto
 % inserita nello stesso standard e da usare con openat, vedi 
 % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
+
 % TODO manca prototipo di execveat, introdotta nel 3.19, vedi
 % https://lwn.net/Articles/626150/ cerca anche fexecve
-% TODO: manca prototipo e motivazione di execveat, vedi
-% http://man7.org/linux/man-pages/man2/execveat.2.html 
 
 
 % TODO: trattare i nuovi AT_flags quando e se arriveranno, vedi
@@ -2432,7 +2844,7 @@ che esso non appaia più è possibile creare
 \itindend{at-functions}
 
 
-\subsection{Le operazioni di controllo}
+\subsection{Le operazioni di controllo sui file descriptor}
 \label{sec:file_fcntl_ioctl}
 
 Oltre alle operazioni base esaminate in sez.~\ref{sec:file_unix_interface}
@@ -2441,31 +2853,30 @@ un file descriptor, che non riguardano la normale lettura e scrittura di dati,
 ma la gestione sia delle loro proprietà, che di tutta una serie di ulteriori
 funzionalità che il kernel può mettere a disposizione.
 
-% TODO: trattare qui i file seal 
-
 Per le operazioni di manipolazione e di controllo delle varie proprietà e
 caratteristiche di un file descriptor, viene usata la funzione di sistema
 \funcd{fcntl},\footnote{ad esempio si gestiscono con questa funzione varie
   modalità di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_operation}) e
-  il \textit{file locking} (vedi sez.~\ref{sec:file_locking}).} il cui
-prototipo è:
+  il \textit{file locking} (vedi sez.~\ref{sec:file_locking}) e altre
+  funzionalità avanzate che tratteremo più avanti.} il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
 \fhead{fcntl.h}
 \fdecl{int fcntl(int fd, int cmd)}
-\fdecl{int fcntl(int fd, int cmd, long arg)}
-\fdecl{int fcntl(int fd, int cmd, struct flock * lock)}
-\fdecl{int fcntl(int fd, int cmd, struct f\_owner\_ex * owner)}
-\fdesc{Esegue una operazione di controllo sul file.} 
+\fdecl{int fcntl(int fd, int cmd, int arg)}
+\fdecl{int fcntl(int fd, int cmd, ...)}
+\fdesc{Esegue una operazione di controllo su un file descriptor.} 
 }
 
 {La funzione ha valori di ritorno diversi a seconda dell'operazione richiesta
   in caso di successo mentre ritorna sempre $-1$ per un errore, nel qual caso
   \var{errno} assumerà valori diversi che dipendono dal tipo di operazione,
-  l'unico valido in generale è:
+  gli unici con significato generico sono:
   \begin{errlist}
   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
+  \item[\errcode{EINVAL}] \param{cmd} non è un comando supportato dal kernel
+    corrente.
   \end{errlist}
 }  
 \end{funcproto}
@@ -2473,11 +2884,13 @@ prototipo è:
 Il primo argomento della funzione è sempre il numero di file descriptor
 \var{fd} su cui si vuole operare. Il comportamento di questa funzione, il
 numero e il tipo degli argomenti, il valore di ritorno e gli eventuali errori
-aggiuntivi, sono determinati dal valore dell'argomento \param{cmd} che in
-sostanza corrisponde all'esecuzione di un determinato \textsl{comando}. A
-seconda del comando specificato il terzo argomento può essere assente (ma se
-specificato verrà ignorato), può assumere un valore intero di tipo
-\ctyp{long}, o essere un puntatore ad una struttura \struct{flock}.
+aggiuntivi, sono determinati dal valore del secondo argomento \param{cmd}, che
+serve a specificare il ``\textsl{comando}'' della funzione, in sostanza quale
+operazione si intende eseguire. A seconda del comando richiesto il terzo
+argomento può essere assente (ma se specificato lo stesso verrà semplicemente
+ignorato) ed in generale dipende dal comando \param{cmd}; il caso più comune è
+quello di un intero, ma ci sono comandi in cui si devono usare dei tipi
+specifici, che descriveremo esplicitamente nei singoli casi.
 
 In sez.~\ref{sec:file_dup} abbiamo incontrato un esempio dell'uso di
 \func{fcntl} per la duplicazione dei file descriptor, una lista di tutti i
@@ -2486,15 +2899,13 @@ errore restituiti e del tipo del terzo argomento (cui faremo riferimento con
 il nome indicato nel precedente prototipo), è riportata di seguito:
 \begin{basedescript}{\desclabelwidth{1.8cm}}
 \item[\constd{F\_DUPFD}] trova il primo file descriptor disponibile di valore
-  maggiore o uguale ad \param{arg}, e ne fa un duplicato
-  di \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$
-  in caso di errore. Oltre a \errval{EBADF} gli errori possibili sono
+  maggiore o uguale all'argomento \param{arg}, e ne fa un duplicato di
+  \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$ in
+  caso di errore. Oltre a \errval{EBADF} gli errori possibili sono
   \errcode{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito
   o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di
   descrittori consentito.
 
-\itindbeg{close-on-exec}
-
 \item[\constd{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma
   in più attiva il flag di \textit{close-on-exec} sul file descriptor
   duplicato, in modo da evitare una successiva chiamata con
@@ -2504,24 +2915,23 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   sez.~\ref{sec:intro_gcc_glibc_std}).
 
 \item[\constd{F\_GETFD}] restituisce il valore dei \textit{file descriptor
-    flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il
-  terzo argomento viene ignorato. Non sono previsti errori diversi da
-  \errval{EBADF}. Al momento l'unico flag usato è quello di
-  \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, che
-  serve a richiedere che il file venga chiuso nella esecuzione di una
-  \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore nullo significa
-  pertanto che il flag non è impostato.
+    flags} (vedi sez.~\ref{sec:file_shared_access}) di \param{fd} in caso di
+  successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non
+  sono previsti errori diversi da \errval{EBADF}. Al momento l'unico flag
+  usato è quello di \textit{close-on-exec}, identificato dalla costante
+  \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
+  esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore
+  nullo significa pertanto che il flag non è impostato.
 
 \item[\constd{F\_SETFD}] imposta il valore dei \textit{file descriptor flags}
-  al valore specificato con \param{arg}, ritorna un valore nullo in caso di
-  successo e $-1$ in caso di errore. Non sono previsti errori diversi da
-  \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di
-  \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC},
-  tutti gli altri bit di \param{arg}, anche se impostati, vengono
-  ignorati.\footnote{questo almeno è quanto avviene fino al kernel 3.2, come
-    si può evincere dal codice della funzione \texttt{do\_fcntl} nel file
-    \texttt{fs/fcntl.c} dei sorgenti del kernel.}
-\itindend{close-on-exec}
+  (vedi sez.~\ref{sec:file_shared_access}) al valore specificato con 
+  \param{arg}, ritorna un valore nullo in caso di successo e $-1$ in caso di
+  errore. Non sono previsti errori diversi da \errval{EBADF}. Dato che l'unico
+  flag attualmente usato è quello di \textit{close-on-exec}, identificato
+  dalla costante \const{FD\_CLOEXEC}, tutti gli altri bit di \param{arg},
+  anche se impostati, vengono ignorati.\footnote{questo almeno è quanto
+    avviene fino al kernel 3.2, come si può evincere dal codice della funzione
+    \texttt{do\_fcntl} nel file \texttt{fs/fcntl.c} dei sorgenti del kernel.}
 
 \item[\constd{F\_GETFL}] ritorna il valore dei \textit{file status flags} di
   \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento
@@ -2530,36 +2940,42 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   dell'argomento \param{flags} di \func{open} che vengono memorizzati nella
   relativa voce della \textit{file table} all'apertura del file, vale a dire
   quelli riportati in tab.~\ref{tab:open_access_mode_flag} e
-  tab.~\ref{tab:open_operation_flag}). Si ricordi che quando si usa la
-  funzione per determinare le modalità di accesso con cui è stato aperto il
-  file è necessario estrarre i bit corrispondenti nel \textit{file status
-    flag} con la maschera \const{O\_ACCMODE} come già accennato in
-  sez.~\ref{sec:file_open_close}. 
+  tab.~\ref{tab:open_operation_flag}).
+
+  Si ricordi che quando si usa la funzione per determinare le modalità di
+  accesso con cui è stato aperto il file è necessario estrarre i bit
+  corrispondenti nel \textit{file status flag} con la maschera
+  \const{O\_ACCMODE} come già accennato in sez.~\ref{sec:file_open_close}.
 
 \item[\constd{F\_SETFL}] imposta il valore dei \textit{file status flags} al
   valore specificato da \param{arg}, ritorna un valore nullo in caso di
   successo o $-1$ in caso di errore. In generale possono essere impostati solo
   i flag riportati in tab.~\ref{tab:open_operation_flag}, su Linux si possono
   modificare soltanto \const{O\_APPEND}, \const{O\_ASYNC}, \const{O\_DIRECT},
-  \const{O\_NOATIME} e \const{O\_NONBLOCK}. Oltre a \errval{EBADF} si otterrà
-  \errcode{EPERM} se si cerca di rimuovere \const{O\_APPEND} da un file
-  marcato come \textit{append-only} o se di cerca di impostare
-  \const{O\_NOATIME} su un file di cui non si è proprietari (e non si hanno i
-  permessi di amministratore) ed \errcode{EINVAL} se si cerca di impostare
-  \const{O\_DIRECT} su un file che non supporta questo tipo di operazioni.
-
-\item[\constd{F\_GETLK}] richiede un controllo sul file lock specificato da
-  \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato,
-  ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Come
-  per i due successivi comandi oltre a \errval{EBADF} se \param{lock} non è un
-  puntatore valido restituisce l'errore generico \errcode{EFAULT}. Questa
-  funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
+  \const{O\_NOATIME} e \const{O\_NONBLOCK}.
+
+  Oltre a \errval{EBADF} si otterrà \errcode{EPERM} se si cerca di rimuovere
+  \const{O\_APPEND} da un file marcato come \textit{append-only} o se di cerca
+  di impostare \const{O\_NOATIME} su un file di cui non si è proprietari (e
+  non si hanno i permessi di amministratore) ed \errcode{EINVAL} se si cerca
+  di impostare \const{O\_DIRECT} su un file che non supporta questo tipo di
+  operazioni.
+
+\item[\constd{F\_GETLK}] richiede un controllo sul \textit{file lock}
+  specificato nella struttura \struct{flock} puntata dal terzo argomento (che
+  pertanto dovrà essere di tipo \ctyp{struct flock *}) sovrascrivendone il
+  contenuto con il risultato; ritorna un valore nullo in caso di successo o
+  $-1$ in caso di errore. Come per i due successivi comandi oltre a
+  \errval{EBADF}, se il terzo argomento non è un puntatore valido, restituisce
+  l'errore generico \errcode{EFAULT}. Questa funzionalità è trattata in
+  dettaglio in sez.~\ref{sec:file_posix_lock}.
 
-\item[\constd{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
-  specificato nella struttura puntata da \param{lock}, ritorna un valore nullo
-  in caso di successo e $-1$ se il file lock è tenuto da qualcun altro, nel
-  qual caso si ha un errore di \errcode{EACCES} o \errcode{EAGAIN}.  Questa
-  funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
+\item[\constd{F\_SETLK}] richiede o rilascia un \textit{file lock} a seconda
+  di quanto specificato nella struttura puntata dal terzo argomento (sempre di
+  tipo \ctyp{struct flock *}); ritorna un valore nullo in caso di successo e
+  $-1$ se il \textit{file lock} è tenuto da qualcun altro, nel qual caso si ha
+  un errore di \errcode{EACCES} o \errcode{EAGAIN}.  Questa funzionalità è
+  trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
 
 \item[\constd{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
   la funzione non ritorna subito ma attende che il blocco sia rilasciato, se
@@ -2567,15 +2983,42 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   imposta \var{errno} a \errcode{EINTR}.  Questa funzionalità è trattata in
   dettaglio in sez.~\ref{sec:file_posix_lock}.
 
+\item[\constd{F\_OFD\_GETLK}] analoga di \constd{F\_GETLK} ma per i nuovi
+  \textit{open file descriptor locks} introdotti con il kernel 3.15, richiede
+  un controllo sul \textit{file lock} specificato nella struttura
+  \struct{flock} puntata dal terzo argomento (che pertanto dovrà essere di
+  tipo \ctyp{struct flock *}) sovrascrivendone il contenuto con il risultato,
+  ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Come
+  per i due successivi comandi oltre a \errval{EBADF} se il terzo argomento
+  non è un puntatore valido restituisce l'errore generico
+  \errcode{EFAULT}. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:open_file_descriptor_locks}.
+
+\item[\constd{F\_OFD\_SETLK}] analoga di \constd{F\_SETLK} ma per i nuovi
+  \textit{open file descriptor locks} introdotti con il kernel 3.15, richiede
+  o rilascia un \textit{file lock} a seconda di quanto specificato nella
+  struttura puntata dal terzo argomento (sempre di tipo \ctyp{struct flock
+    *}); ritorna un valore nullo in caso di successo e $-1$ se il \textit{file
+    lock} è tenuto da qualcun altro, nel qual caso si ha un errore di
+  \errcode{EACCES} o \errcode{EAGAIN}.  Questa funzionalità è trattata in
+  dettaglio in sez.~\ref{sec:open_file_descriptor_locks}.
+
+\item[\constd{F\_OFD\_SETLKW}] identica a \const{F\_OFD\_SETLK} eccetto per il
+  fatto che la funzione non ritorna subito ma attende che il blocco sia
+  rilasciato, se l'attesa viene interrotta da un segnale la funzione
+  restituisce $-1$ e imposta \var{errno} a \errcode{EINTR}.  Questa
+  funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:open_file_descriptor_locks}.
+
 \item[\constd{F\_GETOWN}] restituisce in caso di successo l'identificatore del
   processo o del \textit{process group} (vedi sez.~\ref{sec:sess_proc_group})
-  che è preposto alla ricezione del segnale \signal{SIGIO} (o l'eventuale
-  segnale alternativo impostato con \const{F\_SETSIG}) per gli eventi
-  asincroni associati al file descriptor \param{fd} e del segnale
-  \signal{SIGURG} per la notifica dei dati urgenti di un socket (vedi
-  sez.~\ref{sec:TCP_urgent_data}). Restituisce $-1$ in caso di errore ed il
-  terzo argomento viene ignorato. Non sono previsti errori diversi da
-  \errval{EBADF}.
+  che è preposto alla ricezione dei segnali \signal{SIGIO} o \signal{SIGURG};
+  il primo (o l'eventuale segnale alternativo impostato con \const{F\_SETSIG})
+  per gli eventi asincroni associati al file descriptor \param{fd} (vedi
+  sez.~\ref{sec:file_asyncronous_operation}), il secondo per la notifica dei
+  dati urgenti di un socket (vedi sez.~\ref{sec:TCP_urgent_data}). Restituisce
+  $-1$ in caso di errore ed il terzo argomento viene ignorato. Non sono
+  previsti errori diversi da \errval{EBADF}.
 
   Per distinguerlo dal caso in cui il segnale viene inviato a un singolo
   processo, nel caso di un \textit{process group} viene restituito un valore
@@ -2603,13 +3046,13 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   il comportamento del comando può risultare diverso a seconda delle versioni
   della \acr{glibc} e del kernel.
 
-\item[\constd{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
-  l'identificatore del processo o del \textit{process group} che riceverà i
-  segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file
-  descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ in
-  caso di errore. Oltre a \errval{EBADF} gli errori possibili sono
-  \errcode{ESRCH} se \param{arg} indica un processo o un \textit{process
-    group} inesistente.
+\item[\constd{F\_SETOWN}] imposta, con il valore del terzo argomento
+  \param{arg}, l'identificatore del processo o del \textit{process group} che
+  riceverà i segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi asincroni
+  associati al file descriptor \param{fd}. Ritorna un valore nullo in caso di
+  successo o $-1$ in caso di errore. Oltre a \errval{EBADF} gli errori
+  possibili sono \errcode{ESRCH} se \param{arg} indica un processo o un
+  \textit{process group} inesistente.
 
   L'impostazione è soggetta alle stesse restrizioni presenti sulla funzione
   \func{kill} (vedi sez.~\ref{sec:sig_kill_raise}), per cui un utente non
@@ -2619,47 +3062,39 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   valore negativo, il cui valore assoluto corrisponda all'identificatore del
   \textit{process group}.
 
-  A partire dal kernel 2.6.12 se si sta operando con i \textit{thread} della
+  A partire dal kernel 2.6.12, se si sta operando con i \textit{thread} della
   implementazione nativa di Linux (quella della NTPL, vedi
   sez.~\ref{sec:linux_ntpl}) e se si è impostato un segnale specifico con
   \const{F\_SETSIG}, un valore positivo di \param{arg} viene interpretato come
   indicante un \textit{Thread ID} e non un \textit{Process ID}.  Questo
   consente di inviare il segnale impostato con \const{F\_SETSIG} ad uno
-  specifico \textit{thread}. In genere questo non comporta differenze
-  significative per il processi ordinari, in cui non esistono altri
-  \textit{thread}, dato che su Linux il \textit{thread} principale, che in tal
-  caso è anche l'unico, mantiene un valore del \textit{Thread ID} uguale al
-  \ids{PID} del processo. Il problema è però che questo comportamento non si
-  applica a \signal{SIGURG}, per il quale \param{arg} viene sempre
-  interpretato come l'identificatore di un processo o di un \textit{process
-    group}.
-
-\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata
-  dall'argomento \param{owner} l'identificatore del processo, \textit{thread}
-  o \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) che è
-  preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per gli
-  eventi associati al file descriptor \param{fd}.  Ritorna un valore nullo in
-  caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} e da
-  \errval{EFAULT} se \param{owner} non è un puntatore valido.
+  specifico \textit{thread}.
+
+  In genere questo non comporta differenze significative per il processi
+  ordinari, in cui non esistono altri \textit{thread}, dato che su Linux il
+  \textit{thread} principale, che in tal caso è anche l'unico, mantiene un
+  valore del \textit{Thread ID} uguale al \ids{PID} del processo. Il problema
+  è però che questo comportamento non si applica a \signal{SIGURG}, per il
+  quale \param{arg} viene sempre interpretato come l'identificatore di un
+  processo o di un \textit{process group}.
+
+\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata dal terzo
+  argomento (che deve essere di tipo \ctyp{struct f\_owner\_ex *})
+  l'identificatore del processo, \textit{thread} o \textit{process group} che
+  è preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per
+  gli eventi associati al file descriptor \param{fd}.  Ritorna un valore nullo
+  in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} l'unico
+  altro errore è \errval{EFAULT} se \param{owner} non è un puntatore valido.
 
   Il comando, che è disponibile solo a partire dal kernel 2.6.32, effettua lo
   stesso compito di \const{F\_GETOWN} di cui costituisce una evoluzione che
   consente di superare i limiti e le ambiguità relative ai valori restituiti
   come identificativo. A partire dalla versione 2.11 della \acr{glibc} esso
   viene usato dalla libreria per realizzare una versione di \func{fcntl} che
-  non presenti i problemi illustrati in precedenza per la versione precedente
-  di \const{F\_GETOWN}.  Il comando è specifico di Linux ed utilizzabile solo
-  se si è definita la macro \macro{\_GNU\_SOURCE}.
-
-\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura
-  \struct{f\_owner\_ex} puntata \param{owner}, l'identificatore del processo o
-  del \textit{process group} che riceverà i segnali \signal{SIGIO} e
-  \signal{SIGURG} per gli eventi associati al file
-  descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ in
-  caso di errore, con gli stessi errori di \const{F\_SETOWN} più
-  \errcode{EINVAL} se il campo \var{type} di \struct{f\_owner\_ex} non indica
-  un tipo di identificatore valido.
-
+  non presenti i problemi illustrati in precedenza per \const{F\_GETOWN}.  Il
+  comando è specifico di Linux ed utilizzabile solo se si è definita la macro
+  \macro{\_GNU\_SOURCE}.
+  
   \begin{figure}[!htb]
     \footnotesize \centering
     \begin{varwidth}[c]{0.5\textwidth}
@@ -2670,30 +3105,42 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
     \label{fig:f_owner_ex}
   \end{figure}
 
+\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura puntata
+  dal terzo argomento (che deve essere di tipo \ctyp{struct f\_owner\_ex *})
+  l'identificatore del processo o del \textit{process group} che riceverà i
+  segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file
+  descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ in
+  caso di errore, con gli stessi errori di \const{F\_SETOWN} più
+  \errcode{EINVAL} se il campo \var{type} di \struct{f\_owner\_ex} non indica
+  un tipo di identificatore valido.
+
   Come \const{F\_GETOWN\_EX} il comando richiede come terzo argomento il
-  puntatore ad una struttura \struct{f\_owner\_ex} la cui definizione è
-  riportata in fig.~\ref{fig:f_owner_ex}, in cui il primo campo indica il tipo
-  di identificatore il cui valore è specificato nel secondo campo, che assume
-  lo stesso significato di \param{arg} per \const{F\_SETOWN}. Per il campo
-  \var{type} i soli valori validi sono \constd{F\_OWNER\_TID},
+  puntatore ad una struttura \struct{f\_owner\_ex} (la cui definizione è
+  riportata in fig.~\ref{fig:f_owner_ex}) in cui il campo \var{type} indica il
+  tipo di identificatore che si intende usare, mentre il relativo valore è
+  specificato nel campo \var{pid}, che assume lo stesso significato del terzo
+  argomenti di \const{F\_SETOWN}.
+
+  Per \var{type} i soli valori validi sono \constd{F\_OWNER\_TID},
   \constd{F\_OWNER\_PID} e \constd{F\_OWNER\_PGRP}, che indicano
   rispettivamente che si intende specificare con \var{pid} un \textit{Tread
     ID}, un \textit{Process ID} o un \textit{Process Group ID}. A differenza
   di \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà
   sia \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che
   \signal{SIGURG}. Il comando è specifico di Linux, è disponibile solo a
-  partire dal kernel 2.6.32, ed è utilizzabile solo se si è definita la macro
+  partire dal kernel 2.6.32 ed è utilizzabile solo se si è definita la macro
   \macro{\_GNU\_SOURCE}.
 
-\item[\constd{F\_GETSIG}] restituisce il valore del segnale inviato dai vari
-  meccanismi di I/O asincrono associati al file descriptor \param{fd} (quelli
-  trattati in sez.~\ref{sec:file_asyncronous_operation}) in caso di successo o
-  $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti
-  errori diversi da \errval{EBADF}.  Un valore nullo indica che si sta usando
-  il segnale predefinito, che è \signal{SIGIO}. Un valore diverso da zero
-  indica il segnale che è stato impostato con \const{F\_SETSIG}, che può
-  essere anche lo stesso \signal{SIGIO}. Il comando è specifico di Linux ed
-  utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}.
+\item[\constd{F\_GETSIG}] restituisce in caso di successo il valore del
+  segnale inviato dai vari meccanismi di I/O asincrono associati al file
+  descriptor \param{fd} (quelli trattati in
+  sez.~\ref{sec:file_asyncronous_operation}) o $-1$ in caso di errore, il
+  terzo argomento viene ignorato. Non sono previsti errori diversi da
+  \errval{EBADF}.  Un valore nullo indica che si sta usando il segnale
+  predefinito, che è \signal{SIGIO}. Un valore diverso da zero indica il
+  segnale che è stato impostato con \const{F\_SETSIG}, che può essere anche lo
+  stesso \signal{SIGIO}. Il comando è specifico di Linux ed utilizzabile solo
+  se si è definita la macro \macro{\_GNU\_SOURCE}.
 
 \item[\constd{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di
   I/O asincrono associati al file descriptor \param{fd} (quelli trattati in
@@ -2708,7 +3155,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
 
   L'impostazione di un valore diverso da zero permette inoltre, se si è
   installato il gestore del segnale come \var{sa\_sigaction} usando
-  \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere
+  \const{SA\_SIGINFO} (vedi sez.~\ref{sec:sig_sigaction}), di rendere
   disponibili al gestore informazioni ulteriori riguardo il file che ha
   generato il segnale attraverso i valori restituiti in
   \struct{siginfo\_t}. Se inoltre si imposta un segnale \textit{real-time} si
@@ -2723,24 +3170,24 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   solo se si è definita la macro \macro{\_GNU\_SOURCE}.  Questa funzionalità è
   trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
 
-\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore
-  di \param{arg} un \textit{file lease} sul file descriptor \var{fd} a seconda
-  del valore indicato da \param{arg}. Ritorna un valore nullo in caso di
-  successo o $-1$ in caso di errore. Oltre a \errval{EBADF} si otterrà
-  \errcode{EINVAL} se si è specificato un valore non valido per \param{arg}
-  (deve essere usato uno dei valori di tab.~\ref{tab:file_lease_fctnl}),
-  \errcode{ENOMEM} se non c'è memoria sufficiente per creare il \textit{file
-    lease}, \errcode{EACCES} se non si è il proprietario del file e non si
-  hanno i privilegi di amministratore.\footnote{per la precisione occorre la
-    capacità \const{CAP\_LEASE}.}
-
-  Il supporto il supporto per i \textit{file lease}, che consente ad un
-  processo che detiene un \textit{lease} su un file di riceve una notifica
-  qualora un altro processo cerchi di eseguire una \func{open} o una
-  \func{truncate} su di esso è stato introdotto a partire dai kernel della
-  serie 2.4 Il comando è specifico di Linux ed utilizzabile solo se si è
-  definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in
-  dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
+\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore del terzo
+  argomento \param{arg} un \textit{file lease} sul file descriptor
+  \var{fd}. Ritorna un valore nullo in caso di successo o $-1$ in caso di
+  errore. Oltre a \errval{EBADF} si otterrà \errcode{EINVAL} se si è
+  specificato un valore non valido per \param{arg} (deve essere usato uno dei
+  valori di tab.~\ref{tab:file_lease_fctnl}), \errcode{ENOMEM} se non c'è
+  memoria sufficiente per creare il \textit{file lease}, \errcode{EACCES} se
+  non si è il proprietario del file e non si hanno i privilegi di
+  amministratore (per la precisione occorre la capacità \const{CAP\_LEASE},
+  vedi sez.~\ref{sec:proc_capabilities}).
+
+  Il supporto per i \textit{file lease}, che consente ad un processo che
+  detiene un \textit{lease} su un file di ricevere una notifica qualora un
+  altro processo cerchi di eseguire una \func{open} o una \func{truncate} su
+  di esso, è stato introdotto a partire dai kernel della serie 2.4. Il comando
+  è specifico di Linux ed utilizzabile solo se si è definita la macro
+  \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:file_asyncronous_lease}.
 
 \item[\constd{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui
   viene riportato al processo chiamante, tramite il segnale \signal{SIGIO} (o
@@ -2767,32 +3214,80 @@ il nome indicato nel precedente prototipo), è riportata di seguito:
   gli errori possibili sono \errcode{EBUSY} se si cerca di ridurre la
   dimensione del buffer al di sotto della quantità di dati effettivamente
   presenti su di esso ed \errcode{EPERM} se un processo non privilegiato cerca
-  di impostare un valore troppo alto.  La dimensione minima del buffer è pari
-  ad una pagina di memoria, a cui verrà comunque arrotondata ogni dimensione
-  inferiore, il valore specificato viene in genere arrotondato per eccesso al
-  valore ritenuto più opportuno dal sistema, pertanto una volta eseguita la
-  modifica è opportuno rileggere la nuova dimensione con
-  \const{F\_GETPIPE\_SZ}. I processi non privilegiati\footnote{per la
-    precisione occorre la capacità \const{CAP\_SYS\_RESOURCE}.} non possono
-  impostare un valore superiore a quello indicato da
-  \sysctlfiled{fs/pipe-size-max}.  Il comando è specifico di Linux, è
+  di impostare un valore troppo alto.
+
+  La dimensione minima del buffer è pari ad una pagina di memoria, a cui verrà
+  comunque arrotondata ogni dimensione inferiore, il valore specificato viene
+  in genere arrotondato per eccesso al valore ritenuto più opportuno dal
+  sistema, pertanto una volta eseguita la modifica è opportuno rileggere la
+  nuova dimensione con \const{F\_GETPIPE\_SZ}.
+
+  I processi non privilegiati (occorre la capacità \const{CAP\_SYS\_RESOURCE})
+  non possono impostare un valore superiore a quello indicato da
+  \sysctlfiled{fs/pipe-max-size}.  Il comando è specifico di Linux, è
   disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è
   definita la macro \macro{\_GNU\_SOURCE}.
 
+\item[\constd{F\_GET\_SEALS}] restituisce in caso di successo l'insieme dei
+  \textit{file seal} presenti su \param{fd}: 0 se non ve ne sono o $-1$ in
+  caso di errore, il terzo argomento viene ignorato.  Oltre a \errval{EBADF}
+  se il file non supporta i \textit{file seal} viene restituito un errore di
+  \errval{EINVAL}. Il comando è specifico di Linux, è disponibile solo a
+  partire dal kernel 3.17. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:file_seal_et_al}.
+
+\item[\constd{F\_ADD\_SEALS}] aggiunge i \textit{file seal} espressi come
+  maschera binaria nell'argomento \param{arg} a quelli presenti su \param{fd},
+  ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
+  comando è specifico di Linux, è disponibile solo a partire dal kernel
+  3.17. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:file_seal_et_al}.
+  
+\item[\constd{F\_GET\_RW\_HINT}] legge il valore dei \textit{read/write hints}
+  associati all'\textit{inode} a cui fa riferimento \param{fd} nella variabile
+  puntata dal terzo argomento che deve essere di tipo \ctyp{uint64\_t
+    *}. Ritorna un valore nullo in caso di successo o $-1$ in caso di
+  errore. Il comando è specifico di Linux, è disponibile solo a partire dal
+  kernel 4.13. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:file_fadvise}.
+
+\item[\constd{F\_SET\_RW\_HINT}] imposta il valore dei \textit{read/write
+    hints} associati all'\textit{inode} a cui fa riferimento \param{fd}; il
+  valore deve essere fornito nella variabile puntata dal terzo argomento, che
+  deve essere di tipo \ctyp{uint64\_t *}. Ritorna un valore nullo in caso di
+  successo o $-1$ in caso di errore.  Il comando è specifico di Linux, è
+  disponibile solo a partire dal kernel 4.13. Questa funzionalità è trattata
+  in dettaglio in sez.~\ref{sec:file_fadvise}.
+  
+\item[\constd{F\_GET\_FILE\_RW\_HINT}] legge il valore dei \textit{read/write
+    hints} associati al file descriptor \param{fd} nella variabile puntata dal
+  terzo argomento che deve essere di tipo \ctyp{uint64\_t *}.  Ritorna un
+  valore nullo in caso di successo o $-1$ in caso di errore.  Il comando è
+  specifico di Linux, è disponibile solo a partire dal kernel 4.13. Questa
+  funzionalità è trattata in dettaglio in sez.~\ref{sec:file_fadvise}.
+  
+\item[\constd{F\_SET\_FILE\_RW\_HINT}] legge il valore dei \textit{read/write
+    hints} associati al file descriptor \param{fd}; il valore deve essere
+  fornito nella variabile puntata dal terzo argomento, che deve essere di tipo
+  \ctyp{uint64\_t *}. Ritorna un valore nullo in caso di successo o $-1$ in
+  caso di errore.  Il comando è specifico di Linux, è disponibile solo a
+  partire dal kernel 4.13. Questa funzionalità è trattata in dettaglio in
+  sez.~\ref{sec:file_fadvise}.
+  
+  
 \end{basedescript}
 
-% TODO: trattare RWH_WRITE_LIFE_EXTREME e RWH_WRITE_LIFE_SHORT aggiunte con
-% il kernel 4.13 (vedi https://lwn.net/Articles/727385/)
 
 La maggior parte delle funzionalità controllate dai comandi di \func{fcntl}
 sono avanzate e richiedono degli approfondimenti ulteriori, saranno pertanto
 riprese più avanti quando affronteremo le problematiche ad esse relative. In
 particolare le tematiche relative all'I/O asincrono e ai vari meccanismi di
 notifica saranno trattate in maniera esaustiva in
-sez.~\ref{sec:file_asyncronous_operation} mentre quelle relative al
-\textit{file locking} saranno esaminate in sez.~\ref{sec:file_locking}). L'uso
-di questa funzione con i socket verrà trattato in
-sez.~\ref{sec:sock_ctrl_func}.
+sez.~\ref{sec:file_asyncronous_operation}, quelle relative al \textit{file
+  locking} saranno esaminate in sez.~\ref{sec:file_locking}, quelle relative
+ai \textit{file seal} in sez.~\ref{sec:file_seal_et_al} e quelle relative ai
+\textit{read/write hints} in sez.~\ref{sec:file_fadvise}. L'uso di questa
+funzione con i socket verrà trattato in sez.~\ref{sec:sock_ctrl_func}.
 
 La gran parte dei comandi di \func{fcntl} (come \const{F\_DUPFD},
 \const{F\_GETFD}, \const{F\_SETFD}, \const{F\_GETFL}, \const{F\_SETFL},
@@ -2803,10 +3298,6 @@ esplicitamente soltanto le ulteriori richieste in termini delle macro di
 funzionalità di sez.~\ref{sec:intro_gcc_glibc_std} soltanto per le
 funzionalità inserite in standard successivi o specifiche di Linux.
 
-
-% \subsection{La funzione \func{ioctl}}
-% \label{sec:file_ioctl}
-
 Benché l'interfaccia di gestione dell'I/O sui file di cui abbiamo parlato
 finora si sia dimostrata valida anche per l'interazione diretta con le
 periferiche attraverso i loro file di dispositivo, consentendo di usare le
@@ -2818,7 +3309,7 @@ porta seriale, o le dimensioni di un framebuffer.
 
 Per questo motivo nell'architettura del sistema è stata prevista l'esistenza
 di una apposita funzione di sistema, \funcd{ioctl}, come meccanismo generico
-per compiere operazioni specializzate; il suo prototipo è:
+per compiere operazioni specialistiche; il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/ioctl.h}
@@ -2861,16 +3352,16 @@ sistematica le operazioni che si possono gestire con \func{ioctl}, un breve
 elenco di alcuni esempi di esse è il seguente:
 \begin{itemize*}
 \item il cambiamento dei font di un terminale.
-\item l'esecuzione di una traccia audio di un CDROM.
+\item l'esecuzione di una traccia audio di un CD.
 \item i comandi di avanti veloce e di riavvolgimento di un nastro.
 \item il comando di espulsione di un dispositivo rimovibile.
 \item l'impostazione della velocità trasmissione di una linea seriale.
 \item l'impostazione della frequenza e della durata dei suoni emessi dallo
   speaker.
-\item l'impostazione degli attributi dei file su un filesystem
-  ext2.\footnote{i comandi \texttt{lsattr} e \texttt{chattr} fanno questo con
-    delle \func{ioctl} dedicate, usabili solo su questo filesystem e derivati
-    successivi (come ext3).}
+\item l'impostazione degli attributi dei file (vedi
+  sez.~\ref{sec:file_perm_management}) su un filesystem.\footnote{i comandi
+    \texttt{lsattr} e \texttt{chattr} fanno questo con delle \func{ioctl}
+    dedicate, usabili solo sui filesystem che li supportano.}
 \end{itemize*}
 
 In generale ogni dispositivo ha un suo insieme di operazioni specifiche
@@ -2902,7 +3393,7 @@ qualunque file, caratterizzate dal prefisso \texttt{FIO}. Queste operazioni
 sono definite nel kernel a livello generale, e vengono sempre interpretate per
 prime, per cui, come illustrato in \cite{LinDevDri}, eventuali operazioni
 specifiche che usino lo stesso valore verrebbero ignorate:
-\begin{basedescript}{\desclabelwidth{2.0cm}}
+\begin{basedescript}{\desclabelwidth{1.8cm}}
 \item[\constd{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in
   questo caso, essendo usata come operazione logica, \func{ioctl} non richiede
   un terzo argomento, il cui eventuale valore viene ignorato.
@@ -2959,7 +3450,6 @@ due funzioni sono rimaste.
 %  EXT4_IOC_SHUTDOWN (dal 4.10), XFS_IOC_GOINGDOWN e futura FS_IOC_SHUTDOWN
 % ioctl di btrfs, vedi http://lwn.net/Articles/580732/
 
-% \chapter{}
 
 \section{L'interfaccia standard ANSI C}
 \label{sec:files_std_interface}
@@ -2976,9 +3466,10 @@ standard (che sono state implementate la prima volta da Ritchie nel 1976 e da
 allora sono rimaste sostanzialmente immutate), vengono a costituire il nucleo
 della \acr{glibc} per la gestione dei file.
 
-Esamineremo in questa sezione le funzioni base dell'interfaccia degli
-\textit{stream}, analoghe a quelle di sez.~\ref{sec:file_unix_interface} per i
-file descriptor. In particolare vedremo come aprire, leggere, scrivere e
+Esamineremo in questa sezione le funzioni base di questa interfaccia che
+chiameremo, per distinguerla dalla precedente ``degli \textit{stream}''. Esse
+sono analoghe a quelle di sez.~\ref{sec:file_unix_interface} per i file
+descriptor, ed in particolare vedremo come aprire, leggere, scrivere e
 cambiare la posizione corrente in uno \textit{stream}.
 
 
@@ -3100,7 +3591,7 @@ input/output sul terminale.
 Per rispondere ad esigenze diverse lo standard definisce tre distinte modalità
 in cui può essere eseguita la bufferizzazione, delle quali occorre essere ben
 consapevoli, specie in caso di lettura e scrittura da dispositivi interattivi:
-\begin{itemize}
+\begin{itemize*}
 \item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
   caratteri vengono trasmessi direttamente al file non appena possibile
   (effettuando immediatamente una \func{write});
@@ -3110,7 +3601,7 @@ consapevoli, specie in caso di lettura e scrittura da dispositivi interattivi:
   quando si preme invio);
 \item \textit{fully buffered}: in questo caso i caratteri vengono
   trasmessi da e verso il file in blocchi di dimensione opportuna.
-\end{itemize}
+\end{itemize*}
 
 Lo standard ANSI C specifica inoltre che lo \textit{standard output} e lo
 \textit{standard input} siano aperti in modalità \textit{fully buffered}
@@ -3227,7 +3718,16 @@ essere aperti con le funzioni delle librerie standard del C.
                  scrittura.\\
     \hline
     \texttt{b} & Specifica che il file è binario, non ha alcun effetto. \\
-    \texttt{x} & L'apertura fallisce se il file esiste già. \\
+    \texttt{c} & Evita che l'apertura e seguenti letture o scritture diventino
+                 un \textit{cancellation point} per i \textit{thread};
+                 presente dalla \acr{glibc} 2.3.3. \\
+    \texttt{e} & Apre il file con il flag di \const{O\_CLOEXEC}; presente
+                 dalla \acr{glibc} 2.7. \\
+    \texttt{m} & Cerca di accedere al file con \func{mmap} invece
+                 che con le funzioni di I/O classiche; presente
+                 dalla \acr{glibc} 2.3. \\
+    \texttt{x} & L'apertura fallisce se il file esiste già (ignorato con
+                 \func{fdopen}).\\
     \hline
   \end{tabular}
   \caption{Modalità di apertura di uno \textit{stream} dello standard ANSI C
@@ -3238,24 +3738,35 @@ essere aperti con le funzioni delle librerie standard del C.
 In realtà lo standard ANSI C prevede un totale di 15 possibili valori
 diversi per \param{mode}, ma in tab.~\ref{tab:file_fopen_mode} si sono
 riportati solo i sei valori effettivi, ad essi può essere aggiunto pure
-il carattere \texttt{b} (come ultimo carattere o nel mezzo agli altri per
+il carattere ``\texttt{b}'' (come ultimo carattere o nel mezzo agli altri per
 le stringhe di due caratteri) che in altri sistemi operativi serve a
 distinguere i file binari dai file di testo; in un sistema POSIX questa
 distinzione non esiste e il valore viene accettato solo per
 compatibilità, ma non ha alcun effetto.
 
 La \acr{glibc} supporta alcune estensioni, queste devono essere sempre
-indicate dopo aver specificato il \param{mode} con uno dei valori di
-tab.~\ref{tab:file_fopen_mode}. L'uso del carattere \texttt{x} serve per
-evitare di sovrascrivere un file già esistente (è analoga all'uso dell'opzione
-\const{O\_EXCL} in \func{open}): se il file specificato già esiste e si
-aggiunge questo carattere a \param{mode} la \func{fopen} fallisce.
-
-Un'altra estensione serve a supportare la localizzazione, quando si
-aggiunge a \param{mode} una stringa della forma \verb|",ccs=STRING"| il
-valore \verb|STRING| è considerato il nome di una codifica dei caratteri
-e \func{fopen} marca il file per l'uso dei caratteri estesi e abilita le
-opportune funzioni di conversione in lettura e scrittura.
+indicate dopo aver specificato il \param{mode} con uno dei valori della
+seconda sezione di tab.~\ref{tab:file_fopen_mode}. Ad esempio l'uso del
+carattere ``\texttt{e}'' serve ad impostare il \textit{close-on-exec} sul file
+(è analoga all'uso del flag \const{O\_CLOEXEC} in \func{open}), ``\texttt{x}''
+serve per evitare di sovrascrivere un file già esistente (è analoga all'uso
+del flag \const{O\_EXCL} in \func{open}): se il file specificato già esiste e
+si aggiunge questo carattere a \param{mode} la \func{fopen} fallisce.
+
+Altri due valori hanno usi specialistici, con ``\texttt{m}'' si chiede di
+usare il \textit{memory mapping} per l'accesso al file (tratteremo i file
+mappati in memoria in sez.~\ref{sec:file_memory_map}), ma la funzionalità è al
+momento disponibile solo per i file aperti in sola lettura. Con ``\texttt{c}''
+infine si richiede che l'apertura, e le successive operazioni di lettura e
+scrittura, non diventino un \textit{cancellation point} per i \textit{thread}
+(tratteremo l'argomento in sez.~\ref{sec:xxx_thread}).
+
+Un'altra estensione serve a supportare la localizzazione, quando si aggiunge a
+\param{mode} una stringa della forma \verb|",ccs=STRING"| (che deve essere
+sempre in coda a tutte le altre) il valore \verb|STRING| è considerato il nome
+di una codifica dei caratteri e \func{fopen} marca il file per l'uso dei
+caratteri estesi e abilita le opportune funzioni di conversione in lettura e
+scrittura. 
 
 Nel caso si usi \func{fdopen} i valori specificati da \param{mode} devono
 essere compatibili con quelli con cui il file descriptor è stato aperto.
@@ -3344,44 +3855,50 @@ Una delle caratteristiche più utili dell'interfaccia degli \textit{stream} è
 la ricchezza delle funzioni disponibili per le operazioni di lettura e
 scrittura sui file. Sono infatti previste ben tre diverse modalità di
 input/output non formattato:
-\begin{itemize}
-\item\textsl{binario} in cui si leggono e scrivono blocchi di dati di
-   dimensione arbitraria, (analogo della modalità ordinaria dell'I/O sui file
-   descriptor), trattato in sez.~\ref{sec:file_binary_io}.
-\item\textsl{a caratteri} in cui si legge e scrive un carattere alla volta,
-   con la bufferizzazione che viene gestita automaticamente dalla libreria,
-   trattato in sez.~\ref{sec:file_char_io}.
-\item\textsl{di linea} in cui si legge e scrive una linea alla volta,
-   (terminata dal carattere di newline \verb|'\n'|), trattato in
-   sez.~\ref{sec:file_line_io}.
-\end{itemize}
-a cui si aggiunge la modalità di input/output formattato, trattato in
-sez.~\ref{sec:file_formatted_io}.
-
-Ognuna di queste modalità utilizza per l'I/O delle funzioni specifiche che
-vedremo nelle sezioni citate, affronteremo qui tutte gli argomenti e le
-funzioni che si applicano in generale a tutte le modalità di I/O.
-
-A differenza di quanto avviene con l'interfaccia dei file descriptor, con gli
-\textit{stream} il raggiungimento della fine del file viene considerato un
-errore, e viene notificato come tale dai valori di uscita delle varie
-funzioni. Nella maggior parte dei casi questo avviene con la restituzione del
-valore intero (di tipo \ctyp{int}) \val{EOF} definito anch'esso nell'header
+\begin{itemize*}
+\item\textsl{Input/Output binario}, una modalità in cui si leggono e scrivono
+  blocchi di dati di dimensione arbitraria; è l'analogo della modalità
+  ordinaria dell'input/output sui file descriptor vista in
+  sez.~\ref{sec:file_read} e \ref{sec:file_write}.
+\item\textsl{Input/Output a caratteri}, una modalità in cui si legge e scrive
+  un singolo carattere alla volta, anche in questo caso la bufferizzazione
+  viene gestita automaticamente dalla libreria;
+\item\textsl{Input/Output di linea}, una modalità in cui si legge e scrive una
+  linea di testo alla volta, in questa modalità si intende per linea una
+  sequenza di caratteri terminata dal carattere di \textit{newline}
+  (\verb|'\n'|);
+\end{itemize*}
+
+A queste tre modalità si aggiunge poi la modalità di input/output formattato
+che tratteremo in sez.~\ref{sec:file_unformatted_io}. Ognuna di queste
+modalità utilizza per l'I/O delle funzioni specifiche che vedremo più avanti,
+affronteremo qui invece gli argomenti e le funzioni che si applicano in
+generale a tutte queste diverse modalità di I/O.
+
+Una prima caratteristica specifica è che differenza di quanto avviene con
+l'interfaccia dei file descriptor, con gli \textit{stream} il raggiungimento
+della fine del file viene considerato un errore, che viene notificato come
+tale dai valori di uscita delle varie funzioni.
+
+In vari casi questo avviene con la restituzione di uno specifico
+valore intero (di tipo \ctyp{int}) definito come \val{EOF} nell'header
 \headfile{stdlib.h}. La costante deve essere negativa perché in molte funzioni
-un valore positivo indica la quantità di dati scritti, la \acr{glibc} usa il
-valore $-1$, ma altre implementazioni possono avere valori diversi.
+un valore positivo indica la quantità di dati scritti e ci potrebbe essere
+sovrapposizione, la \acr{glibc} usa il valore $-1$, ma altre implementazioni
+possono avere valori diversi.
 
 Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di
-libreria che si appoggiano a delle \textit{system call}, esse non impostano
-direttamente la variabile \var{errno}, che mantiene sempre il valore impostato
-dalla \textit{system call} invocata internamente che ha riportato l'errore.
+libreria realizzate usando delle \textit{system call}, esse non modificano mai
+direttamente la variabile \var{errno}, che in caso di errore mantiene sempre
+il valore impostato dalla \textit{system call} sottostante che lo ha
+riportato. 
 
 Siccome la condizione di \textit{end-of-file} è anch'essa segnalata come
-errore, nasce il problema di come distinguerla da un errore effettivo; basarsi
-solo sul valore di ritorno della funzione e controllare il valore di
-\var{errno} infatti non basta, dato che quest'ultimo potrebbe essere stato
-impostato in una altra occasione, (si veda sez.~\ref{sec:sys_errno} per i
-dettagli del funzionamento di \var{errno}).
+errore, nasce il problema di come distinguerla; basarsi solo sul valore di
+ritorno della funzione e controllare il valore di \var{errno} infatti non
+basta, dato che quest'ultimo potrebbe essere stato impostato in una altra
+occasione, (si veda sez.~\ref{sec:sys_errno} per i dettagli del funzionamento
+di \var{errno}).
 
 Per questo motivo tutte le implementazioni delle librerie standard mantengono
 per ogni \textit{stream} almeno due flag all'interno dell'oggetto \type{FILE},
@@ -3525,8 +4042,8 @@ sistemi più moderni.
 % TODO: mettere prototipi espliciti fseeko e ftello o menzione?
 
 
-\subsection{Input/output binario}
-\label{sec:file_binary_io}
+\subsection{Input/output non formattato}
+\label{sec:file_unformatted_io}
 
 La prima modalità di input/output non formattato ricalca quella della
 interfaccia dei file descriptor, e provvede semplicemente la scrittura e la
@@ -3538,10 +4055,10 @@ i rispettivi prototipi sono:
 \begin{funcproto}{
 \fhead{stdio.h} 
 \fdecl{size\_t fread(void *ptr, size\_t size, size\_t nmemb, FILE *stream)}
-\fdesc{Legge i dati da uno \textit{stream}.} 
+\fdesc{Legge i dati da uno \textit{stream} ad un buffer.} 
 \fdecl{size\_t fwrite(const void *ptr, size\_t size, size\_t nmemb, 
   FILE *stream)}
-\fdesc{Scrive i dati su uno \textit{stream}.} 
+\fdesc{Scrive i dati da un buffer su uno \textit{stream}.} 
 }
 
 {Le funzioni ritornano il numero di elementi letti o scritti, in caso di
@@ -3603,34 +4120,8 @@ permetta di recuperare l'informazione completa, per assicurarsi che versioni
 diverse del programma siano in grado di rileggere i dati, tenendo conto delle
 eventuali differenze.
 
-La \acr{glibc} definisce infine due ulteriori funzioni per l'I/O binario,
-\funcd{fread\_unlocked} e \funcd{fwrite\_unlocked}, che evitano il lock
-implicito dello \textit{stream} usato per dalla librerie per la gestione delle
-applicazioni \textit{multi-thread} (si veda sez.~\ref{sec:file_stream_thread}
-per i dettagli), i loro prototipi sono:
-
-\begin{funcproto}{
-\fhead{stdio.h}
-\fdecl{size\_t fread\_unlocked(void *ptr, size\_t size, size\_t
-    nmemb, FILE *stream)}
-\fdecl{size\_t fwrite\_unlocked(const void *ptr, size\_t size,
-    size\_t nmemb, FILE *stream)}
-\fdesc{Leggono o scrivono dati su uno \textit{stream} senza acquisire il lock
-  implicito sullo stesso.} 
-}
-
-{Le funzioni ritornano gli stessi valori delle precedenti \func{fread} e
-  \func{fwrite}.}
-\end{funcproto}
-
-% TODO: trattare in generale le varie *_unlocked
-
-
-\subsection{Input/output a caratteri}
-\label{sec:file_char_io}
-
-La seconda modalità di input/output è quella a caratteri, in cui si
-trasferisce un carattere alla volta.  Le funzioni per la lettura a
+La seconda modalità di input/output non formattato è quella a caratteri, in
+cui si trasferisce un carattere alla volta.  Le funzioni per la lettura a
 caratteri sono tre, \funcd{fgetc}, \funcd{getc} e \funcd{getchar}, ed i
 rispettivi prototipi sono:
 
@@ -3795,10 +4286,6 @@ ma opera esclusivamente sul buffer interno. Se si esegue una qualunque delle
 operazioni di riposizionamento (vedi sez.~\ref{sec:file_io}) i caratteri
 rimandati indietro vengono scartati.
 
-
-\subsection{Input/output di linea}
-\label{sec:file_line_io}
-
 La terza ed ultima modalità di input/output non formattato è quella di linea,
 in cui si legge o si scrive una riga alla volta. Questa è la modalità usata
 normalmente per l'I/O da terminale, ed è anche quella che presenta le
@@ -3916,14 +4403,6 @@ quello di \func{fgets} e \func{fputs}, a parte il fatto che tutto (numero di
 caratteri massimo, terminatore della stringa, \textit{newline}) è espresso in
 termini di caratteri estesi anziché di normali caratteri ASCII.
 
-Come per l'I/O binario e quello a caratteri, anche per l'I/O di linea la
-\acr{glibc} supporta una serie di altre funzioni, estensioni di tutte quelle
-illustrate finora (eccetto \func{gets} e \func{puts}), che eseguono
-esattamente le stesse operazioni delle loro equivalenti, evitando però il lock
-implicito dello \textit{stream} (vedi sez.~\ref{sec:file_stream_thread}). Come
-per le altre forma di I/O, dette funzioni hanno lo stesso nome della loro
-analoga normale, con l'aggiunta dell'estensione \code{\_unlocked}.
-
 Come abbiamo visto, le funzioni di lettura per l'input/output di linea
 previste dallo standard ANSI C presentano svariati inconvenienti. Benché
 \func{fgets} non abbia i gravissimi problemi di \func{gets}, può comunque dare
@@ -3961,10 +4440,10 @@ stringa da leggere.
 
 Essa prende come primo argomento l'indirizzo del puntatore al buffer su cui si
 vuole copiare la linea. Quest'ultimo \emph{deve} essere stato allocato in
-precedenza con una \func{malloc}, non si può cioè passare come argomento primo
+precedenza con una \func{malloc}: non si può cioè passare come argomento primo
 argomento l'indirizzo di un puntatore ad una variabile locale. Come secondo
 argomento la funzione vuole l'indirizzo della variabile contenente le
-dimensioni del buffer suddetto.
+dimensioni del suddetto buffer.
 
 Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta
 subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova
@@ -4166,9 +4645,9 @@ specificati in questo ordine:
   \label{tab:file_format_flag}
 \end{table}
 
-Dettagli ulteriori sulle varie opzioni di stampa e su tutte le casistiche
-dettagliate dei vari formati possono essere trovati nella pagina di manuale di
-\func{printf} e nella documentazione della \acr{glibc}.
+Dettagli ulteriori sulle varie opzioni di stampa e su tutte le casistiche dei
+vari formati possono essere trovati nella pagina di manuale di \func{printf} e
+nella documentazione della \acr{glibc}.
 
 \begin{table}[htb]
   \centering
@@ -4224,13 +4703,13 @@ sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf}, \funcd{vfprintf} e
   valore negativo per un errore.}  
 \end{funcproto}
 
-Con queste funzioni diventa possibile selezionare gli argomenti che si
-vogliono passare ad una funzione di stampa, passando direttamente la lista
-tramite l'argomento \param{ap}. Per poter far questo ovviamente la lista
-variabile degli argomenti dovrà essere opportunamente trattata (l'argomento è
-esaminato in sez.~\ref{sec:proc_variadic}), e dopo l'esecuzione della funzione
-l'argomento \param{ap} non sarà più utilizzabile (in generale dovrebbe essere
-eseguito un \code{va\_end(ap)} ma in Linux questo non è necessario).
+Con queste funzioni è possibile selezionare gli argomenti da passare ad una
+funzione di stampa indicando direttamente la lista tramite l'argomento
+\param{ap}. Per poter far questo ovviamente la lista variabile degli argomenti
+dovrà essere trattata come visto in sez.~\ref{sec:proc_variadic}, e dopo
+l'esecuzione della funzione l'argomento \param{ap} non sarà più utilizzabile
+(in generale dovrebbe essere eseguito un \code{va\_end(ap)} ma in Linux questo
+non è necessario).
 
 Come per \func{sprintf} anche per \func{vsprintf} esiste una analoga
 \funcd{vsnprintf} che pone un limite sul numero di caratteri che vengono
@@ -4304,8 +4783,8 @@ famiglia \func{scanf}; fra queste le tre più importanti sono \funcd{scanf},
 \end{funcproto}
 
 Le funzioni eseguono una scansione della rispettiva fonte di input cercando
-una corrispondenza di quanto letto con il formato dei dati specificato
-da \param{format}, ed effettua le relative conversioni memorizzando il
+una corrispondenza di quanto letto con il formato dei dati specificato da
+\param{format}, ed effettuano le relative conversioni memorizzando il
 risultato negli argomenti seguenti, il cui numero è variabile e dipende dal
 valore di \param{format}. Come per le analoghe funzioni di scrittura esistono
 le relative \funcm{vscanf}, \funcm{vfscanf} e \funcm{vsscanf} che usano un
@@ -4586,12 +5065,6 @@ scelta, si può forzare lo scarico dei dati sul file con la funzione
   \func{write}.}
 \end{funcproto}
 
-\noindent anche di questa funzione esiste una analoga \func{fflush\_unlocked}
-(accessibile definendo una fra \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE} o
-\macro{\_GNU\_SOURCE}) che non effettua il blocco dello \textit{stream}.
-
-% TODO aggiungere prototipo \func{fflush\_unlocked}?
-
 Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
 \textit{stream} aperti. Esistono però circostanze, ad esempio quando si vuole
 essere sicuri che sia stato eseguito tutto l'output su terminale, in cui serve
@@ -4692,15 +5165,14 @@ indolori, e quando il locking dello \textit{stream} non è necessario (come in
 tutti i programmi che non usano i \textit{thread}), tutta la procedura può
 comportare dei costi pesanti in termini di prestazioni. 
 
-Per questo motivo abbiamo visto come alle usuali funzioni di I/O non
-formattato siano associate delle versioni \code{\_unlocked} (alcune previste
-dallo stesso standard POSIX, altre aggiunte come estensioni dalla \acr{glibc})
-che possono essere usate quando il locking non serve\footnote{in certi casi
-  dette funzioni possono essere usate, visto che sono molto più efficienti,
-  anche in caso di necessità di locking, una volta che questo sia stato
-  acquisito manualmente.}  con prestazioni molto più elevate, dato che spesso
-queste versioni (come accade per \func{getc} e \func{putc}) sono realizzate
-come macro.
+Per questo motivo alle usuali funzioni di I/O non formattato sono associate
+delle ulteriori versioni, caratterizzate dall'aggiunta del suffisso
+\code{\_unlocked}, che possono essere usate quando il locking non
+serve\footnote{in certi casi dette funzioni possono essere usate, visto che
+  sono molto più efficienti, anche in caso di necessità di locking, una volta
+  che questo sia stato acquisito manualmente.}  con prestazioni molto più
+elevate, dato che spesso queste versioni (come accade per \func{getc} e
+\func{putc}) sono realizzate come macro.
 
 La sostituzione di tutte le funzioni di I/O con le relative versioni
 \code{\_unlocked} in un programma che non usa i \textit{thread} è però un
@@ -4755,6 +5227,18 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o
 
 % TODO trattare \func{clearerr\_unlocked} 
 
+Per tutte le funzioni che abbiamo trattato in
+sez.~\ref{sec:files_std_interface} che eseguono I/O sugli \textit{stream}
+esiste una versione ``\texttt{\_unlocked}'',\footnote{non ne esistono per
+  funzioni di informazione come \func{ftell} dato che queste non hanno bisogno
+  di un blocco, l'elenco completo delle funzioni ``\texttt{\_unlocked}''
+  comunque è disponibile nella pagina di manuale delle stesse, accessibile con
+  \texttt{man unlocked\_stdio}. } ma nello standard POSIX sono previste solo
+\funcm{getc\_unlocked}, \funcm{getchar\_unlocked}, \funcm{putc\_unlocked} e
+\funcm{putchar\_unlocked}, tutte le altre pur essendo state aggiunte come
+estensioni dalla \acr{glibc}, non sono standard, anche se sono presenti anche
+su altri sistemi unix; in generale comuqnue l'uso di queste funzioni è
+sconsigliato e non le tratteremo esplicitamente.
 
 
 %%% Local Variables: 
@@ -4807,18 +5291,23 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o
 % LocalWords:  FIONREAD epoll FIOQSIZE side effects SAFE BYCALLER QUERY EACCES
 % LocalWords:  EBUSY OpenBSD syncfs futimes timespec only init ESRCH kill NTPL
 % LocalWords:  ENXIO  NONBLOCK WRONLY EPERM NOATIME ETXTBSY EWOULDBLOCK PGRP SZ
-% LocalWords:  EFAULT capabilities GETPIPE SETPIPE RESOURCE NFSv
-% LocalWords:  Documentation Urlich Drepper futimesat times
-% LocalWords:  futimens fs Tread TMPFILE EDQUOT extN Minix UDF XFS
+% LocalWords:  EFAULT capabilities GETPIPE SETPIPE RESOURCE NFSv InitFile stx
+% LocalWords:  Documentation Urlich Drepper futimesat times FullWrite major
+% LocalWords:  futimens fs Tread TMPFILE EDQUOT extN Minix UDF XFS mask all'
 % LocalWords:  shmem Btrfs ubifs tmpfile fchmod fchown fsetxattr fchdir PF
-% LocalWords:  fstatfs SIGTTIN EDESTADDRREQ datagram connect seal pag
+% LocalWords:  fstatfs SIGTTIN EDESTADDRREQ datagram connect seal pag l'I INO
 % LocalWords:  dirty execveat execve scandirat statx AUTOMOUNT automount DAC
-% LocalWords:  wrapper EMPTY olddirfd oldpath newdirfd newpath capability
+% LocalWords:  wrapper EMPTY olddirfd oldpath newdirfd newpath capability ino
 % LocalWords:  SEARCH flink choot oldirfd NOREPLACE EXCHANGE WHITEOUT union
-% LocalWords:  renamat syscall whiteout overlay filesytem Live
+% LocalWords:  renamat syscall whiteout overlay filesytem Live nell' sull'
+% LocalWords:  statbuf statxbuf IFMT nlink atime mtime fexecve argv envp GET
+% LocalWords:  blocks STATS btime RESERVED ctime ATTR dev ENOSYS locks SEALS
+% LocalWords:  timestamp attributes COMPRESSED immutable NODUMP HINT hints
+% LocalWords:  dump ENCRYPTED rdev all'I dell'I uint cancellation mmap
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
 
+%  LocalWords:  mapping