Aggiornamento date copyright più TODO 5.3
[gapil.git] / fileadv.tex
index 5982d8e29ff9a69a78cc99402ef8bef44feca35d..45a5615e5b633d5e398bc3059de161c8e67a5148 100644 (file)
@@ -1,6 +1,6 @@
 %% fileadv.tex
 %%
-%% Copyright (C) 2000-2015 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -52,7 +52,7 @@ lettura o scrittura.
 La prima modalità di \textit{file locking} che è stata implementata nei
 sistemi unix-like è quella che viene usualmente chiamata \textit{advisory
   locking},\footnote{Stevens in \cite{APUE} fa riferimento a questo argomento
-  come al \textit{record locking}, dizione utilizzata anche dal manuale delle
+  come al \textit{record locking}, dizione utilizzata anche dal manuale della
   \acr{glibc}; nelle pagine di manuale si parla di \textit{discrectionary file
     lock} per \func{fcntl} e di \textit{advisory locking} per \func{flock},
   mentre questo nome viene usato da Stevens per riferirsi al \textit{file
@@ -187,11 +187,11 @@ riportate in tab.~\ref{tab:file_flock_operation}.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{LOCK\_SH} & Richiede uno \textit{shared lock} sul file.\\ 
-    \const{LOCK\_EX} & Richiede un \textit{esclusive lock} sul file.\\
-    \const{LOCK\_UN} & Rilascia il \textit{file lock}.\\
-    \const{LOCK\_NB} & Impedisce che la funzione si blocchi nella
-                       richiesta di un \textit{file lock}.\\
+    \constd{LOCK\_SH} & Richiede uno \textit{shared lock} sul file.\\ 
+    \constd{LOCK\_EX} & Richiede un \textit{esclusive lock} sul file.\\
+    \constd{LOCK\_UN} & Rilascia il \textit{file lock}.\\
+    \constd{LOCK\_NB} & Impedisce che la funzione si blocchi nella
+                        richiesta di un \textit{file lock}.\\
     \hline    
   \end{tabular}
   \caption{Valori dell'argomento \param{operation} di \func{flock}.}
@@ -237,12 +237,12 @@ diversi che aprono lo stesso file.
 
 In particolare, come accennato in fig.~\ref{fig:file_flock_struct}, i
 \textit{file lock} sono mantenuti in una \textit{linked list} di strutture
-\kstruct{file\_lock}. La lista è referenziata dall'indirizzo di partenza
+\kstructd{file\_lock}. La lista è referenziata dall'indirizzo di partenza
 mantenuto dal campo \var{i\_flock} della struttura \kstruct{inode} (per le
 definizioni esatte si faccia riferimento al file \file{include/linux/fs.h} nei
 sorgenti del kernel).  Un bit del campo \var{fl\_flags} di specifica se si
-tratta di un lock in semantica BSD (\const{FL\_FLOCK}) o POSIX
-(\const{FL\_POSIX}) o un \textit{file lease} (\const{FL\_LEASE}, vedi
+tratta di un lock in semantica BSD (\constd{FL\_FLOCK}) o POSIX
+(\constd{FL\_POSIX}) o un \textit{file lease} (\constd{FL\_LEASE}, vedi
 sez.~\ref{sec:file_asyncronous_lease}).
 
 \begin{figure}[!htb]
@@ -400,9 +400,9 @@ viene usato solo in caso di lettura, quando si chiama \func{fcntl} con
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{F\_RDLCK} & Richiede un blocco condiviso (\textit{read lock}).\\
-    \const{F\_WRLCK} & Richiede un blocco esclusivo (\textit{write lock}).\\
-    \const{F\_UNLCK} & Richiede l'eliminazione di un \textit{file lock}.\\
+    \constd{F\_RDLCK} & Richiede un blocco condiviso (\textit{read lock}).\\
+    \constd{F\_WRLCK} & Richiede un blocco esclusivo (\textit{write lock}).\\
+    \constd{F\_UNLCK} & Richiede l'eliminazione di un \textit{file lock}.\\
     \hline    
   \end{tabular}
   \caption{Valori possibili per il campo \var{l\_type} di \struct{flock}.}
@@ -415,18 +415,18 @@ effettivamente svolta dalla funzione è stabilita dal valore dall'argomento
 specifica l'azione da compiere; i valori utilizzabili relativi al \textit{file
   locking} sono tre:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{F\_GETLK}] verifica se il \textit{file lock} specificato dalla
+\item[\constd{F\_GETLK}] verifica se il \textit{file lock} specificato dalla
   struttura puntata da \param{lock} può essere acquisito: in caso negativo
   sovrascrive la struttura \param{flock} con i valori relativi al blocco già
   esistente che ne blocca l'acquisizione, altrimenti si limita a impostarne il
   campo \var{l\_type} con il valore \const{F\_UNLCK}.
-\item[\const{F\_SETLK}] se il campo \var{l\_type} della struttura puntata da
+\item[\constd{F\_SETLK}] se il campo \var{l\_type} della struttura puntata da
   \param{lock} è \const{F\_RDLCK} o \const{F\_WRLCK} richiede il
   corrispondente \textit{file lock}, se è \const{F\_UNLCK} lo rilascia; nel
   caso la richiesta non possa essere soddisfatta a causa di un blocco
   preesistente la funzione ritorna immediatamente con un errore di
   \errcode{EACCES} o di \errcode{EAGAIN}.
-\item[\const{F\_SETLKW}] è identica a \const{F\_SETLK}, ma se la richiesta di
+\item[\constd{F\_SETLKW}] è identica a \const{F\_SETLK}, ma se la richiesta di
   non può essere soddisfatta per la presenza di un altro blocco, mette il
   processo in stato di attesa fintanto che il blocco precedente non viene
   rilasciato; se l'attesa viene interrotta da un segnale la funzione ritorna
@@ -481,7 +481,7 @@ sez.~\ref{sec:file_flock}) esaminiamo più in dettaglio come viene gestito dal
 kernel. Lo schema delle strutture utilizzate è riportato in
 fig.~\ref{fig:file_posix_lock}; come si vede esso è molto simile all'analogo
 di fig.~\ref{fig:file_flock_struct}. In questo caso nella figura si sono
-evidenziati solo i campi di \kstruct{file\_lock} significativi per la
+evidenziati solo i campi di \kstructd{file\_lock} significativi per la
 semantica POSIX, in particolare adesso ciascuna struttura contiene, oltre al
 \ids{PID} del processo in \var{fl\_pid}, la sezione di file che viene bloccata
 grazie ai campi \var{fl\_start} e \var{fl\_end}.  La struttura è comunque la
@@ -553,7 +553,7 @@ regioni richieste e del tipo di operazione richiesta.
 Il comportamento seguito in questo caso è che la funzione ha successo ed
 esegue l'operazione richiesta sulla regione indicata; è compito del kernel
 preoccuparsi di accorpare o dividere le voci nella lista dei \textit{file
-  lock} per far si che le regioni bloccate da essa risultanti siano coerenti
+  lock} per far sì che le regioni bloccate da essa risultanti siano coerenti
 con quanto necessario a soddisfare l'operazione richiesta.
 
 \begin{figure}[!htbp]
@@ -753,7 +753,7 @@ prototipo è:
   \item[\errcode{EINVAL}] si è usato un valore non valido per \param{cmd}.
   \end{errlist}
   ed inoltre \errcode{EDEADLK} e \errcode{ENOLCK} con lo stesso significato
-  che hanno con \funcd{fcntl}.
+  che hanno con \func{fcntl}.
 }
 \end{funcproto}
   
@@ -779,17 +779,17 @@ dell'argomento \param{cmd}, che specifica quale azione eseguire, i soli valori
 consentiti sono i seguenti:
 
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{F\_LOCK}] Richiede un \textit{lock} esclusivo sul file, e blocca
+\item[\constd{F\_LOCK}] Richiede un \textit{lock} esclusivo sul file, e blocca
   il processo chiamante se, anche parzialmente, la sezione indicata si
   sovrappone ad una che è già stata bloccata da un altro processo; in caso di
   sovrapposizione con un altro blocco già ottenuto le sezioni vengono unite.
-\item[\const{F\_TLOCK}] Richiede un \textit{exclusive lock}, in maniera
+\item[\constd{F\_TLOCK}] Richiede un \textit{exclusive lock}, in maniera
   identica a \const{F\_LOCK}, ma in caso di indisponibilità non blocca il
   processo restituendo un errore di \errval{EAGAIN}.
-\item[\const{F\_ULOCK}] Rilascia il blocco sulla sezione indicata, questo può
+\item[\constd{F\_ULOCK}] Rilascia il blocco sulla sezione indicata, questo può
   anche causare la suddivisione di una sezione bloccata in precedenza nelle
   due parti eccedenti nel caso si sia indicato un intervallo più limitato.
-\item[\const{F\_TEST}] Controlla la presenza di un blocco sulla sezione di
+\item[\constd{F\_TEST}] Controlla la presenza di un blocco sulla sezione di
   file indicata, \func{lockf} ritorna $0$ se la sezione è libera o bloccata
   dal processo stesso, o $-1$ se è bloccata da un altro processo, nel qual
   caso \var{errno} assume il valore \errval{EAGAIN} (ma su alcuni sistemi può
@@ -912,6 +912,9 @@ può presentare anche con l'uso di file mappati in memoria; pertanto allo stato
 attuale delle cose è sconsigliabile fare affidamento sul \textit{mandatory
   locking}.
 
+% TODO il supporto è stato reso opzionale nel 4.5, verrà eliminato nel futuro
+% (vedi http://lwn.net/Articles/667210/)
+
 \itindend{file~locking}
 
 \itindend{mandatory~locking}
@@ -935,16 +938,16 @@ I/O.
 \label{sec:file_noblocking}
 
 Abbiamo visto in sez.~\ref{sec:sig_gen_beha}, affrontando la suddivisione fra
-\textit{fast} e \textit{slow} \textit{system call},\index{system~call~lente}
-che in certi casi le funzioni di I/O eseguite su un file descriptor possono
-bloccarsi indefinitamente. Questo non avviene mai per i file normali, per i
-quali le funzioni di lettura e scrittura ritornano sempre subito, ma può
-avvenire per alcuni file di dispositivo, come ad esempio una seriale o un
-terminale, o con l'uso di file descriptor collegati a meccanismi di
-intercomunicazione come le \textit{pipe} (vedi sez.~\ref{sec:ipc_unix}) ed i
-socket (vedi sez.~\ref{sec:sock_socket_def}). In casi come questi ad esempio
-una operazione di lettura potrebbe bloccarsi se non ci sono dati disponibili
-sul descrittore su cui la si sta effettuando.
+\textit{fast} e \textit{slow} \textit{system call}, che in certi casi le
+funzioni di I/O eseguite su un file descriptor possono bloccarsi
+indefinitamente. Questo non avviene mai per i file normali, per i quali le
+funzioni di lettura e scrittura ritornano sempre subito, ma può avvenire per
+alcuni file di dispositivo, come ad esempio una seriale o un terminale, o con
+l'uso di file descriptor collegati a meccanismi di intercomunicazione come le
+\textit{pipe} (vedi sez.~\ref{sec:ipc_unix}) ed i socket (vedi
+sez.~\ref{sec:sock_socket_def}). In casi come questi ad esempio una operazione
+di lettura potrebbe bloccarsi se non ci sono dati disponibili sul descrittore
+su cui la si sta effettuando.
 
 Questo comportamento è alla radice di una delle problematiche più comuni che
 ci si trova ad affrontare nella gestione delle operazioni di I/O: la necessità
@@ -965,6 +968,7 @@ dell'operazione bloccata dipende da quanto si otterrebbe dal file descriptor
 \textit{deadlock}.
 
 \itindbeg{polling}
+
 Abbiamo già accennato in sez.~\ref{sec:file_open_close} che è possibile
 prevenire questo tipo di comportamento delle funzioni di I/O aprendo un file
 in \textsl{modalità non-bloccante}, attraverso l'uso del flag
@@ -977,6 +981,7 @@ viene garantito. Ovviamente questa tecnica, detta \textit{polling}, è
 estremamente inefficiente: si tiene costantemente impiegata la CPU solo per
 eseguire in continuazione delle \textit{system call} che nella gran parte dei
 casi falliranno.
+
 \itindend{polling}
 
 É appunto per superare questo problema è stato introdotto il concetto di
@@ -1005,8 +1010,8 @@ BSD4.2 ed è stata standardizzata in BSD4.4, in seguito è stata portata su
 tutti i sistemi che supportano i socket, compreso le varianti di System V ed
 inserita in POSIX.1-2001; il suo prototipo è:\footnote{l'header
   \texttt{sys/select.h} è stato introdotto con POSIX.1-2001, è ed presente con
-  le \acr{glibc} a partire dalla versione 2.0, in precedenza, con le
-  \acr{libc4} e le \acr{libc5}, occorreva includere \texttt{sys/time.h},
+  la \acr{glibc} a partire dalla versione 2.0, in precedenza, con le
+  \acr{libc4} e \acr{libc5}, occorreva includere \texttt{sys/time.h},
   \texttt{sys/types.h} e \texttt{unistd.h}.}
 
 \begin{funcproto}{
@@ -1039,7 +1044,7 @@ degli insiemi specificati (\param{readfds}, \param{writefds} e
 
 Per specificare quali file descriptor si intende selezionare la funzione usa
 un particolare oggetto, il \textit{file descriptor set}, identificato dal tipo
-\type{fd\_set}, che serve ad identificare un insieme di file descriptor, in
+\typed{fd\_set}, che serve ad identificare un insieme di file descriptor, in
 maniera analoga a come un \textit{signal set} (vedi sez.~\ref{sec:sig_sigset})
 identifica un insieme di segnali. Per la manipolazione di questi \textit{file
   descriptor set} si possono usare delle opportune macro di preprocessore:
@@ -1048,20 +1053,20 @@ identifica un insieme di segnali. Per la manipolazione di questi \textit{file
 \vspace{3pt}
 \begin{funcbox}{
 \fhead{sys/select.h}
-\fdecl{void \macro{FD\_ZERO}(fd\_set *set)}
+\fdecl{void \macrod{FD\_ZERO}(fd\_set *set)}
 \fdesc{Inizializza l'insieme (vuoto).} 
-\fdecl{void \macro{FD\_SET}(int fd, fd\_set *set)}
+\fdecl{void \macrod{FD\_SET}(int fd, fd\_set *set)}
 \fdesc{Inserisce il file descriptor \param{fd} nell'insieme.} 
-\fdecl{void \macro{FD\_CLR}(int fd, fd\_set *set)}
+\fdecl{void \macrod{FD\_CLR}(int fd, fd\_set *set)}
 \fdesc{Rimuove il file descriptor \param{fd} dall'insieme.} 
-\fdecl{int \macro{FD\_ISSET}(int fd, fd\_set *set)}
+\fdecl{int \macrod{FD\_ISSET}(int fd, fd\_set *set)}
 \fdesc{Controlla se il file descriptor \param{fd} è nell'insieme.} 
 }
 \end{funcbox}}
 
 
 In genere un \textit{file descriptor set} può contenere fino ad un massimo di
-\const{FD\_SETSIZE} file descriptor.  Questo valore in origine corrispondeva
+\macrod{FD\_SETSIZE} file descriptor.  Questo valore in origine corrispondeva
 al limite per il numero massimo di file aperti (ad esempio in Linux, fino alla
 serie 2.0.x, c'era un limite di 256 file per processo), ma da quando, nelle
 versioni più recenti del kernel, questo limite è stato rimosso, esso indica le
@@ -1073,7 +1078,7 @@ Si tenga presente che i \textit{file descriptor set} devono sempre essere
 inizializzati con \macro{FD\_ZERO}; passare a \func{select} un valore non
 inizializzato può dar luogo a comportamenti non prevedibili. Allo stesso modo
 usare \macro{FD\_SET} o \macro{FD\_CLR} con un file descriptor il cui valore
-eccede \const{FD\_SETSIZE} può dare luogo ad un comportamento indefinito.
+eccede \macro{FD\_SETSIZE} può dare luogo ad un comportamento indefinito.
 
 La funzione richiede di specificare tre insiemi distinti di file descriptor;
 il primo, \param{readfds}, verrà osservato per rilevare la disponibilità di
@@ -1085,7 +1090,7 @@ il terzo, \param{exceptfds}, per verificare l'esistenza di eccezioni come i
 dati urgenti su un socket, (vedi sez.~\ref{sec:TCP_urgent_data}).
 
 Dato che in genere non si tengono mai sotto controllo fino a
-\const{FD\_SETSIZE} file contemporaneamente, la funzione richiede di
+\macro{FD\_SETSIZE} file contemporaneamente, la funzione richiede di
 specificare qual è il valore più alto fra i file descriptor indicati nei tre
 insiemi precedenti. Questo viene fatto per efficienza, per evitare di passare
 e far controllare al kernel una quantità di memoria superiore a quella
@@ -1132,7 +1137,6 @@ riaperto. Lo standard non prevede niente al riguardo e non si deve dare per
 assunto nessuno dei due comportamenti se si vogliono scrivere programmi
 portabili.
 
-
 \itindend{file~descriptor~set}
 
 Una volta ritornata la funzione, si potrà controllare quali sono i file
@@ -1158,7 +1162,7 @@ scritti per altri sistemi che non dispongono di questa caratteristica e
 ricalcolano \param{timeout} tutte le volte. In genere questa caratteristica è
 disponibile nei sistemi che derivano da System V e non è disponibile per
 quelli che derivano da BSD; lo standard POSIX.1-2001 non permette questo
-comportamento e per questo motivo le \acr{glibc} nascondono il comportamento
+comportamento e per questo motivo la \acr{glibc} nasconde il comportamento
 passando alla \textit{system call} una copia dell'argomento \param{timeout}.
 
 Uno dei problemi che si presentano con l'uso di \func{select} è che il suo
@@ -1180,12 +1184,12 @@ Lo standard POSIX è rimasto a lungo senza primitive per l'\textit{I/O
   multiplexing}, introdotto solo con le ultime revisioni dello standard (POSIX
 1003.1g-2000 e POSIX 1003.1-2001). La scelta è stata quella di seguire
 l'interfaccia creata da BSD, ma prevede che tutte le funzioni ad esso relative
-vengano dichiarate nell'header \headfile{sys/select.h}, che sostituisce i
+vengano dichiarate nell'header \headfiled{sys/select.h}, che sostituisce i
 precedenti, ed inoltre aggiunge a \func{select} una nuova funzione
 \funcd{pselect},\footnote{il supporto per lo standard POSIX 1003.1-2001, ed
-  l'header \headfile{sys/select.h}, compaiono in Linux a partire dalle
+  l'header \headfile{sys/select.h}, compaiono in Linux a partire dalla
   \acr{glibc} 2.1. Le \acr{libc4} e \acr{libc5} non contengono questo header,
-  le \acr{glibc} 2.0 contengono una definizione sbagliata di \func{psignal},
+  la \acr{glibc} 2.0 contiene una definizione sbagliata di \func{psignal},
   senza l'argomento \param{sigmask}, la definizione corretta è presente dalle
   \acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle
   \acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore
@@ -1217,7 +1221,7 @@ La funzione è sostanzialmente identica a \func{select}, solo che usa una
 struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) per
 indicare con maggiore precisione il timeout e non ne aggiorna il valore in
 caso di interruzione. In realtà anche in questo caso la \textit{system call}
-di Linux aggiorna il valore al tempo rimanente, ma la funzione fornita dalle
+di Linux aggiorna il valore al tempo rimanente, ma la funzione fornita dalla
 \acr{glibc} modifica questo comportamento passando alla \textit{system call}
 una variabile locale, in modo da mantenere l'aderenza allo standard POSIX che
 richiede che il valore di \param{timeout} non sia modificato. 
@@ -1256,7 +1260,7 @@ Per questo è stata introdotta \func{pselect} che attraverso l'argomento
 \param{sigmask} permette di riabilitare la ricezione il segnale
 contestualmente all'esecuzione della funzione,\footnote{in Linux però, fino al
   kernel 2.6.16, non era presente la relativa \textit{system call}, e la
-  funzione era implementata nelle \acr{glibc} attraverso \func{select} (vedi
+  funzione era implementata nella \acr{glibc} attraverso \func{select} (vedi
   \texttt{man select\_tut}) per cui la possibilità di \textit{race condition}
   permaneva; in tale situazione si può ricorrere ad una soluzione alternativa,
   chiamata \itindex{self-pipe~trick} \textit{self-pipe trick}, che consiste
@@ -1283,7 +1287,7 @@ interfaccia completamente diversa, basata sulla funzione di sistema
   introdotta in Linux come \textit{system call} a partire dal kernel 2.1.23 ed
   inserita nelle \acr{libc} 5.4.28, originariamente l'argomento \param{nfds}
   era di tipo \ctyp{unsigned int}, la funzione è stata inserita nello standard
-  POSIX.1-2001 in cui è stato introdotto il tipo nativo \type{nfds\_t}.} il
+  POSIX.1-2001 in cui è stato introdotto il tipo nativo \typed{nfds\_t}.} il
 cui prototipo è:
 
 \begin{funcproto}{
@@ -1359,22 +1363,22 @@ errore.
     \textbf{Flag}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{POLLIN}    & È possibile la lettura.\\
-    \const{POLLRDNORM}& Sono disponibili in lettura dati normali.\\ 
-    \const{POLLRDBAND}& Sono disponibili in lettura dati prioritari.\\
-    \const{POLLPRI}   & È possibile la lettura di dati urgenti.\\ 
+    \constd{POLLIN}    & È possibile la lettura.\\
+    \constd{POLLRDNORM}& Sono disponibili in lettura dati normali.\\ 
+    \constd{POLLRDBAND}& Sono disponibili in lettura dati prioritari.\\
+    \constd{POLLPRI}   & È possibile la lettura di dati urgenti.\\ 
     \hline
-    \const{POLLOUT}   & È possibile la scrittura immediata.\\
-    \const{POLLWRNORM}& È possibile la scrittura di dati normali.\\ 
-    \const{POLLWRBAND}& È possibile la scrittura di dati prioritari.\\
+    \constd{POLLOUT}   & È possibile la scrittura immediata.\\
+    \constd{POLLWRNORM}& È possibile la scrittura di dati normali.\\ 
+    \constd{POLLWRBAND}& È possibile la scrittura di dati prioritari.\\
     \hline
-    \const{POLLERR}   & C'è una condizione di errore.\\
-    \const{POLLHUP}   & Si è verificato un hung-up.\\
-    \const{POLLRDHUP} & Si è avuta una \textsl{half-close} su un
+    \constd{POLLERR}   & C'è una condizione di errore.\\
+    \constd{POLLHUP}   & Si è verificato un hung-up.\\
+    \constd{POLLRDHUP} & Si è avuta una \textsl{half-close} su un
                         socket.\footnotemark\\ 
-    \const{POLLNVAL}  & Il file descriptor non è aperto.\\
+    \constd{POLLNVAL}  & Il file descriptor non è aperto.\\
     \hline
-    \const{POLLMSG}   & Definito per compatibilità con SysV.\\
+    \constd{POLLMSG}   & Definito per compatibilità con SysV.\\
     \hline    
   \end{tabular}
   \caption{Costanti per l'identificazione dei vari bit dei campi
@@ -1423,20 +1427,19 @@ solito tramite \var{errno}.
 L'uso di \func{poll} consente di superare alcuni dei problemi illustrati in
 precedenza per \func{select}; anzitutto, dato che in questo caso si usa un
 vettore di strutture \struct{pollfd} di dimensione arbitraria, non esiste il
-limite introdotto dalle dimensioni massime di un \itindex{file~descriptor~set}
-\textit{file descriptor set} e la dimensione dei dati passati al kernel
-dipende solo dal numero dei file descriptor che si vogliono controllare, non
-dal loro valore. Infatti, anche se usando dei bit un \textit{file descriptor
-  set} può essere più efficiente di un vettore di strutture \struct{pollfd},
-qualora si debba osservare un solo file descriptor con un valore molto alto ci
-si troverà ad utilizzare inutilmente un maggiore quantitativo di memoria.
-
-Inoltre con \func{select} lo stesso \itindex{file~descriptor~set} \textit{file
-  descriptor set} è usato sia in ingresso che in uscita, e questo significa
-che tutte le volte che si vuole ripetere l'operazione occorre reinizializzarlo
-da capo. Questa operazione, che può essere molto onerosa se i file descriptor
-da tenere sotto osservazione sono molti, non è invece necessaria con
-\func{poll}.
+limite introdotto dalle dimensioni massime di un \textit{file descriptor set}
+e la dimensione dei dati passati al kernel dipende solo dal numero dei file
+descriptor che si vogliono controllare, non dal loro valore. Infatti, anche se
+usando dei bit un \textit{file descriptor set} può essere più efficiente di un
+vettore di strutture \struct{pollfd}, qualora si debba osservare un solo file
+descriptor con un valore molto alto ci si troverà ad utilizzare inutilmente un
+maggiore quantitativo di memoria.
+
+Inoltre con \func{select} lo stesso \textit{file descriptor set} è usato sia
+in ingresso che in uscita, e questo significa che tutte le volte che si vuole
+ripetere l'operazione occorre reinizializzarlo da capo. Questa operazione, che
+può essere molto onerosa se i file descriptor da tenere sotto osservazione
+sono molti, non è invece necessaria con \func{poll}.
 
 Abbiamo visto in sez.~\ref{sec:file_select} come lo standard POSIX preveda una
 variante di \func{select} che consente di gestire correttamente la ricezione
@@ -1487,7 +1490,7 @@ puntatore ad una struttura \struct{timespec}, gli altri argomenti comuni con
 risultati illustrati in precedenza. Come nel caso di \func{pselect} la
 \textit{system call} che implementa \func{ppoll} restituisce, se la funzione
 viene interrotta da un segnale, il tempo mancante in \param{timeout}, e come
-per \func{pselect} la funzione di libreria fornita dalle \acr{glibc} maschera
+per \func{pselect} la funzione di libreria fornita dalla \acr{glibc} maschera
 questo comportamento non modificando mai il valore di \param{timeout} anche se
 in questo caso non esiste nessuno standard che richieda questo comportamento.
 
@@ -1505,11 +1508,11 @@ Nonostante \func{poll} presenti alcuni vantaggi rispetto a \func{select},
 anche questa funzione non è molto efficiente quando deve essere utilizzata con
 un gran numero di file descriptor,\footnote{in casi del genere \func{select}
   viene scartata a priori, perché può avvenire che il numero di file
-  descriptor ecceda le dimensioni massime di un \itindex{file~descriptor~set}
-  \textit{file descriptor set}.} in particolare nel caso in cui solo pochi di
-questi diventano attivi. Il problema in questo caso è che il tempo impiegato
-da \func{poll} a trasferire i dati da e verso il kernel è proporzionale al
-numero di file descriptor osservati, non a quelli che presentano attività.
+  descriptor ecceda le dimensioni massime di un \textit{file descriptor set}.}
+in particolare nel caso in cui solo pochi di questi diventano attivi. Il
+problema in questo caso è che il tempo impiegato da \func{poll} a trasferire i
+dati da e verso il kernel è proporzionale al numero di file descriptor
+osservati, non a quelli che presentano attività.
 
 Quando ci sono decine di migliaia di file descriptor osservati e migliaia di
 eventi al secondo (il caso classico è quello di un server web di un sito con
@@ -1559,13 +1562,13 @@ Nel caso di Linux al momento la sola interfaccia che fornisce questo tipo di
 servizio è chiamata \textit{epoll},\footnote{l'interfaccia è stata creata da
   Davide Libenzi, ed è stata introdotta per la prima volta nel kernel 2.5.44,
   ma la sua forma definitiva è stata raggiunta nel kernel 2.5.66, il supporto
-  è stato aggiunto nelle \acr{glibc} a partire dalla versione 2.3.2.} anche se
+  è stato aggiunto nella \acr{glibc} a partire dalla versione 2.3.2.} anche se
 sono state in discussione altre interfacce con le quali effettuare lo stesso
 tipo di operazioni; \textit{epoll} è in grado di operare sia in modalità
 \textit{level triggered} che \textit{edge triggered}.
 
-La prima versione di \textit{epoll} prevedeva l'apertura di uno speciale file
-di dispositivo, \texttt{/dev/epoll}, per ottenere un file descriptor da
+La prima versione di \textit{epoll} prevedeva l'uso di uno speciale file di
+dispositivo, \texttt{/dev/epoll}, per ottenere un file descriptor da
 utilizzare con le funzioni dell'interfaccia ma poi si è passati all'uso di
 apposite \textit{system call}.  Il primo passo per usare l'interfaccia di
 \textit{epoll} è pertanto quello ottenere detto file descriptor chiamando una
@@ -1587,7 +1590,7 @@ i cui prototipi sono:
     positivo o non valido per \param{flags}.
   \item[\errcode{EMFILE}] si è raggiunto il limite sul numero massimo di
     istanze di \textit{epoll} per utente stabilito da
-    \sysctlfile{fs/epoll/max\_user\_instances}.
+    \sysctlfiled{fs/epoll/max\_user\_instances}.
   \item[\errcode{ENFILE}] si è raggiunto il massimo di file descriptor aperti
     nel sistema.
   \item[\errcode{ENOMEM}] non c'è sufficiente memoria nel kernel per creare
@@ -1620,7 +1623,7 @@ La seconda versione della funzione, \func{epoll\_create1} è stata introdotta
 come estensione della precedente (è disponibile solo a partire dal kernel
 2.6.27) per poter passare dei flag di controllo come maschera binaria in fase
 di creazione del file descriptor. Al momento l'unico valore legale
-per \param{flags} (a parte lo zero) è \const{EPOLL\_CLOEXEC}, che consente di
+per \param{flags} (a parte lo zero) è \constd{EPOLL\_CLOEXEC}, che consente di
 impostare in maniera atomica sul file descriptor il flag di
 \textit{close-on-exec} (si è trattato il significato di \const{O\_CLOEXEC} in
 sez.~\ref{sec:file_open_close}), senza che sia necessaria una successiva
@@ -1654,7 +1657,7 @@ dell'interfaccia, \funcd{epoll\_ctl}, il cui prototipo è:
     l'operazione richiesta.
   \item[\errcode{ENOSPC}] si è raggiunto il limite massimo di registrazioni
     per utente di file descriptor da osservare imposto da
-    \sysctlfile{fs/epoll/max\_user\_watches}.
+    \sysctlfiled{fs/epoll/max\_user\_watches}.
   \item[\errcode{EPERM}] il file associato a \param{fd} non supporta l'uso di
     \textit{epoll}.
   \end{errlist}
@@ -1683,16 +1686,16 @@ delle operazioni cui fanno riferimento.
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{EPOLL\_CTL\_ADD}& Aggiunge un nuovo file descriptor da osservare
-                             \param{fd} alla lista dei file descriptor
-                             controllati tramite \param{epfd}, in
-                             \param{event} devono essere specificate le
-                             modalità di osservazione.\\
-    \const{EPOLL\_CTL\_MOD}& Modifica le modalità di osservazione del file
-                             descriptor \param{fd} secondo il contenuto di
-                             \param{event}.\\
-    \const{EPOLL\_CTL\_DEL}& Rimuove il file descriptor \param{fd} dalla lista
-                             dei file controllati tramite \param{epfd}.\\
+    \constd{EPOLL\_CTL\_ADD}& Aggiunge un nuovo file descriptor da osservare
+                              \param{fd} alla lista dei file descriptor
+                              controllati tramite \param{epfd}, in
+                              \param{event} devono essere specificate le
+                              modalità di osservazione.\\
+    \constd{EPOLL\_CTL\_MOD}& Modifica le modalità di osservazione del file
+                              descriptor \param{fd} secondo il contenuto di
+                              \param{event}.\\
+    \constd{EPOLL\_CTL\_DEL}& Rimuove il file descriptor \param{fd} dalla lista
+                              dei file controllati tramite \param{epfd}.\\
    \hline    
   \end{tabular}
   \caption{Valori dell'argomento \param{op} che consentono di scegliere quale
@@ -1790,34 +1793,34 @@ modificano le modalità di notifica.
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{EPOLLIN}     & Il file è pronto per le operazioni di lettura
+    \constd{EPOLLIN}     & Il file è pronto per le operazioni di lettura
                           (analogo di \const{POLLIN}).\\
-    \const{EPOLLOUT}    & Il file è pronto per le operazioni di scrittura
+    \constd{EPOLLOUT}    & Il file è pronto per le operazioni di scrittura
                           (analogo di \const{POLLOUT}).\\
-    \const{EPOLLRDHUP}  & L'altro capo di un socket di tipo
+    \constd{EPOLLRDHUP}  & L'altro capo di un socket di tipo
                           \const{SOCK\_STREAM} (vedi sez.~\ref{sec:sock_type})
                           ha chiuso la connessione o il capo in scrittura
                           della stessa (vedi
                           sez.~\ref{sec:TCP_shutdown}).\footnotemark\\
-    \const{EPOLLPRI}    & Ci sono dati urgenti disponibili in lettura (analogo
+    \constd{EPOLLPRI}    & Ci sono dati urgenti disponibili in lettura (analogo
                           di \const{POLLPRI}); questa condizione viene comunque
                           riportata in uscita, e non è necessaria impostarla
                           in ingresso.\\ 
     \hline
-    \const{EPOLLERR}    & Si è verificata una condizione di errore 
+    \constd{EPOLLERR}    & Si è verificata una condizione di errore 
                           (analogo di \const{POLLERR}); questa condizione
                           viene comunque riportata in uscita, e non è
                           necessaria impostarla in ingresso.\\
-    \const{EPOLLHUP}    & Si è verificata una condizione di hung-up; questa
+    \constd{EPOLLHUP}    & Si è verificata una condizione di hung-up; questa
                           condizione viene comunque riportata in uscita, e non
                           è necessaria impostarla in ingresso.\\
     \hline
-    \const{EPOLLET}     & Imposta la notifica in modalità \textit{edge
+    \constd{EPOLLET}     & Imposta la notifica in modalità \textit{edge
                             triggered} per il file descriptor associato.\\ 
-    \const{EPOLLONESHOT}& Imposta la modalità \textit{one-shot} per il file
+    \constd{EPOLLONESHOT}& Imposta la modalità \textit{one-shot} per il file
                           descriptor associato (questa modalità è disponibile
                           solo a partire dal kernel 2.6.2).\\
-    \const{EPOLLWAKEUP} & Attiva la prevenzione della sospensione del sistema
+    \constd{EPOLLWAKEUP} & Attiva la prevenzione della sospensione del sistema
                           se il file descriptor che si è marcato con esso
                           diventa pronto (aggiunto a partire dal kernel 3.5),
                           può essere impostato solo dall'amministratore (o da
@@ -1834,7 +1837,10 @@ modificano le modalità di notifica.
   ed è utile per riconoscere la chiusura di una connessione dall'altro capo di
   un socket quando si lavora in modalità \textit{edge triggered}.}
 
-Il secondo campo, \var{data}, è una \direct{union} che serve a identificare il
+% TODO aggiunto con il kernel 4.5  EPOLLEXCLUSIVE, vedi
+% http://lwn.net/Articles/633422/#excl 
+
+Il secondo campo, \var{data}, è una \dirct{union} che serve a identificare il
 file descriptor a cui si intende fare riferimento, ed in astratto può
 contenere un valore qualsiasi (specificabile in diverse forme) che ne permetta
 una indicazione univoca. Il modo più comune di usarlo però è quello in cui si
@@ -1974,12 +1980,12 @@ funzione di sistema si chiama \funcd{epoll\_pwait}\footnote{la funzione è
 
 {La funzione ritorna il numero di file descriptor pronti in caso di successo e
   $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori già
-  visti con \funcd{epoll\_wait}.
+  visti con \func{epoll\_wait}.
 
 }  
 \end{funcproto}
 
-La funzione è del tutto analoga \funcd{epoll\_wait}, soltanto che alla sua
+La funzione è del tutto analoga \func{epoll\_wait}, soltanto che alla sua
 uscita viene ripristinata la maschera di segnali originale, sostituita durante
 l'esecuzione da quella impostata con l'argomento \param{sigmask}; in sostanza
 la chiamata a questa funzione è equivalente al seguente codice, eseguito però
@@ -2005,7 +2011,7 @@ notifiche di eventi tramite i segnali, presente da sempre nei sistemi
 unix-like, porti a notevoli problemi nell'interazione con le funzioni per
 l'\textit{I/O multiplexing}, tanto che per evitare possibili \textit{race
   condition} sono state introdotte estensioni dello standard POSIX e funzioni
-apposite come \func{pselect}, \func{ppoll} e \funcd{epoll\_pwait}.
+apposite come \func{pselect}, \func{ppoll} e \func{epoll\_pwait}.
 
 Benché i segnali siano il meccanismo più usato per effettuare notifiche ai
 processi, la loro interfaccia di programmazione, che comporta l'esecuzione di
@@ -2027,8 +2033,8 @@ gestire, quando si deve tener conto di entrambi i tipi di eventi, le
 interruzioni delle funzioni di attesa sincrone, ed evitare possibili
 \textit{race conditions}. In sostanza se non ci fossero i segnali non ci
 sarebbe da preoccuparsi, fintanto che si effettuano operazioni all'interno di
-un processo, della non atomicità delle \index{system~call~lente}
-\textit{system call} lente che vengono interrotte e devono essere riavviate.
+un processo, della non atomicità delle \textit{system call} lente che vengono
+interrotte e devono essere riavviate.
 
 Abbiamo visto però in sez.~\ref{sec:sig_real_time} che insieme ai segnali
 \textit{real-time} sono state introdotte anche delle interfacce di gestione
@@ -2056,21 +2062,21 @@ gestore in occasione dell'arrivo di un segnale, e rilevarne l'avvenuta
 ricezione leggendone la notifica tramite l'uso di uno speciale file
 descriptor. Trattandosi di un file descriptor questo potrà essere tenuto sotto
 osservazione con le ordinarie funzioni dell'\textit{I/O multiplexing} (vale a
-dire con le solite \func{select}, \func{poll} e \funcd{epoll\_wait}) allo
+dire con le solite \func{select}, \func{poll} e \func{epoll\_wait}) allo
 stesso modo di quelli associati a file o socket, per cui alla fine si potrà
 attendere in contemporanea sia l'arrivo del segnale che la disponibilità di
 accesso ai dati relativi a questi ultimi.
 
 La funzione di sistema che permette di abilitare la ricezione dei segnali
 tramite file descriptor è \funcd{signalfd},\footnote{in realtà quella
-  riportata è l'interfaccia alla funzione fornita dalle \acr{glibc}, esistono
+  riportata è l'interfaccia alla funzione fornita dalla \acr{glibc}, esistono
   infatti due versioni diverse della \textit{system call}; una prima versione,
-  \func{signalfd}, introdotta nel kernel 2.6.22 e disponibile con le
+  \func{signalfd}, introdotta nel kernel 2.6.22 e disponibile con la
   \acr{glibc} 2.8 che non supporta l'argomento \texttt{flags}, ed una seconda
   versione, \funcm{signalfd4}, introdotta con il kernel 2.6.27 e che è quella
-  che viene sempre usata a partire dalle \acr{glibc} 2.9, che prende un
+  che viene sempre usata a partire dalla \acr{glibc} 2.9, che prende un
   argomento aggiuntivo \code{size\_t sizemask} che indica la dimensione della
-  maschera dei segnali, il cui valore viene impostato automaticamente dalle
+  maschera dei segnali, il cui valore viene impostato automaticamente dalla
   \acr{glibc}.}  il cui prototipo è:
 
 \begin{funcproto}{
@@ -2134,9 +2140,9 @@ tab.~\ref{tab:signalfd_flags}.
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{SFD\_NONBLOCK}& imposta sul file descriptor il flag di
+    \constd{SFD\_NONBLOCK}&imposta sul file descriptor il flag di
                            \const{O\_NONBLOCK} per renderlo non bloccante.\\ 
-    \const{SFD\_CLOEXEC}&  imposta il flag di \const{O\_CLOEXEC} per la
+    \constd{SFD\_CLOEXEC}& imposta il flag di \const{O\_CLOEXEC} per la
                            chiusura automatica del file descriptor nella
                            esecuzione di \func{exec}.\\
     \hline    
@@ -2164,7 +2170,7 @@ condizioni di gestione, né da un gestore, né dalla funzione \func{sigwaitinfo}
 Come anticipato, essendo questo lo scopo principale della nuova interfaccia,
 il file descriptor può essere tenuto sotto osservazione tramite le funzioni
 dell'\textit{I/O multiplexing} (vale a dire con le solite \func{select},
-\func{poll} e \funcd{epoll\_wait}), e risulterà accessibile in lettura quando
+\func{poll} e \func{epoll\_wait}), e risulterà accessibile in lettura quando
 uno o più dei segnali indicati tramite \param{mask} sarà pendente.
 
 La funzione può essere chiamata più volte dallo stesso processo, consentendo
@@ -2186,9 +2192,9 @@ tal caso qualora vi fossero segnali pendenti questi resteranno tali, e
 potranno essere ricevuti normalmente una volta che si rimuova il blocco
 imposto con \func{sigprocmask}.
 
-Oltre che con le funzioni dell'\textit{I/O multiplexing} l'uso del file
-descriptor restituito da \func{signalfd} cerca di seguire la semantica di un
-sistema unix-like anche con altre \textit{system call}; in particolare esso
+Oltre a poter essere usato con le funzioni dell'\textit{I/O multiplexing}, il
+file descriptor restituito da \func{signalfd} cerca di seguire la semantica di
+un sistema unix-like anche con altre \textit{system call}; in particolare esso
 resta aperto (come ogni altro file descriptor) attraverso una chiamata ad
 \func{exec}, a meno che non lo si sia creato con il flag di
 \const{SFD\_CLOEXEC} o si sia successivamente impostato il
@@ -2215,7 +2221,7 @@ successivo con \func{fcntl}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{0.90\textwidth}
+  \begin{minipage}[c]{0.95\textwidth}
     \includestruct{listati/signalfd_siginfo.h}
   \end{minipage} 
   \normalsize 
@@ -2245,8 +2251,8 @@ ad eventuali più segnali pendenti, fino al numero massimo di strutture
   \label{fig:fiforeporter_code_init}
 \end{figure}
 
-Il contenuto di \struct{signalfd\_siginfo} ricalca da vicino quella della
-analoga struttura \struct{siginfo\_t} (illustrata in
+Il contenuto di \struct{signalfd\_siginfo} ricalca da vicino quella
+dell'analoga struttura \struct{siginfo\_t} (illustrata in
 fig.~\ref{fig:sig_siginfo_t}) usata dall'interfaccia ordinaria dei segnali, e
 restituisce dati simili. Come per \struct{siginfo\_t} i campi che vengono
 avvalorati dipendono dal tipo di segnale e ricalcano i valori che abbiamo già
@@ -2429,7 +2435,7 @@ abbiamo già illustrato in sez.~\ref{sec:sig_timer_adv}.\footnote{questa
   interfaccia è stata introdotta in forma considerata difettosa con il kernel
   2.6.22, per cui è stata immediatamente tolta nel successivo 2.6.23 e
   reintrodotta in una forma considerata adeguata nel kernel 2.6.25, il
-  supporto nelle \acr{glibc} è stato introdotto a partire dalla versione
+  supporto nella \acr{glibc} è stato introdotto a partire dalla versione
   2.8.6, la versione del kernel 2.6.22, presente solo su questo kernel, non è
   supportata e non deve essere usata.} La prima funzione di sistema prevista,
 quella che consente di creare un timer, è \funcd{timerfd\_create}, il cui
@@ -2479,11 +2485,11 @@ tab.~\ref{tab:timerfd_flags}.
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{TFD\_NONBLOCK}& imposta sul file descriptor il flag di
-                           \const{O\_NONBLOCK} per renderlo non bloccante.\\ 
-    \const{TFD\_CLOEXEC}&  imposta il flag di \const{O\_CLOEXEC} per la
-                           chiusura automatica del file descriptor nella
-                           esecuzione di \func{exec}.\\
+    \constd{TFD\_NONBLOCK}& imposta sul file descriptor il flag di
+                            \const{O\_NONBLOCK} per renderlo non bloccante.\\ 
+    \constd{TFD\_CLOEXEC} & imposta il flag di \const{O\_CLOEXEC} per la
+                            chiusura automatica del file descriptor nella
+                            esecuzione di \func{exec}.\\
     \hline    
   \end{tabular}
   \caption{Valori dell'argomento \param{flags} per la funzione
@@ -2548,7 +2554,7 @@ con \param{new\_value.it\_interval} la sua periodicità.  L'unica differenza
 riguarda l'argomento \param{flags} che serve sempre ad indicare se il tempo di
 scadenza del timer è da considerarsi relativo o assoluto rispetto al valore
 corrente dell'orologio associato al timer, ma che in questo caso ha come
-valori possibili rispettivamente soltanto $0$ e \const{TFD\_TIMER\_ABSTIME}
+valori possibili rispettivamente soltanto $0$ e \constd{TFD\_TIMER\_ABSTIME}
 (l'analogo di \const{TIMER\_ABSTIME}).
 
 L'ultima funzione di sistema prevista dalla nuova interfaccia è
@@ -2592,7 +2598,7 @@ funzioni dell'I/O multiplexing viste in precedenza. Una volta che il file
 descriptor risulta pronto sarà possibile leggere il numero di volte che il
 timer è scaduto con una ordinaria \func{read}. 
 
-La funzione legge il valore in un dato di tipo \type{uint64\_t}, e necessita
+La funzione legge il valore in un dato di tipo \typed{uint64\_t}, e necessita
 pertanto che le si passi un buffer di almeno 8 byte, fallendo con
 \errval{EINVAL} in caso contrario, in sostanza la lettura deve essere
 effettuata con una istruzione del tipo:
@@ -2623,9 +2629,8 @@ contesto le modalità di accesso ai file eseguibili in maniera
 \textsl{asincrona}, quelle cioè in cui un processo non deve bloccarsi in
 attesa della disponibilità dell'accesso al file, ma può proseguire
 nell'esecuzione utilizzando invece un meccanismo di notifica asincrono (di
-norma un segnale, ma esistono anche altre interfacce, come \itindex{inotify}
-\textit{inotify}), per essere avvisato della possibilità di eseguire le
-operazioni di I/O volute.
+norma un segnale, ma esistono anche altre interfacce, come \textit{inotify}),
+per essere avvisato della possibilità di eseguire le operazioni di I/O volute.
 
 
 \subsection{Il \textit{Signal driven I/O}}
@@ -2814,9 +2819,9 @@ tab.~\ref{tab:file_lease_fctnl}.
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{F\_RDLCK} & Richiede un \textit{read lease}.\\
-    \const{F\_WRLCK} & Richiede un \textit{write lease}.\\
-    \const{F\_UNLCK} & Rilascia un \textit{file lease}.\\
+    \constd{F\_RDLCK} & Richiede un \textit{read lease}.\\
+    \constd{F\_WRLCK} & Richiede un \textit{write lease}.\\
+    \constd{F\_UNLCK} & Rilascia un \textit{file lease}.\\
     \hline    
   \end{tabular}
   \caption{Costanti per i tre possibili valori dell'argomento \param{arg} di
@@ -2870,7 +2875,7 @@ operazione di lettura, declassando il \textit{lease} a lettura con
 
 Se il \textit{lease holder} non provvede a rilasciare il \textit{lease} entro
 il numero di secondi specificato dal parametro di sistema mantenuto in
-\sysctlfile{fs/lease-break-time} sarà il kernel stesso a rimuoverlo o
+\sysctlfiled{fs/lease-break-time} sarà il kernel stesso a rimuoverlo o
 declassarlo automaticamente (questa è una misura di sicurezza per evitare che
 un processo blocchi indefinitamente l'accesso ad un file acquisendo un
 \textit{lease}). Una volta che un \textit{lease} è stato rilasciato o
@@ -2914,26 +2919,26 @@ che è stato modificato tramite il contenuto della struttura
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{DN\_ACCESS} & Un file è stato acceduto, con l'esecuzione di una fra
-                         \func{read}, \func{pread}, \func{readv}.\\ 
-    \const{DN\_MODIFY} & Un file è stato modificato, con l'esecuzione di una
-                         fra \func{write}, \func{pwrite}, \func{writev}, 
-                         \func{truncate}, \func{ftruncate}.\\ 
-    \const{DN\_CREATE} & È stato creato un file nella directory, con
-                         l'esecuzione di una fra \func{open}, \func{creat},
-                         \func{mknod}, \func{mkdir}, \func{link},
-                         \func{symlink}, \func{rename} (da un'altra
-                         directory).\\
-    \const{DN\_DELETE} & È stato cancellato un file dalla directory con
-                         l'esecuzione di una fra \func{unlink}, \func{rename}
-                         (su un'altra directory), \func{rmdir}.\\
-    \const{DN\_RENAME} & È stato rinominato un file all'interno della
-                         directory (con \func{rename}).\\
-    \const{DN\_ATTRIB} & È stato modificato un attributo di un file con
-                         l'esecuzione di una fra \func{chown}, \func{chmod},
-                         \func{utime}.\\ 
-    \const{DN\_MULTISHOT}& Richiede una notifica permanente di tutti gli
-                         eventi.\\ 
+    \constd{DN\_ACCESS} & Un file è stato acceduto, con l'esecuzione di una fra
+                          \func{read}, \func{pread}, \func{readv}.\\ 
+    \constd{DN\_MODIFY} & Un file è stato modificato, con l'esecuzione di una
+                          fra \func{write}, \func{pwrite}, \func{writev}, 
+                          \func{truncate}, \func{ftruncate}.\\ 
+    \constd{DN\_CREATE} & È stato creato un file nella directory, con
+                          l'esecuzione di una fra \func{open}, \func{creat},
+                          \func{mknod}, \func{mkdir}, \func{link},
+                          \func{symlink}, \func{rename} (da un'altra
+                          directory).\\
+    \constd{DN\_DELETE} & È stato cancellato un file dalla directory con
+                          l'esecuzione di una fra \func{unlink}, \func{rename}
+                          (su un'altra directory), \func{rmdir}.\\
+    \constd{DN\_RENAME} & È stato rinominato un file all'interno della
+                          directory (con \func{rename}).\\
+    \constd{DN\_ATTRIB} & È stato modificato un attributo di un file con
+                          l'esecuzione di una fra \func{chown}, \func{chmod},
+                          \func{utime}.\\ 
+    \constd{DN\_MULTISHOT}& Richiede una notifica permanente di tutti gli
+                            eventi.\\ 
     \hline    
   \end{tabular}
   \caption{Le costanti che identificano le varie classi di eventi per i quali
@@ -2989,9 +2994,8 @@ interfaccia per l'osservazione delle modifiche a file o directory, chiamata
 questa è una interfaccia specifica di Linux (pertanto non deve essere usata se
 si devono scrivere programmi portabili), ed è basata sull'uso di una coda di
 notifica degli eventi associata ad un singolo file descriptor, il che permette
-di risolvere il principale problema di \itindex{dnotify} \textit{dnotify}.  La
-coda viene creata attraverso la funzione di sistema \funcd{inotify\_init}, il
-cui prototipo è:
+di risolvere il principale problema di \textit{dnotify}.  La coda viene creata
+attraverso la funzione di sistema \funcd{inotify\_init}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/inotify.h}
@@ -3020,7 +3024,7 @@ notificare gli eventi che sono stati posti in osservazione. Per evitare abusi
 delle risorse di sistema è previsto che un utente possa utilizzare un numero
 limitato di istanze di \textit{inotify}; il valore di default del limite è di
 128, ma questo valore può essere cambiato con \func{sysctl} o usando il file
-\sysctlfile{fs/inotify/max\_user\_instances}.
+\sysctlfiled{fs/inotify/max\_user\_instances}.
 
 Dato che questo file descriptor non è associato a nessun file o directory
 reale, l'inconveniente di non poter smontare un filesystem i cui file sono
@@ -3032,10 +3036,9 @@ stato smontato.
 Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà
 essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e
 con l'interfaccia di \textit{epoll}, ed a partire dal kernel 2.6.25 è stato
-introdotto anche il supporto per il \itindex{signal~driven~I/O}
-\texttt{signal-driven I/O}.  Siccome gli eventi vengono notificati come dati
-disponibili in lettura, dette funzioni ritorneranno tutte le volte che si avrà
-un evento di notifica. 
+introdotto anche il supporto per il \texttt{signal-driven I/O}.  Siccome gli
+eventi vengono notificati come dati disponibili in lettura, dette funzioni
+ritorneranno tutte le volte che si avrà un evento di notifica.
 
 Così, invece di dover utilizzare i segnali, considerati una pessima scelta dal
 punto di vista dell'interfaccia utente, si potrà gestire l'osservazione degli
@@ -3083,7 +3086,7 @@ modalità della stessa.  L'operazione può essere ripetuta per tutti i file e le
 directory che si vogliono tenere sotto osservazione,\footnote{anche in questo
   caso c'è un limite massimo che di default è pari a 8192, ed anche questo
   valore può essere cambiato con \func{sysctl} o usando il file
-  \sysctlfile{fs/inotify/max\_user\_watches}.} e si utilizzerà sempre un solo
+  \sysctlfiled{fs/inotify/max\_user\_watches}.} e si utilizzerà sempre un solo
 file descriptor.
 
 Il tipo di evento che si vuole osservare deve essere specificato
@@ -3103,41 +3106,41 @@ flag della prima parte.
     \textbf{Valore}  & & \textbf{Significato} \\
     \hline
     \hline
-    \const{IN\_ACCESS}        &$\bullet$& C'è stato accesso al file in
-                                          lettura.\\  
-    \const{IN\_ATTRIB}        &$\bullet$& Ci sono stati cambiamenti sui dati
-                                          dell'\textit{inode}
-                                          (o sugli attributi estesi, vedi
-                                          sez.~\ref{sec:file_xattr}).\\ 
-    \const{IN\_CLOSE\_WRITE}  &$\bullet$& È stato chiuso un file aperto in
-                                          scrittura.\\  
-    \const{IN\_CLOSE\_NOWRITE}&$\bullet$& È stato chiuso un file aperto in
-                                          sola lettura.\\
-    \const{IN\_CREATE}        &$\bullet$& È stato creato un file o una
-                                          directory in una directory sotto
-                                          osservazione.\\  
-    \const{IN\_DELETE}        &$\bullet$& È stato cancellato un file o una
-                                          directory in una directory sotto
-                                          osservazione.\\ 
-    \const{IN\_DELETE\_SELF}  & --      & È stato cancellato il file (o la
+    \constd{IN\_ACCESS}        &$\bullet$& C'è stato accesso al file in
+                                           lettura.\\  
+    \constd{IN\_ATTRIB}        &$\bullet$& Ci sono stati cambiamenti sui dati
+                                           dell'\textit{inode}
+                                           (o sugli attributi estesi, vedi
+                                           sez.~\ref{sec:file_xattr}).\\ 
+    \constd{IN\_CLOSE\_WRITE}  &$\bullet$& È stato chiuso un file aperto in
+                                           scrittura.\\  
+    \constd{IN\_CLOSE\_NOWRITE}&$\bullet$& È stato chiuso un file aperto in
+                                           sola lettura.\\
+    \constd{IN\_CREATE}        &$\bullet$& È stato creato un file o una
+                                           directory in una directory sotto
+                                           osservazione.\\  
+    \constd{IN\_DELETE}        &$\bullet$& È stato cancellato un file o una
+                                           directory in una directory sotto
+                                           osservazione.\\ 
+    \constd{IN\_DELETE\_SELF}  & --      & È stato cancellato il file (o la
                                           directory) sotto osservazione.\\ 
-    \const{IN\_MODIFY}        &$\bullet$& È stato modificato il file.\\ 
-    \const{IN\_MOVE\_SELF}    &         & È stato rinominato il file (o la
-                                          directory) sotto osservazione.\\ 
-    \const{IN\_MOVED\_FROM}   &$\bullet$& Un file è stato spostato fuori dalla
-                                          directory sotto osservazione.\\ 
-    \const{IN\_MOVED\_TO}     &$\bullet$& Un file è stato spostato nella
-                                          directory sotto osservazione.\\ 
-    \const{IN\_OPEN}          &$\bullet$& Un file è stato aperto.\\ 
+    \constd{IN\_MODIFY}        &$\bullet$& È stato modificato il file.\\ 
+    \constd{IN\_MOVE\_SELF}    &         & È stato rinominato il file (o la
+                                           directory) sotto osservazione.\\ 
+    \constd{IN\_MOVED\_FROM}   &$\bullet$& Un file è stato spostato fuori dalla
+                                           directory sotto osservazione.\\ 
+    \constd{IN\_MOVED\_TO}     &$\bullet$& Un file è stato spostato nella
+                                           directory sotto osservazione.\\ 
+    \constd{IN\_OPEN}          &$\bullet$& Un file è stato aperto.\\ 
     \hline    
-    \const{IN\_CLOSE}         &         & Combinazione di
-                                          \const{IN\_CLOSE\_WRITE} e
-                                          \const{IN\_CLOSE\_NOWRITE}.\\  
-    \const{IN\_MOVE}          &         & Combinazione di
-                                          \const{IN\_MOVED\_FROM} e
-                                          \const{IN\_MOVED\_TO}.\\
-    \const{IN\_ALL\_EVENTS}   &         & Combinazione di tutti i flag
-                                          possibili.\\
+    \constd{IN\_CLOSE}         &         & Combinazione di
+                                           \const{IN\_CLOSE\_WRITE} e
+                                           \const{IN\_CLOSE\_NOWRITE}.\\  
+    \constd{IN\_MOVE}          &         & Combinazione di
+                                           \const{IN\_MOVED\_FROM} e
+                                           \const{IN\_MOVED\_TO}.\\
+    \constd{IN\_ALL\_EVENTS}   &         & Combinazione di tutti i flag
+                                           possibili.\\
     \hline    
   \end{tabular}
   \caption{Le costanti che identificano i bit della maschera binaria
@@ -3164,17 +3167,17 @@ contrario dei precedenti non vengono mai impostati nei risultati in uscita.
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{IN\_DONT\_FOLLOW}& Non dereferenzia \param{pathname} se questo è un
-                              link simbolico.\\
-    \const{IN\_MASK\_ADD}   & Aggiunge a quelli già impostati i flag indicati
-                              nell'argomento \param{mask}, invece di
-                              sovrascriverli.\\
-    \const{IN\_ONESHOT}     & Esegue l'osservazione su \param{pathname} per una
-                              sola volta, rimuovendolo poi dalla \textit{watch
-                                list}.\\ 
-    \const{IN\_ONLYDIR}     & Se \param{pathname} è una directory riporta
-                              soltanto gli eventi ad essa relativi e non
-                              quelli per i file che contiene.\\ 
+    \constd{IN\_DONT\_FOLLOW}& Non dereferenzia \param{pathname} se questo è un
+                               link simbolico.\\
+    \constd{IN\_MASK\_ADD}   & Aggiunge a quelli già impostati i flag indicati
+                               nell'argomento \param{mask}, invece di
+                               sovrascriverli.\\
+    \constd{IN\_ONESHOT}     & Esegue l'osservazione su \param{pathname} per
+                               una sola volta, rimuovendolo poi dalla
+                               \textit{watch list}.\\ 
+    \constd{IN\_ONLYDIR}     & Se \param{pathname} è una directory riporta
+                               soltanto gli eventi ad essa relativi e non
+                               quelli per i file che contiene.\\ 
     \hline    
   \end{tabular}
   \caption{Le costanti che identificano i bit della maschera binaria
@@ -3296,21 +3299,21 @@ registrazione dell'osservatore).
     \textbf{Valore}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{IN\_IGNORED}    & L'osservatore è stato rimosso, sia in maniera 
-                             esplicita con l'uso di \func{inotify\_rm\_watch}, 
-                             che in maniera implicita per la rimozione 
-                             dell'oggetto osservato o per lo smontaggio del
-                             filesystem su cui questo si trova.\\
-    \const{IN\_ISDIR}      & L'evento avvenuto fa riferimento ad una directory
-                             (consente così di distinguere, quando si pone
-                             sotto osservazione una directory, fra gli eventi
-                             relativi ad essa e quelli relativi ai file che
-                             essa contiene).\\
-    \const{IN\_Q\_OVERFLOW}& Si sono eccedute le dimensioni della coda degli
-                             eventi (\textit{overflow} della coda); in questo
-                             caso il valore di \var{wd} è $-1$.\footnotemark\\
-    \const{IN\_UNMOUNT}    & Il filesystem contenente l'oggetto posto sotto
-                             osservazione è stato smontato.\\
+    \constd{IN\_IGNORED}    & L'osservatore è stato rimosso, sia in maniera 
+                              esplicita con l'uso di \func{inotify\_rm\_watch}, 
+                              che in maniera implicita per la rimozione 
+                              dell'oggetto osservato o per lo smontaggio del
+                              filesystem su cui questo si trova.\\
+    \constd{IN\_ISDIR}      & L'evento avvenuto fa riferimento ad una directory
+                              (consente così di distinguere, quando si pone
+                              sotto osservazione una directory, fra gli eventi
+                              relativi ad essa e quelli relativi ai file che
+                              essa contiene).\\
+    \constd{IN\_Q\_OVERFLOW}& Si sono eccedute le dimensioni della coda degli
+                              eventi (\textit{overflow} della coda); in questo
+                              caso il valore di \var{wd} è $-1$.\footnotemark\\
+    \constd{IN\_UNMOUNT}    & Il filesystem contenente l'oggetto posto sotto
+                              osservazione è stato smontato.\\
     \hline    
   \end{tabular}
   \caption{Le costanti che identificano i bit aggiuntivi usati nella maschera
@@ -3320,7 +3323,7 @@ registrazione dell'osservatore).
 
 \footnotetext{la coda di notifica ha una dimensione massima che viene
   controllata dal parametro di sistema
-  \sysctlfile{fs/inotify/max\_queued\_events}, che indica il numero massimo di
+  \sysctlfiled{fs/inotify/max\_queued\_events}, che indica il numero massimo di
   eventi che possono essere mantenuti sulla stessa; quando detto valore viene
   ecceduto gli ulteriori eventi vengono scartati, ma viene comunque generato
   un evento di tipo \const{IN\_Q\_OVERFLOW}.}
@@ -3334,15 +3337,15 @@ così all'applicazione di collegare la corrispondente coppia di eventi
 Infine due campi \var{name} e \var{len} sono utilizzati soltanto quando
 l'evento è relativo ad un file presente in una directory posta sotto
 osservazione, in tal caso essi contengono rispettivamente il nome del file
-(come \itindsub{pathname}{relativo} \textit{pathname} relativo alla directory
-osservata) e la relativa dimensione in byte. Il campo \var{name} viene sempre
-restituito come stringa terminata da NUL, con uno o più zeri di terminazione,
-a seconda di eventuali necessità di allineamento del risultato, ed il valore
-di \var{len} corrisponde al totale della dimensione di \var{name}, zeri
-aggiuntivi compresi. La stringa con il nome del file viene restituita nella
-lettura subito dopo la struttura \struct{inotify\_event}; questo significa che
-le dimensioni di ciascun evento di \textit{inotify} saranno pari a
-\code{sizeof(\struct{inotify\_event}) + len}.
+(come \textit{pathname} relativo alla directory osservata) e la relativa
+dimensione in byte. Il campo \var{name} viene sempre restituito come stringa
+terminata da NUL, con uno o più zeri di terminazione, a seconda di eventuali
+necessità di allineamento del risultato, ed il valore di \var{len} corrisponde
+al totale della dimensione di \var{name}, zeri aggiuntivi compresi. La stringa
+con il nome del file viene restituita nella lettura subito dopo la struttura
+\struct{inotify\_event}; questo significa che le dimensioni di ciascun evento
+di \textit{inotify} saranno pari a \code{sizeof(\struct{inotify\_event}) +
+  len}.
 
 Vediamo allora un esempio dell'uso dell'interfaccia di \textit{inotify} con un
 semplice programma che permette di mettere sotto osservazione uno o più file e
@@ -3476,6 +3479,8 @@ raggruppati in un solo evento.
 
 % TODO trattare fanotify, vedi http://lwn.net/Articles/339399/ e 
 % http://lwn.net/Articles/343346/ (incluso nel 2.6.36)
+% fanotify_mark() ha FAN_MARK_FILESYSTEM dal 4.20
+% fanotify() ha FAN_OPEN_EXEC dal 4.21/5.0
 
 
 \subsection{L'interfaccia POSIX per l'I/O asincrono}
@@ -3492,19 +3497,19 @@ poter effettuare in contemporanea le operazioni di calcolo e quelle di I/O.
 Benché la modalità di apertura asincrona di un file vista in
 sez.~\ref{sec:signal_driven_io} possa risultare utile in varie occasioni (in
 particolar modo con i socket e gli altri file per i quali le funzioni di I/O
-sono \index{system~call~lente} \textit{system call} lente), essa è comunque
-limitata alla notifica della disponibilità del file descriptor per le
-operazioni di I/O, e non ad uno svolgimento asincrono delle medesime.  Lo
-standard POSIX.1b definisce una interfaccia apposita per l'I/O asincrono vero
-e proprio,\footnote{questa è stata ulteriormente perfezionata nelle successive
-  versioni POSIX.1-2001 e POSIX.1-2008.} che prevede un insieme di funzioni
-dedicate per la lettura e la scrittura dei file, completamente separate
-rispetto a quelle usate normalmente.
+sono \textit{system call} lente), essa è comunque limitata alla notifica della
+disponibilità del file descriptor per le operazioni di I/O, e non ad uno
+svolgimento asincrono delle medesime.  Lo standard POSIX.1b definisce una
+interfaccia apposita per l'I/O asincrono vero e proprio,\footnote{questa è
+  stata ulteriormente perfezionata nelle successive versioni POSIX.1-2001 e
+  POSIX.1-2008.} che prevede un insieme di funzioni dedicate per la lettura e
+la scrittura dei file, completamente separate rispetto a quelle usate
+normalmente.
 
 In generale questa interfaccia è completamente astratta e può essere
 implementata sia direttamente nel kernel che in \textit{user space} attraverso
 l'uso di \textit{thread}. Per le versioni del kernel meno recenti esiste una
-implementazione di questa interfaccia fornita completamente delle \acr{glibc}
+implementazione di questa interfaccia fornita completamente dalla \acr{glibc}
 a partire dalla versione 2.1, che è realizzata completamente in \textit{user
   space}, ed è accessibile linkando i programmi con la libreria
 \file{librt}. A partire dalla versione 2.5.32 è stato introdotto nel kernel
@@ -3515,9 +3520,9 @@ Lo standard POSIX prevede che tutte le operazioni di I/O asincrono siano
 controllate attraverso l'uso di una apposita struttura \struct{aiocb} (il cui
 nome sta per \textit{asyncronous I/O control block}), che viene passata come
 argomento a tutte le funzioni dell'interfaccia. La sua definizione, come
-effettuata in \headfile{aio.h}, è riportata in
+effettuata in \headfiled{aio.h}, è riportata in
 fig.~\ref{fig:file_aiocb}. Nello steso file è definita la macro
-\macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità
+\macrod{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità
 dell'interfaccia per l'I/O asincrono.
 
 \begin{figure}[!htb]
@@ -3547,8 +3552,8 @@ del blocco di dati da trasferire.
 Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni
 di I/O, in generale perché ciò sia possibile occorre che la piattaforma
 supporti questa caratteristica, questo viene indicato dal fatto che le macro
-\macro{\_POSIX\_PRIORITIZED\_IO}, e \macro{\_POSIX\_PRIORITY\_SCHEDULING} sono
-definite. La priorità viene impostata a partire da quella del processo
+\macrod{\_POSIX\_PRIORITIZED\_IO}, e \macrod{\_POSIX\_PRIORITY\_SCHEDULING}
+sono definite. La priorità viene impostata a partire da quella del processo
 chiamante (vedi sez.~\ref{sec:proc_priority}), cui viene sottratto il valore
 di questo campo.  Il campo \var{aio\_lio\_opcode} è usato solo dalla funzione
 \func{lio\_listio}, che, come vedremo, permette di eseguire con una sola
@@ -3557,8 +3562,8 @@ chiamata una serie di operazioni, usando un vettore di \textit{control
 esse.
 
 Infine il campo \var{aio\_sigevent} è una struttura di tipo \struct{sigevent}
-(illustrata in in fig.~\ref{fig:struct_sigevent}) che serve a specificare il
-modo in cui si vuole che venga effettuata la notifica del completamento delle
+(illustrata in fig.~\ref{fig:struct_sigevent}) che serve a specificare il modo
+in cui si vuole che venga effettuata la notifica del completamento delle
 operazioni richieste; per la trattazione delle modalità di utilizzo della
 stessa si veda quanto già visto in proposito in sez.~\ref{sec:sig_timer_adv}.
 
@@ -3741,13 +3746,13 @@ file descriptor diverso da \param{fd} il risultato è indeterminato.  In caso
 di successo, i possibili valori di ritorno per \func{aio\_cancel} (anch'essi
 definiti in \headfile{aio.h}) sono tre:
 \begin{basedescript}{\desclabelwidth{3.0cm}}
-\item[\const{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la
+\item[\constd{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la
   cancellazione sono state già completate,
   
-\item[\const{AIO\_CANCELED}] indica che tutte le operazioni richieste sono
+\item[\constd{AIO\_CANCELED}] indica che tutte le operazioni richieste sono
   state cancellate,  
   
-\item[\const{AIO\_NOTCANCELED}] indica che alcune delle operazioni erano in
+\item[\constd{AIO\_NOTCANCELED}] indica che alcune delle operazioni erano in
   corso e non sono state cancellate.
 \end{basedescript}
 
@@ -3835,9 +3840,9 @@ Ciascuna struttura \struct{aiocb} della lista deve contenere un
 ognuna di esse dovrà essere specificato il tipo di operazione con il campo
 \var{aio\_lio\_opcode}, che può prendere i valori:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{LIO\_READ}]  si richiede una operazione di lettura.
-\item[\const{LIO\_WRITE}] si richiede una operazione di scrittura.
-na operazione.
+\item[\constd{LIO\_READ}]  si richiede una operazione di lettura.
+\item[\constd{LIO\_WRITE}] si richiede una operazione di scrittura.
+\item[\constd{LIO\_NOP}] non si effettua nessuna operazione.
 \end{basedescript}
 dove \const{LIO\_NOP} viene usato quando si ha a che fare con un vettore di
 dimensione fissa, per poter specificare solo alcune operazioni, o quando si
@@ -3845,8 +3850,8 @@ sono dovute cancellare delle operazioni e si deve ripetere la richiesta per
 quelle non completate. 
 
 L'argomento \param{mode} controlla il comportamento della funzione, se viene
-usato il valore \const{LIO\_WAIT} la funzione si blocca fino al completamento
-di tutte le operazioni richieste; se si usa \const{LIO\_NOWAIT} la funzione
+usato il valore \constd{LIO\_WAIT} la funzione si blocca fino al completamento
+di tutte le operazioni richieste; se si usa \constd{LIO\_NOWAIT} la funzione
 ritorna immediatamente dopo aver messo in coda tutte le richieste. In tal caso
 il chiamante può richiedere la notifica del completamento di tutte le
 richieste, impostando l'argomento \param{sig} in maniera analoga a come si fa
@@ -3857,7 +3862,17 @@ per il campo \var{aio\_sigevent} di \struct{aiocb}.
 % http://webfiveoh.com/content/guides/2012/aug/mon-13th/linux-asynchronous-io-and-libaio.html, 
 % https://code.google.com/p/kernel/wiki/AIOUserGuide,
 % http://bert-hubert.blogspot.de/2012/05/on-linux-asynchronous-file-io.html 
+% https://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
+
+% TODO trattare la poll API basata sull'I/O asicrono, introdotta con il kernel
+% 4.18, vedi  https://lwn.net/Articles/743714/,
+% https://lwn.net/Articles/742978/, https://lwn.net/Articles/758324/
+% http://git.infradead.org/users/hch/vfs.git/commit/d2d9e26c7cb6d95d521153897910080cf56c7fad
+% Reverted
 
+% TODO trattare la nuova API per l'I/O asincrono (io_uring), introdotta con il
+% kernel 5.1, vedi https://lwn.net/Articles/776703/,
+% https://lwn.net/ml/linux-fsdevel/20190112213011.1439-1-axboe@kernel.dk/ 
 
 \section{Altre modalità di I/O avanzato}
 \label{sec:file_advanced_io}
@@ -3991,10 +4006,10 @@ memoria.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{PROT\_EXEC}  & Le pagine possono essere eseguite.\\
-    \const{PROT\_READ}  & Le pagine possono essere lette.\\
-    \const{PROT\_WRITE} & Le pagine possono essere scritte.\\
-    \const{PROT\_NONE}  & L'accesso alle pagine è vietato.\\
+    \constd{PROT\_EXEC}  & Le pagine possono essere eseguite.\\
+    \constd{PROT\_READ}  & Le pagine possono essere lette.\\
+    \constd{PROT\_WRITE} & Le pagine possono essere scritte.\\
+    \constd{PROT\_NONE}  & L'accesso alle pagine è vietato.\\
     \hline    
   \end{tabular}
   \caption{Valori dell'argomento \param{prot} di \func{mmap}, relativi alla
@@ -4023,64 +4038,65 @@ file.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{MAP\_32BIT}     & Esegue la mappatura sui primi 2Gb dello spazio
+    \constd{MAP\_32BIT}    & Esegue la mappatura sui primi 2Gb dello spazio
                              degli indirizzi, viene supportato solo sulle
                              piattaforme \texttt{x86-64} per compatibilità con
                              le applicazioni a 32 bit. Viene ignorato se si è
                              richiesto \const{MAP\_FIXED} (dal kernel 2.4.20).\\
-    \const{MAP\_ANON}      & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\
-    \const{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli
+    \constd{MAP\_ANON}     & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\
+    \constd{MAP\_ANONYMOUS}& La mappatura non è associata a nessun file. Gli
                              argomenti \param{fd} e \param{offset} sono
                              ignorati. L'uso di questo flag con
                              \const{MAP\_SHARED} è stato implementato in Linux
                              a partire dai kernel della serie 2.4.x.\\
-    \const{MAP\_DENYWRITE} & In Linux viene ignorato per evitare
+    \constd{MAP\_DENYWRITE}& In Linux viene ignorato per evitare
                              \textit{DoS}
                              (veniva usato per segnalare che tentativi di
                              scrittura sul file dovevano fallire con
                              \errcode{ETXTBSY}).\\ 
-    \const{MAP\_EXECUTABLE}& Ignorato.\\
-    \const{MAP\_FILE}      & Valore di compatibilità, ignorato.\\
-    \const{MAP\_FIXED}     & Non permette di restituire un indirizzo diverso
+    \constd{MAP\_EXECUTABLE}& Ignorato.\\
+    \constd{MAP\_FILE}     & Valore di compatibilità, ignorato.\\
+    \constd{MAP\_FIXED}    & Non permette di restituire un indirizzo diverso
                              da \param{start}, se questo non può essere usato
                              \func{mmap} fallisce. Se si imposta questo flag il
                              valore di \param{start} deve essere allineato
                              alle dimensioni di una pagina.\\
-    \const{MAP\_GROWSDOWN} & Usato per gli \textit{stack}. 
+    \constd{MAP\_GROWSDOWN}& Usato per gli \textit{stack}. 
                              Indica che la mappatura deve essere effettuata 
                              con gli indirizzi crescenti verso il basso.\\
-    \const{MAP\_HUGETLB}   & Esegue la mappatura usando le cosiddette
+    \constd{MAP\_HUGETLB}  & Esegue la mappatura usando le cosiddette
                              ``\textit{huge pages}'' (dal kernel 2.6.32).\\
-    \const{MAP\_LOCKED}    & Se impostato impedisce lo \textit{swapping} delle
+    \constd{MAP\_LOCKED}   & Se impostato impedisce lo \textit{swapping} delle
                              pagine mappate (dal kernel 2.5.37).\\
-    \const{MAP\_NONBLOCK}  & Esegue un \textit{prefaulting} più limitato che
+    \constd{MAP\_NONBLOCK} & Esegue un \textit{prefaulting} più limitato che
                              non causa I/O (dal kernel 2.5.46).\\
-    \const{MAP\_NORESERVE} & Si usa con \const{MAP\_PRIVATE}. Non riserva
+    \constd{MAP\_NORESERVE}& Si usa con \const{MAP\_PRIVATE}. Non riserva
                              delle pagine di \textit{swap} ad uso del meccanismo
                              del \textit{copy on write} 
                              per mantenere le modifiche fatte alla regione
                              mappata, in questo caso dopo una scrittura, se
                              non c'è più memoria disponibile, si ha
                              l'emissione di un \signal{SIGSEGV}.\\
-    \const{MAP\_POPULATE}  & Esegue il \textit{prefaulting} delle pagine di
+    \constd{MAP\_POPULATE} & Esegue il \textit{prefaulting} delle pagine di
                              memoria necessarie alla mappatura (dal kernel
                              2.5.46).\\ 
-    \const{MAP\_PRIVATE}   & I cambiamenti sulla memoria mappata non vengono
+    \constd{MAP\_PRIVATE}  & I cambiamenti sulla memoria mappata non vengono
                              riportati sul file. Ne viene fatta una copia
                              privata cui solo il processo chiamante ha
                              accesso.  Incompatibile con \const{MAP\_SHARED}.\\
-    \const{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
+    \constd{MAP\_SHARED}   & I cambiamenti sulla memoria mappata vengono
                              riportati sul file e saranno immediatamente
                              visibili agli altri processi che mappano lo stesso
                              file. Incompatibile
                              con \const{MAP\_PRIVATE}.\\ 
     \const{MAP\_STACK}     & Al momento è ignorato, è stato fornito (dal kernel
                              2.6.27) a supporto della implementazione dei
-                             thread nelle \acr{glibc}, per allocare memoria in
-                             uno spazio utilizzabile come \textit{stack} per le
-                             architetture hardware che richiedono un
-                             trattamento speciale di quest'ultimo.\\
-    \const{MAP\_UNINITIALIZED}& Specifico per i sistemi embedded ed
+                             \textit{thread} nella \acr{glibc}, per allocare
+                             memoria in uno spazio utilizzabile come
+                             \textit{stack} per le architetture hardware che
+                             richiedono un trattamento speciale di
+                             quest'ultimo.\\ 
+    \constd{MAP\_UNINITIALIZED}& Specifico per i sistemi embedded ed
                              utilizzabile dal kernel 2.6.33 solo se è stata
                              abilitata in fase di compilazione dello stesso
                              l'opzione
@@ -4094,7 +4110,7 @@ file.
                              per i sistemi embedded) si ha il completo
                              controllo dell'uso della memoria da parte degli
                              utenti.\\ 
-%     \const{MAP\_DONTEXPAND}& Non consente una successiva espansione dell'area
+%    \constd{MAP\_DONTEXPAND}& Non consente una successiva espansione dell'area
 %                              mappata con \func{mremap}, proposto ma pare non
 %                              implementato.\\
     \hline
@@ -4106,6 +4122,14 @@ file.
 % TODO trattare MAP_HUGETLB introdotto con il kernel 2.6.32, e modifiche
 % introdotte con il 3.8 per le dimensioni variabili delle huge pages
 
+% TODO trattare  MAP_FIXED_NOREPLACE vedi https://lwn.net/Articles/751651/ e
+% https://lwn.net/Articles/741369/ 
+
+% TODO: verificare MAP_SYNC e MAP_SHARED_VALIDATE, vedi
+% https://lwn.net/Articles/731706/, https://lwn.net/Articles/758594/ incluse
+% con il 4.15
+
+
 L'argomento \param{flags} specifica infine qual è il tipo di oggetto mappato,
 le opzioni relative alle modalità con cui è effettuata la mappatura e alle
 modalità con cui le modifiche alla memoria mappata vengono condivise o
@@ -4276,7 +4300,6 @@ relativi tempi di modifica. In questo modo si è sicuri che dopo l'esecuzione
 di \func{msync} le funzioni dell'interfaccia ordinaria troveranno un contenuto
 del file aggiornato.
 
-
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -4285,11 +4308,11 @@ del file aggiornato.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{MS\_SYNC}       & richiede una sincronizzazione e ritorna soltanto
+    \constd{MS\_SYNC}      & richiede una sincronizzazione e ritorna soltanto
                              quando questa è stata completata.\\
-    \const{MS\_ASYNC}      & richiede una sincronizzazione, ma ritorna subito 
+    \constd{MS\_ASYNC}     & richiede una sincronizzazione, ma ritorna subito 
                              non attendendo che questa sia finita.\\
-    \const{MS\_INVALIDATE} & invalida le pagine per tutte le mappature
+    \constd{MS\_INVALIDATE}& invalida le pagine per tutte le mappature
                              in memoria così da rendere necessaria una
                              rilettura immediata delle stesse.\\
     \hline
@@ -4411,7 +4434,7 @@ precedente indirizzo del \textit{memory mapping} e \param{old\_size}, che ne
 indica la dimensione. Con \param{new\_size} si specifica invece la nuova
 dimensione che si vuole ottenere. Infine l'argomento \param{flags} è una
 maschera binaria per i flag che controllano il comportamento della funzione.
-Il solo valore utilizzato è \const{MREMAP\_MAYMOVE} che consente di eseguire
+Il solo valore utilizzato è \constd{MREMAP\_MAYMOVE} che consente di eseguire
 l'espansione anche quando non è possibile utilizzare il precedente
 indirizzo. Per questo motivo, se si è usato questo flag, la funzione può
 restituire un indirizzo della nuova zona di memoria che non è detto coincida
@@ -4601,87 +4624,94 @@ caching dei dati.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{MADV\_DONTNEED}& non ci si aspetta nessun accesso nell'immediato
-                            futuro, pertanto le pagine possono essere
-                            liberate dal kernel non appena necessario; l'area
-                            di memoria resterà accessibile, ma un accesso
-                            richiederà che i dati vengano ricaricati dal file
-                            a cui la mappatura fa riferimento.\\
-    \const{MADV\_NORMAL}  & nessuna indicazione specifica, questo è il valore
-                            di default usato quando non si è chiamato
-                            \func{madvise}.\\
-    \const{MADV\_RANDOM}  & ci si aspetta un accesso casuale all'area
-                            indicata, pertanto l'applicazione di una lettura
-                            anticipata con il meccanismo del
-                            \textit{read-ahead} (vedi 
-                            sez.~\ref{sec:file_fadvise}) è di
-                            scarsa utilità e verrà disabilitata.\\
-    \const{MADV\_SEQUENTIAL}& ci si aspetta un accesso sequenziale al file,
-                            quindi da una parte sarà opportuno eseguire una
-                            lettura anticipata, e dall'altra si potranno
-                            scartare immediatamente le pagine una volta che
-                            queste siano state lette.\\
+    \constd{MADV\_DONTNEED}& non ci si aspetta nessun accesso nell'immediato
+                             futuro, pertanto le pagine possono essere
+                             liberate dal kernel non appena necessario; l'area
+                             di memoria resterà accessibile, ma un accesso
+                             richiederà che i dati vengano ricaricati dal file
+                             a cui la mappatura fa riferimento.\\
+    \constd{MADV\_NORMAL}  & nessuna indicazione specifica, questo è il valore
+                             di default usato quando non si è chiamato
+                             \func{madvise}.\\
+    \constd{MADV\_RANDOM}  & ci si aspetta un accesso casuale all'area
+                             indicata, pertanto l'applicazione di una lettura
+                             anticipata con il meccanismo del
+                             \textit{read-ahead} (vedi 
+                             sez.~\ref{sec:file_fadvise}) è di
+                             scarsa utilità e verrà disabilitata.\\
+    \constd{MADV\_SEQUENTIAL}& ci si aspetta un accesso sequenziale al file,
+                               quindi da una parte sarà opportuno eseguire una
+                               lettura anticipata, e dall'altra si potranno
+                               scartare immediatamente le pagine una volta che
+                               queste siano state lette.\\
     \const{MADV\_WILLNEED}& ci si aspetta un accesso nell'immediato futuro,
                             pertanto l'applicazione del \textit{read-ahead}
                             deve essere incentivata.\\
     \hline
-    \const{MADV\_DONTDUMP}& esclude da un \textit{core dump} (vedi
-                            sez.~\ref{sec:sig_standard}) le pagine 
-                            specificate, viene usato per evitare di scrivere
-                            su disco dati relativi a zone di memoria che si sa
-                            non essere utili in un \textit{core dump}.\\
-    \const{MADV\_DODUMP}  & rimuove l'effetto della precedente
-                            \const{MADV\_DONTDUMP} (dal kernel 3.4).\\ 
-    \const{MADV\_DONTFORK}& impedisce che l'intervallo specificato venga
-                            ereditato dal processo figlio dopo una
-                            \func{fork}; questo consente di evitare che il
-                            meccanismo del \textit{copy on write} effettui la
-                            rilocazione delle pagine quando il padre scrive
-                            sull'area di memoria dopo la \func{fork}, cosa che
-                            può causare problemi per l'hardware che esegue
-                            operazioni in DMA su quelle pagine (dal kernel
-                            2.6.16).\\
-    \const{MADV\_DOFORK}  & rimuove l'effetto della precedente
-                            \const{MADV\_DONTFORK} (dal kernel 2.6.16).\\ 
-    \const{MADV\_HUGEPAGE}& abilita il meccanismo delle \textit{Transparent
-                              Huge Page} (vedi sez.~\ref{sec:huge_pages})
-                            sulla regione indicata; se questa è allineata
-                            alle relative dimensioni il kernel alloca
-                            direttamente delle \textit{huge page}; è
-                            utilizzabile solo con mappature anomime private
-                            (dal kernel 2.6.38).\\
-    \const{MADV\_NOHUGEPAGE}& impedisce che la regione indicata venga
-                            collassata in eventuali \textit{huge page} (dal
-                            kernel 2.6.38).\\
-    \const{MADV\_HWPOISON} &opzione ad uso di debug per verificare codice
-                            che debba gestire errori nella gestione della
-                            memoria; richiede una apposita opzione di
-                            compilazione del kernel, privilegi amministrativi
-                            (la capacità \const{CAP\_SYS\_ADMIN}) e provoca
-                            l'emissione di un segnale di \const{SIGBUS} dal
-                            programma chiamante e rimozione della mappatura
-                            (dal kernel 2.6.32).\\
-    \const{MADV\_SOFT\_OFFLINE}&opzione utilizzata per il debug del
-                            codice di verifica degli errori di gestione
-                            memoria, richiede una apposita opzione di
-                            compilazione (dal kernel 2.6.33).\\
-    \const{MADV\_MERGEABLE}& marca la pagina come accorpabile, indicazione
-                            principalmente ad uso dei sistemi di
-                            virtualizzazione\footnotemark (dal kernel 2.6.32).\\
-    \const{MADV\_REMOVE}  & libera un intervallo di pagine di memoria ed il
-                            relativo supporto sottostante; è supportato
-                            soltanto sui filesystem in RAM \textit{tmpfs} e
-                            \textit{shmfs} se usato su altri tipi di
-                            filesystem causa un errore di \errcode{ENOSYS}
-                            (dal kernel 2.6.16).\\
-    \const{MADV\_UNMERGEABLE}& rimuove l'effetto della precedente
-                            \const{MADV\_MERGEABLE} (dal kernel 2.6.32). \\
-     \hline
+    \constd{MADV\_DONTDUMP}& esclude da un \textit{core dump} (vedi
+                             sez.~\ref{sec:sig_standard}) le pagine 
+                             specificate, viene usato per evitare di scrivere
+                             su disco dati relativi a zone di memoria che si sa
+                             non essere utili in un \textit{core dump}.\\
+    \constd{MADV\_DODUMP}  & rimuove l'effetto della precedente
+                             \const{MADV\_DONTDUMP} (dal kernel 3.4).\\ 
+    \constd{MADV\_DONTFORK}& impedisce che l'intervallo specificato venga
+                             ereditato dal processo figlio dopo una
+                             \func{fork}; questo consente di evitare che il
+                             meccanismo del \textit{copy on write} effettui la
+                             rilocazione delle pagine quando il padre scrive
+                             sull'area di memoria dopo la \func{fork}, cosa che
+                             può causare problemi per l'hardware che esegue
+                             operazioni in DMA su quelle pagine (dal kernel
+                             2.6.16).\\
+    \constd{MADV\_DOFORK}  & rimuove l'effetto della precedente
+                             \const{MADV\_DONTFORK} (dal kernel 2.6.16).\\ 
+    \constd{MADV\_HUGEPAGE}& abilita il meccanismo delle \textit{Transparent
+                             Huge Page} (vedi sez.~\ref{sec:huge_pages})
+                             sulla regione indicata; se questa è allineata
+                             alle relative dimensioni il kernel alloca
+                             direttamente delle \textit{huge page}; è
+                             utilizzabile solo con mappature anomime private
+                             (dal kernel 2.6.38).\\
+    \constd{MADV\_NOHUGEPAGE}& impedisce che la regione indicata venga
+                               collassata in eventuali \textit{huge page} (dal
+                               kernel 2.6.38).\\
+    \constd{MADV\_HWPOISON} &opzione ad uso di debug per verificare codice
+                              che debba gestire errori nella gestione della
+                              memoria; richiede una apposita opzione di
+                              compilazione del kernel, privilegi amministrativi
+                              (la capacità \const{CAP\_SYS\_ADMIN}) e provoca
+                              l'emissione di un segnale di \const{SIGBUS} dal
+                              programma chiamante e rimozione della mappatura
+                              (dal kernel 2.6.32).\\
+    \constd{MADV\_SOFT\_OFFLINE}&opzione utilizzata per il debug del
+                              codice di verifica degli errori di gestione
+                              memoria, richiede una apposita opzione di
+                              compilazione (dal kernel 2.6.33).\\
+    \constd{MADV\_MERGEABLE}& marca la pagina come accorpabile, indicazione
+                              principalmente ad uso dei sistemi di
+                              virtualizzazione\footnotemark (dal kernel
+                              2.6.32).\\ 
+    \constd{MADV\_REMOVE}  & libera un intervallo di pagine di memoria ed il
+                             relativo supporto sottostante; è supportato
+                             soltanto sui filesystem in RAM \textit{tmpfs} e
+                             \textit{shmfs} se usato su altri tipi di
+                             filesystem causa un errore di \errcode{ENOSYS}
+                             (dal kernel 2.6.16).\\
+    \constd{MADV\_UNMERGEABLE}& rimuove l'effetto della precedente
+                                \const{MADV\_MERGEABLE} (dal kernel 2.6.32). \\
+    \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{advice} di \func{madvise}.}
   \label{tab:madvise_advice_values}
 \end{table}
 
+% TODO aggiunta MADV_FREE dal kernel 4.5 (vedi http://lwn.net/Articles/590991/)
+% TODO aggiunta MADV_WIPEONFORK dal kernel 4.14 that causes the affected memory
+% region to appear to be full of zeros in the child process after a fork. It
+% differs from the existing MADV_DONTFORK in that the address range will
+% remain valid in the child (dalla notizia in https://lwn.net/Articles/733256/).  
+
 \footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che
   identifica pagine di memoria identiche e le accorpa in una unica pagina
   (soggetta al \textit{copy-on-write} per successive modifiche); per evitare
@@ -4737,11 +4767,11 @@ funzione, su Linux un valore nullo di \param{len} è consentito.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{POSIX\_MADV\_DONTNEED}& analogo a \const{MADV\_DONTNEED}.\\
-    \const{POSIX\_MADV\_NORMAL}  & identico a \const{MADV\_NORMAL}.\\
-    \const{POSIX\_MADV\_RANDOM}  & identico a \const{MADV\_RANDOM}.\\
-    \const{POSIX\_MADV\_SEQUENTIAL}& identico a \const{MADV\_SEQUENTIAL}.\\
-    \const{POSIX\_MADV\_WILLNEED}& identico a \const{MADV\_WILLNEED}.\\
+    \constd{POSIX\_MADV\_DONTNEED}& analogo a \const{MADV\_DONTNEED}.\\
+    \constd{POSIX\_MADV\_NORMAL}  & identico a \const{MADV\_NORMAL}.\\
+    \constd{POSIX\_MADV\_RANDOM}  & identico a \const{MADV\_RANDOM}.\\
+    \constd{POSIX\_MADV\_SEQUENTIAL}& identico a \const{MADV\_SEQUENTIAL}.\\
+    \constd{POSIX\_MADV\_WILLNEED}& identico a \const{MADV\_WILLNEED}.\\
      \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{advice} di \func{posix\_madvise}.}
@@ -4752,7 +4782,7 @@ funzione, su Linux un valore nullo di \param{len} è consentito.
 L'argomento \param{advice} invece può assumere solo i valori indicati in
 tab.~\ref{tab:posix_madvise_advice_values}, che riflettono gli analoghi di
 \func{madvise}, con lo stesso effetto per tutti tranne
-\const{POSIX\_MADV\_DONTNEED}.  Infatti a partire dalle \acr{glibc} 2.6
+\const{POSIX\_MADV\_DONTNEED}.  Infatti a partire dalla \acr{glibc} 2.6
 \const{POSIX\_MADV\_DONTNEED} viene ignorato, in quanto l'uso del
 corrispondente \const{MADV\_DONTNEED} di \func{madvise} ha, per la semantica
 imperativa, l'effetto immediato di far liberare le pagine da parte del kernel,
@@ -4837,11 +4867,11 @@ stesso valore deve essere ottenibile in esecuzione tramite la funzione
 \func{sysconf} richiedendo l'argomento \const{\_SC\_IOV\_MAX} (vedi
 sez.~\ref{sec:sys_limits}).
 
-Nel caso di Linux il limite di sistema è di 1024, però se si usano le
-\acr{glibc} queste forniscono un \textit{wrapper} per le \textit{system call}
+Nel caso di Linux il limite di sistema è di 1024, però se si usa la
+\acr{glibc} essa fornisce un \textit{wrapper} per le \textit{system call}
 che si accorge se una operazione supererà il precedente limite, in tal caso i
 dati verranno letti o scritti con le usuali \func{read} e \func{write} usando
-un buffer di dimensioni sufficienti appositamente allocato e sufficiente a
+un buffer di dimensioni sufficienti appositamente allocato in grado di
 contenere tutti i dati indicati da \param{vector}. L'operazione avrà successo
 ma si perderà l'atomicità del trasferimento da e verso la destinazione finale.
 
@@ -4898,6 +4928,10 @@ si possono avere in concorrenza processi che utilizzano lo stesso file
 descriptor (si ricordi quanto visto in sez.~\ref{sec:file_adv_func}) con delle
 chiamate a \func{lseek}.
 
+% TODO trattare preadv2() e pwritev2(), introdotte con il kernel 4.6, vedi
+% http://lwn.net/Articles/670231/ ed il flag RWF_HIPRI, anche l'aggiunta del
+% flag RWF_APPEND a pwritev2 con il kernel 4.16, vedi
+% https://lwn.net/Articles/746129/ 
 
 
 \subsection{L'I/O diretto fra file descriptor: \func{sendfile} e
@@ -4919,7 +4953,7 @@ permettono di ottimizzare le prestazioni in questo tipo di situazioni.
 
 La prima funzione che è stata ideata per ottimizzare il trasferimento dei dati
 fra due file descriptor è \func{sendfile}.\footnote{la funzione è stata
-  introdotta con i kernel della serie 2.2, e disponibile dalle \acr{glibc}
+  introdotta con i kernel della serie 2.2, e disponibile dalla \acr{glibc}
   2.1.} La funzione è presente in diverse versioni di Unix (la si ritrova ad
 esempio in FreeBSD, HPUX ed altri Unix) ma non è presente né in POSIX.1-2001
 né in altri standard (pertanto si eviti di utilizzarla se si devono scrivere
@@ -5137,55 +5171,55 @@ descrizioni complete di tutti i valori possibili anche quando, come per
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{SPLICE\_F\_MOVE}    & Suggerisce al kernel di spostare le pagine
-                                 di memoria contenenti i dati invece di
-                                 copiarle: per una maggiore efficienza
-                                 \func{splice} usa quando possibile i
-                                 meccanismi della memoria virtuale per
-                                 eseguire i trasferimenti di dati. In maniera
-                                 analoga a \func{mmap}), qualora le pagine non
-                                 possano essere spostate dalla \textit{pipe} o
-                                 il buffer non corrisponda a pagine intere
-                                 esse saranno comunque copiate. Viene usato
-                                 soltanto da \func{splice}.\\ 
-    \const{SPLICE\_F\_NONBLOCK}& Richiede di operare in modalità non
-                                 bloccante; questo flag influisce solo sulle
-                                 operazioni che riguardano l'I/O da e verso la
-                                 \textit{pipe}. Nel caso di \func{splice}
-                                 questo significa che la funzione potrà
-                                 comunque bloccarsi nell'accesso agli altri
-                                 file descriptor (a meno che anch'essi non
-                                 siano stati aperti in modalità non
-                                 bloccante).\\
-    \const{SPLICE\_F\_MORE}    & Indica al kernel che ci sarà l'invio di
-                                 ulteriori dati in una \func{splice}
-                                 successiva, questo è un suggerimento utile
-                                 che viene usato quando \param{fd\_out} è un
-                                 socket. Questa opzione consente di utilizzare
-                                 delle opzioni di gestione dei socket che
-                                 permettono di ottimizzare le trasmissioni via
-                                 rete (si veda la descrizione di
-                                 \const{TCP\_CORK} in
-                                 sez.~\ref{sec:sock_tcp_udp_options} e quella
-                                 di \const{MSG\_MORE} in
-                                 sez.~\ref{sec:net_sendmsg}).  Attualmente
-                                 viene usato solo da \func{splice}, potrà essere
-                                 implementato in futuro anche per
-                                 \func{vmsplice} e \func{tee}.\\
-    \const{SPLICE\_F\_GIFT}    & Le pagine di memoria utente sono
-                                 ``\textsl{donate}'' al kernel; questo
-                                 significa che la cache delle pagine e i dati
-                                 su disco potranno differire, e che
-                                 l'applicazione non potrà modificare
-                                 quest'area di memoria. 
-                                 Se impostato una seguente \func{splice} che
-                                 usa \const{SPLICE\_F\_MOVE} potrà spostare le 
-                                 pagine con successo, altrimenti esse dovranno
-                                 essere copiate; per usare questa opzione i
-                                 dati dovranno essere opportunamente allineati
-                                 in posizione ed in dimensione alle pagine di
-                                 memoria. Viene usato soltanto da
-                                 \func{vmsplice}.\\
+    \constd{SPLICE\_F\_MOVE} & Suggerisce al kernel di spostare le pagine
+                               di memoria contenenti i dati invece di
+                               copiarle: per una maggiore efficienza
+                               \func{splice} usa quando possibile i
+                               meccanismi della memoria virtuale per
+                               eseguire i trasferimenti di dati. In maniera
+                               analoga a \func{mmap}), qualora le pagine non
+                               possano essere spostate dalla \textit{pipe} o
+                               il buffer non corrisponda a pagine intere
+                               esse saranno comunque copiate. Viene usato
+                               soltanto da \func{splice}.\\ 
+    \constd{SPLICE\_F\_NONBLOCK}& Richiede di operare in modalità non
+                                  bloccante; questo flag influisce solo sulle
+                                  operazioni che riguardano l'I/O da e verso la
+                                  \textit{pipe}. Nel caso di \func{splice}
+                                  questo significa che la funzione potrà
+                                  comunque bloccarsi nell'accesso agli altri
+                                  file descriptor (a meno che anch'essi non
+                                  siano stati aperti in modalità non
+                                  bloccante).\\
+    \constd{SPLICE\_F\_MORE} & Indica al kernel che ci sarà l'invio di
+                               ulteriori dati in una \func{splice}
+                               successiva, questo è un suggerimento utile
+                               che viene usato quando \param{fd\_out} è un
+                               socket. Questa opzione consente di utilizzare
+                               delle opzioni di gestione dei socket che
+                               permettono di ottimizzare le trasmissioni via
+                               rete (si veda la descrizione di
+                               \const{TCP\_CORK} in
+                               sez.~\ref{sec:sock_tcp_udp_options} e quella
+                               di \const{MSG\_MORE} in
+                               sez.~\ref{sec:net_sendmsg}).  Attualmente
+                               viene usato solo da \func{splice}, potrà essere
+                               implementato in futuro anche per
+                               \func{vmsplice} e \func{tee}.\\
+    \constd{SPLICE\_F\_GIFT} & Le pagine di memoria utente sono
+                               ``\textsl{donate}'' al kernel; questo
+                               significa che la cache delle pagine e i dati
+                               su disco potranno differire, e che
+                               l'applicazione non potrà modificare
+                               quest'area di memoria. 
+                               Se impostato una seguente \func{splice} che
+                               usa \const{SPLICE\_F\_MOVE} potrà spostare le 
+                               pagine con successo, altrimenti esse dovranno
+                               essere copiate; per usare questa opzione i
+                               dati dovranno essere opportunamente allineati
+                               in posizione ed in dimensione alle pagine di
+                               memoria. Viene usato soltanto da
+                               \func{vmsplice}.\\
     \hline
   \end{tabular}
   \caption{Le costanti che identificano i bit della maschera binaria
@@ -5439,6 +5473,9 @@ copiati i puntatori.
 % TODO?? dal 2.6.25 splice ha ottenuto il supporto per la ricezione su rete
 
 
+% TODO trattare qui copy_file_range (vedi http://lwn.net/Articles/659523/),
+% introdotta nel kernel 4.5
+
 \subsection{Gestione avanzata dell'accesso ai dati dei file}
 \label{sec:file_fadvise}
 
@@ -5568,19 +5605,19 @@ che utilizza semplicemente l'informazione.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{POSIX\_FADV\_NORMAL}  & Non ci sono avvisi specifici da fare
+    \constd{POSIX\_FADV\_NORMAL}  & Non ci sono avvisi specifici da fare
                                    riguardo le modalità di accesso, il
                                    comportamento sarà identico a quello che si
                                    avrebbe senza nessun avviso.\\ 
-    \const{POSIX\_FADV\_SEQUENTIAL}& L'applicazione si aspetta di accedere di
+    \constd{POSIX\_FADV\_SEQUENTIAL}& L'applicazione si aspetta di accedere di
                                    accedere ai dati specificati in maniera
                                    sequenziale, a partire dalle posizioni più
                                    basse.\\ 
-    \const{POSIX\_FADV\_RANDOM}  & I dati saranno letti in maniera
+    \constd{POSIX\_FADV\_RANDOM}  & I dati saranno letti in maniera
                                    completamente causale.\\
-    \const{POSIX\_FADV\_NOREUSE} & I dati saranno acceduti una sola volta.\\ 
-    \const{POSIX\_FADV\_WILLNEED}& I dati saranno acceduti a breve.\\ 
-    \const{POSIX\_FADV\_DONTNEED}& I dati non saranno acceduti a breve.\\ 
+    \constd{POSIX\_FADV\_NOREUSE} & I dati saranno acceduti una sola volta.\\ 
+    \constd{POSIX\_FADV\_WILLNEED}& I dati saranno acceduti a breve.\\ 
+    \constd{POSIX\_FADV\_DONTNEED}& I dati non saranno acceduti a breve.\\ 
     \hline
   \end{tabular}
   \caption{Valori delle costanti usabili per l'argomento \param{advice} di
@@ -5670,7 +5707,7 @@ dei buchi.\footnote{si ricordi che occorre scrivere per avere l'allocazione e
   che l'uso di \func{truncate} per estendere un file creerebbe soltanto uno
   \textit{sparse file} (vedi sez.~\ref{sec:file_lseek}) senza una effettiva
   allocazione dello spazio disco.}  In realtà questa è la modalità con cui la
-funzione veniva realizzata nella prima versione fornita dalle \acr{glibc}, per
+funzione veniva realizzata nella prima versione fornita dalla \acr{glibc}, per
 cui la funzione costituiva in sostanza soltanto una standardizzazione delle
 modalità di esecuzione di questo tipo di allocazioni.
 
@@ -5687,7 +5724,7 @@ solo a partire dal kernel 2.6.23 in cui è stata introdotta la nuova
   stato introdotto solo a partire dal kernel 2.6.25.}  che consente di
 realizzare direttamente all'interno del kernel l'allocazione dello spazio
 disco così da poter realizzare una versione di \func{posix\_fallocate} con
-prestazioni molto più elevate; nelle \acr{glibc} la nuova \textit{system call}
+prestazioni molto più elevate; nella \acr{glibc} la nuova \textit{system call}
 viene sfruttata per la realizzazione di \func{posix\_fallocate} a partire
 dalla versione 2.10.
 
@@ -5696,7 +5733,7 @@ esclusivamente su Linux, inizialmente \funcd{fallocate} non era stata definita
 come funzione di libreria,\footnote{pertanto poteva essere invocata soltanto
   in maniera indiretta con l'ausilio di \func{syscall}, vedi
   sez.~\ref{sec:proc_syscall}, come \code{long fallocate(int fd, int mode,
-      loff\_t offset, loff\_t len)}.} ma a partire dalle \acr{glibc} 2.10 è
+      loff\_t offset, loff\_t len)}.} ma a partire dalla \acr{glibc} 2.10 è
   stato fornito un supporto esplicito; il suo prototipo è:
 
 \begin{funcproto}{
@@ -5734,9 +5771,9 @@ quello di \func{posix\_fallocate} e si può considerare \func{fallocate} come
 l'implementazione ottimale della stessa a livello di kernel.
 
 Inizialmente l'unico altro valore possibile per \param{mode} era
-\const{FALLOC\_FL\_KEEP\_SIZE} che richiede che la dimensione del file (quella
-ottenuta nel campo \var{st\_size} di una struttura \struct{stat} dopo una
-chiamata a \texttt{fstat}) non venga modificata anche quando la somma
+\const{FALLOC\_FL\_KEEP\_SIZE} che richiede che la dimensione del file
+(quella ottenuta nel campo \var{st\_size} di una struttura \struct{stat} dopo
+una chiamata a \texttt{fstat}) non venga modificata anche quando la somma
 di \param{offset} e \param{len} eccede la dimensione corrente, che serve
 quando si deve comunque preallocare dello spazio per scritture in append. In
 seguito sono stati introdotti altri valori, riassunti in
@@ -5751,16 +5788,16 @@ allocazione dello spazio disco dei file.
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{FALLOC\_FL\_INSERT}     & .\\
-    \const{FALLOC\_FL\_COLLAPSE\_RANGE}& .\\ 
-    \const{FALLOC\_FL\_KEEP\_SIZE} & Mantiene invariata la dimensione del
+    \constd{FALLOC\_FL\_INSERT}     & .\\
+    \constd{FALLOC\_FL\_COLLAPSE\_RANGE}& .\\ 
+    \constd{FALLOC\_FL\_KEEP\_SIZE} & Mantiene invariata la dimensione del
                                      file, pur allocando lo spazio disco anche
                                      oltre la dimensione corrente del file.\\
-    \const{FALLOC\_FL\_PUNCH\_HOLE}& Crea un \textsl{buco} nel file (vedi
+    \constd{FALLOC\_FL\_PUNCH\_HOLE}& Crea un \textsl{buco} nel file (vedi
                                      sez.~\ref{sec:file_lseek}) rendendolo una
                                      \textit{sparse file} (dal kernel
                                      2.6.38).\\  
-    \const{FALLOC\_FL\_ZERO\_RANGE}& .\\ 
+    \constd{FALLOC\_FL\_ZERO\_RANGE}& .\\ 
     \hline
   \end{tabular}
   \caption{Valori delle costanti usabili per l'argomento \param{mode} di
@@ -5788,7 +5825,8 @@ file uno \textit{sparse file} a posteriori.
 
 
 % TODO non so dove trattarli, ma dal 2.6.39 ci sono i file handle, vedi
-% http://lwn.net/Articles/432757/ 
+% http://lwn.net/Articles/432757/ (probabilmente da associare alle
+% at-functions) 
 
 
 % LocalWords:  dell'I locking multiplexing cap sez system call socket BSD GID