Note su signalfd
[gapil.git] / fileadv.tex
index 98111fe18014604f28fa44ca2216d59aa98f5ef6..76cf7b66d8e0935870dee3dddcccc93bebd2f81f 100644 (file)
@@ -1,6 +1,6 @@
 %% fileadv.tex
 %%
-%% Copyright (C) 2000-2009 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2010 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -91,11 +91,12 @@ proteggere il suo accesso in scrittura.
 
 In Linux sono disponibili due interfacce per utilizzare l'\textit{advisory
   locking}, la prima è quella derivata da BSD, che è basata sulla funzione
-\func{flock}, la seconda è quella standardizzata da POSIX.1 (derivata da
-System V), che è basata sulla funzione \func{fcntl}.  I \textit{file lock}
-sono implementati in maniera completamente indipendente nelle due
-interfacce,\footnote{in realtà con Linux questo avviene solo dalla serie 2.0
-  dei kernel.}   che pertanto possono coesistere senza interferenze.
+\func{flock}, la seconda è quella recepita dallo standard POSIX.1 (che è
+derivata dall'interfaccia usata in System V), che è basata sulla funzione
+\func{fcntl}.  I \textit{file lock} sono implementati in maniera completamente
+indipendente nelle due interfacce,\footnote{in realtà con Linux questo avviene
+  solo dalla serie 2.0 dei kernel.}  che pertanto possono coesistere senza
+interferenze.
 
 Entrambe le interfacce prevedono la stessa procedura di funzionamento: si
 inizia sempre con il richiedere l'opportuno \textit{file lock} (un
@@ -103,11 +104,14 @@ inizia sempre con il richiedere l'opportuno \textit{file lock} (un
 lettura) prima di eseguire l'accesso ad un file.  Se il blocco viene acquisito
 il processo prosegue l'esecuzione, altrimenti (a meno di non aver richiesto un
 comportamento non bloccante) viene posto in stato di sleep. Una volta finite
-le operazioni sul file si deve provvedere a rimuovere il blocco. La situazione
-delle varie possibilità è riassunta in tab.~\ref{tab:file_file_lock}, dove si
-sono riportati, per le varie tipologie di blocco presenti su un file, il
-risultato che si ha in corrispondenza alle due tipologie di \textit{file lock}
-menzionate, nel successo della richiesta.
+le operazioni sul file si deve provvedere a rimuovere il blocco. 
+
+La situazione delle varie possibilità che si possono verificare è riassunta in
+tab.~\ref{tab:file_file_lock}, dove si sono riportati, a seconda delle varie
+tipologie di blocco già presenti su un file, il risultato che si avrebbe in
+corrispondenza di una ulteriore richiesta da parte di un processo di un blocco
+nelle due tipologie di \textit{file lock} menzionate, con un successo o meno
+della richiesta.
 
 \begin{table}[htb]
   \centering
@@ -116,7 +120,7 @@ menzionate, nel successo della richiesta.
     \hline
     \textbf{Richiesta} & \multicolumn{3}{|c|}{\textbf{Stato del file}}\\
     \cline{2-4}
-                  &Nessun \textit{lock}&\textit{Read lock}&\textit{Write lock}\\
+                &Nessun \textit{lock}&\textit{Read lock}&\textit{Write lock}\\
     \hline
     \hline
     \textit{Read lock} & SI & SI & NO \\
@@ -216,22 +220,22 @@ In fig.~\ref{fig:file_flock_struct} si 
 dell'implementazione del \textit{file locking} in stile BSD su Linux. Il punto
 fondamentale da capire è che un \textit{file lock}, qualunque sia
 l'interfaccia che si usa, anche se richiesto attraverso un file descriptor,
-agisce sempre su un file; perciò le informazioni relative agli eventuali
-\textit{file lock} sono mantenute a livello di inode\index{inode},\footnote{in
-  particolare, come accennato in fig.~\ref{fig:file_flock_struct}, i
-  \textit{file lock} sono mantenuti in una \itindex{linked~list}
-  \textit{linked list} di strutture \struct{file\_lock}. La lista è
-  referenziata dall'indirizzo di partenza mantenuto dal campo \var{i\_flock}
-  della struttura \struct{inode} (per le definizioni esatte si faccia
-  riferimento al file \file{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}).}  dato che questo è l'unico
-riferimento in comune che possono avere due processi diversi che aprono lo
-stesso file.
+agisce sempre su di un file; perciò le informazioni relative agli eventuali
+\textit{file lock} sono mantenute dal kernel a livello di
+inode\index{inode},\footnote{in particolare, come accennato in
+  fig.~\ref{fig:file_flock_struct}, i \textit{file lock} sono mantenuti in una
+  \itindex{linked~list} \textit{linked list} di strutture
+  \struct{file\_lock}. La lista è referenziata dall'indirizzo di partenza
+  mantenuto dal campo \var{i\_flock} della struttura \struct{inode} (per le
+  definizioni esatte si faccia riferimento al file \file{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}).}
+dato che questo è l'unico riferimento in comune che possono avere due processi
+diversi che aprono lo stesso file.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=15cm]{img/file_flock}
+  \includegraphics[width=15.5cm]{img/file_flock}
   \caption{Schema dell'architettura del \textit{file locking}, nel caso
     particolare del suo utilizzo da parte dalla funzione \func{flock}.}
   \label{fig:file_flock_struct}
@@ -267,10 +271,11 @@ con cui lo si 
   descriptor fa riferimento allo stesso file, ma attraverso una voce diversa
   della \itindex{file~table} \textit{file table}, come accade tutte le volte
   che si apre più volte lo stesso file.} o se si esegue la rimozione in un
-processo figlio; inoltre una volta tolto un \textit{file lock}, la rimozione
-avrà effetto su tutti i file descriptor che condividono la stessa voce nella
-\itindex{file~table} \textit{file table}, e quindi, nel caso di file
-descriptor ereditati attraverso una \func{fork}, anche su processi diversi.
+processo figlio. Inoltre una volta tolto un \textit{file lock} su un file, la
+rimozione avrà effetto su tutti i file descriptor che condividono la stessa
+voce nella \itindex{file~table} \textit{file table}, e quindi, nel caso di
+file descriptor ereditati attraverso una \func{fork}, anche per processi
+diversi.
 
 Infine, per evitare che la terminazione imprevista di un processo lasci attivi
 dei \textit{file lock}, quando un file viene chiuso il kernel provvede anche a
@@ -1760,26 +1765,29 @@ come si 
 che se arrivano più eventi fra due chiamate successive ad \func{epoll\_wait}
 questi vengano combinati. Inoltre qualora su un file descriptor fossero
 presenti eventi non ancora notificati, e si effettuasse una modifica
-dell'osservazione con \const{EPOLL\_CTL\_MOD} questi verrebbero riletti alla
+dell'osservazione con \const{EPOLL\_CTL\_MOD}, questi verrebbero riletti alla
 luce delle modifiche.
 
 Si tenga presente infine che con l'uso della modalità \textit{edge triggered}
-il ritorno di \func{epoll\_wait} indica un file descriptor è pronto e resterà
-tale fintanto che non si sono completamente esaurite le operazioni su di esso.
-Questa condizione viene generalmente rilevata dall'occorrere di un errore di
-\errcode{EAGAIN} al ritorno di una \func{read} o una \func{write},\footnote{è
-  opportuno ricordare ancora una volta che l'uso dell'\textit{I/O multiplexing}
-  richiede di operare sui file in modalità non bloccante.} ma questa non è la
-sola modalità possibile, ad esempio la condizione può essere riconosciuta
-anche con il fatto che sono stati restituiti meno dati di quelli richiesti.
+il ritorno di \func{epoll\_wait} indica che un file descriptor è pronto e
+resterà tale fintanto che non si sono completamente esaurite le operazioni su
+di esso.  Questa condizione viene generalmente rilevata dall'occorrere di un
+errore di \errcode{EAGAIN} al ritorno di una \func{read} o una
+\func{write},\footnote{è opportuno ricordare ancora una volta che l'uso
+  dell'\textit{I/O multiplexing} richiede di operare sui file in modalità non
+  bloccante.} ma questa non è la sola modalità possibile, ad esempio la
+condizione può essere riconosciuta anche per il fatto che sono stati
+restituiti meno dati di quelli richiesti.
 
 Come già per \func{select} e \func{poll} anche per l'interfaccia di
 \textit{epoll} si pone il problema di gestire l'attesa di segnali e di dati
 contemporaneamente, per far questo di nuovo è necessaria una variante della
 funzione di attesa che consenta di reimpostare all'uscita una maschera di
-segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll}; in
-questo caso la funzione si chiama \funcd{epoll\_pwait}\footnote{introdotta a
-  partire dal kernel 2.6.19.} ed il suo prototipo è:
+segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll} di
+\func{select} e \func{poll}; in questo caso la funzione si chiama
+\funcd{epoll\_pwait}\footnote{la funziona è stata introdotta a partire dal
+  kernel 2.6.19, ed è come tutta l'interfaccia di \textit{epoll}, specifica di
+  Linux.} ed il suo prototipo è:
 \begin{prototype}{sys/epoll.h} 
   {int epoll\_pwait(int epfd, struct epoll\_event * events, int maxevents, 
     int timeout, const sigset\_t *sigmask)}
@@ -1803,14 +1811,163 @@ in maniera atomica:
 Si tenga presente che come le precedenti funzioni di \textit{I/O multiplexing}
 anche le funzioni dell'interfaccia di \textit{epoll} vengono utilizzate
 prevalentemente con i server di rete, quando si devono tenere sotto
-osservazione un gran numero di socket; per questo motivo rimandiamo di nuovo
-la trattazione di un esempio concreto a quando avremo esaminato in dettaglio
-le caratteristiche dei socket, in particolare si potrà trovare un programma
-che utilizza questa interfaccia in sez.~\ref{sec:TCP_sock_multiplexing}.
+osservazione un gran numero di socket; per questo motivo rimandiamo anche in
+questo caso la trattazione di un esempio concreto a quando avremo esaminato in
+dettaglio le caratteristiche dei socket; in particolare si potrà trovare un
+programma che utilizza questa interfaccia in sez.~\ref{sec:TCP_serv_epoll}.
 
 \itindend{epoll}
 
 
+\subsection{La notifica di eventi tramite file descriptor}
+\label{sec:sig_signalfd_eventfd}
+
+Abbiamo visto in sez.~\ref{sec:file_select} come il meccanismo classico delle
+notifiche di eventi tramite i segnali, presente da sempre nei sistemi
+unix-like, porti a notevoli problemi nell'interazione con le funzioni per
+l'I/O multiplexing, tanto che per evitare possibili \itindex{race~condition}
+\textit{race condition} sono state introdotte estensioni dello standard POSIX e
+funzioni apposite come \func{pselect}, \func{ppoll} e \funcd{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
+una funzione di gestione in maniera asincrona e totalmente scorrelata
+dall'ordinario flusso di esecuzione del processo, si è però dimostrata quasi
+subito assai problematica. Oltre ai limiti relativi ai limiti al cosa si può
+fare all'interno della funzione del gestore di segnali (quelli illustrati in
+sez.~\ref{sec:sig_signal_handler}), c'è il problema più generale consistente
+nel fatto che questa modalità di funzionamento cozza con altre interfacce di
+programmazione previste dal sistema in cui si opera in maniera
+\textsl{sincrona}, come quelle dell'I/O multiplexing appena illustrate.
+
+In questo tipo di interfacce infatti ci si aspetta che il processo gestisca
+gli eventi a cui vuole rispondere in maniera sincrona generando le opportune
+risposte, mentre con l'arrivo di un segnale si possono avere interruzioni
+asincrone in qualunque momento.  Questo comporta la necessità di dover
+gestire, quando si deve tener conto di entrambi i tipi di eventi, le
+interruzioni delle funzioni di attesa sincrone, ed evitare possibili
+\itindex{race~condition} \textit{race conditions}.\footnote{in sostanza se non
+  fossero per i segnali non ci sarebbe da doversi preoccupare, fintanto che si
+  effettuano operazioni all'interno di un processo, della non atomicità delle
+  \index{system~call~lente} 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
+sincrona dei segnali con la funzione \func{sigwait} e le sue affini. Queste
+funzioni consentono di gestire i segnali bloccando un processo fino alla
+avvenuta ricezione e disabilitando l'esecuzione asincrona rispetto al resto
+del programma del gestore del segnale. Questo consente di risolvere i
+problemi di atomicità nella gestione degli eventi associati ai segnali, avendo
+tutto il controllo nel flusso principale del programma, ottenendo così una
+gestione simile a quella dell'I/O multiplexing, ma non risolve i problemi
+delle interazioni con quest'ultimo, perché o si aspetta la ricezione di un
+segnale o si aspetta che un file descriptor sia accessibile e nessuna delle
+rispettive funzioni consente di fare contemporaneamente entrambe le cose.
+
+Per risolvere questo problema nello sviluppo del kernel si è pensato di
+introdurre un meccanismo alternativo alla notifica dei segnali (esteso anche
+ad altri eventi generici) che, ispirandosi di nuovo alla filosofia di Unix per
+cui tutto è un file, consentisse di eseguire la notifica con l'uso di
+opportuni file descriptor.\footnote{ovviamente si tratta di una funzionalità
+  specifica di Linux, non presente in altri sistemi unix-like, e non prevista
+  da nessuno standard.}
+
+In sostanza, come per \func{sigwait}, si può disabilitare l'esecuzione di un
+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'I/O multiplexing (vale a dire con
+le solite \func{select}, \func{poll} e \funcd{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 che permette di abilitare la ricezione dei segnali tramite file
+descriptor è \funcd{signalfd},\footnote{in realtà quella riportata è la
+  interfacia alla funzione fornita dalle \acr{glibc}, esistono in realtà due
+  versioni diverse della \textit{system call}, la prima versione,
+  \func{signalfd}, introdotta nel kernel 2.6.22 e disponibile con le
+  \acr{glibc} 2.8 che non supporta l'argomento, ed una seconda versione, \func{signalfd4}, che prende
+  argomenti aggiuntivi, introdotta con il kernel 2.6.27 che è quella che viene
+  sempre usata a partire dalle \acr{glibc} 2.9.} il cui prototipo è:
+\begin{prototype}{sys/signalfd.h} 
+  {int signalfd(int fd, const sigset\_t *mask, int flags)}
+
+  Crea o modifica un file descriptor pet la ricezione dei segnali. 
+
+  \bodydesc{La funzione restituisce un numero di file descriptor in caso di
+    successo o $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno
+    dei valori:
+  \begin{errlist}
+  \item[\errcode{EBADF}] il valore \param{fd} non indica un file descriptor.
+  \item[\errcode{EINVAL}] il file descriptor \param{fd} non è stato ottenuto
+    con \func{signalfd} o il valore di \param{flags} non è valido.
+  \item[\errcode{ENOMEN}] non c'è memoria sufficiente per creare un nuovo file
+    descriptor di \func{signalfd}.
+  \item[\errcode{ENODEV}] il kernel non può montare internamente il
+    dispositivo per la gestione anonima degli inode associati al file
+    descriptor.
+  \end{errlist}
+  ed inoltre \errval{EMFILE} e \errval{ENFILE}.  
+}
+\end{prototype}
+
+La funzione consente di creare o modificare le caratteristiche di un file
+descriptor speciale su cui ricevere le notifiche della ricezione di
+segnali. Per creare ex-novo uno di questi file descriptor è necessario passare
+$-1$ come valore per l'argomento \param{fd}, ogni altro valore positivo verrà
+invece interpretato come il numero del file descriptor (che deve esser stato
+precedentemente creato sempre con \func{signalfd}) di cui si vogliono
+modificare le caratteristiche. Nel primo caso la funzione ritornerà il valore
+del nuovo file descriptor e nel secondo caso il valore indicato
+con \param{fd}, in caso di errore invece verrà restituito $-1$.
+
+L'elenco dei segnali che si vogliono gestire con \func{signalfd} deve essere
+specificato tramite l'argomento \param{mask}. Questo deve essere passato come
+puntatore ad una maschera di segnali creata con l'uso delle apposite macro già
+illustrate in sez.~\ref{sec:sig_sigset}; la maschera deve indicare su quali
+segnali si intende operare con \func{signalfd}; l'elenco può essere modificato
+con una successiva chiamata a \func{signalfd}. Dato che \const{SIGKILL} e
+\const{SIGSTOP} non possono essere intercettati (e non prevedono neanche la
+possibilità di un gestore) un loro inserimento nella maschera verrà ignorato,
+senza generare errori.
+
+L'argomento \param{flags} consente di impostare direttamente in fase di
+creazione due flag per il file descriptor analoghe a quelle che si possono
+impostare con \func{open}, evitando una impostazione successiva con
+\func{fcntl}.\footnote{questo è un argomento aggiuntivo, introdotto con la
+  versione fornita a partire dal kernel 2.6.27, per kernel precedenti il
+  valore deve essere nullo.}
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Valore}  & \textbf{Significato} \\
+    \hline
+    \hline
+    \const{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
+                           chiusura automatica del file descriptor nella
+                           esecuzione di \func{exec}.\\
+    \hline    
+  \end{tabular}
+  \caption{Valori dell'argomento \param{flags} per la funzione \func{signalfd}
+    che consentono di impostare fl.} 
+  \label{tab:signalfd_flags}
+\end{table}
+
+% TODO trattare qui eventfd signalfd e timerfd introdotte con il 2.6.22 
+% timerfd è stata tolta nel 2.6.23 e rifatta per bene nel 2.6.25
+% vedi: http://lwn.net/Articles/233462/
+%       http://lwn.net/Articles/245533/
+%       http://lwn.net/Articles/267331/
+
+
+
 \section{L'accesso \textsl{asincrono} ai file}
 \label{sec:file_asyncronous_access}
 
@@ -2076,7 +2233,7 @@ kernel 
 \textit{lease breaker} rimaste bloccate proseguono automaticamente.
 
 
-\index{file!dnotify|(}
+\itindbeg{dnotify}
 
 Benché possa risultare utile per sincronizzare l'accesso ad uno stesso file da
 parte di più processi, l'uso dei \textit{file lease} non consente comunque di
@@ -2154,7 +2311,7 @@ specificate in chiamate successive vengono aggiunte a quelle gi
 nelle precedenti.  Se si vuole rimuovere la notifica si deve invece
 specificare un valore nullo.
 
-\index{file!inotify|(}
+\itindbeg{inotify}
 
 Il maggiore problema di \textit{dnotify} è quello della scalabilità: si deve
 usare un file descriptor per ciascuna directory che si vuole tenere sotto
@@ -2174,7 +2331,7 @@ sez.~\ref{sec:sig_adv_control}.  Per tutta questa serie di motivi in generale
 quella di \textit{dnotify} viene considerata una interfaccia di usabilità
 problematica.
 
-\index{file!dnotify|)}
+\itindend{dnotify}
 
 Per risolvere i problemi appena illustrati è stata introdotta una nuova
 interfaccia per l'osservazione delle modifiche a file o directory, chiamata
@@ -2656,10 +2813,10 @@ verificano pi
 dei campi \var{wd}, \var{mask}, \var{cookie}, e \var{name}) questi vengono
 raggruppati in un solo evento.
 
-\index{file!inotify|)}
+\itindend{inotify}
 
 % TODO trattare fanotify, vedi http://lwn.net/Articles/339399/ e 
-% http://lwn.net/Articles/343346/ 
+% http://lwn.net/Articles/343346/ (incluso nel 2.6.36)
 
 
 \subsection{L'interfaccia POSIX per l'I/O asincrono}
@@ -2736,35 +2893,11 @@ come vedremo, permette di eseguire con una sola chiamata una serie di
 operazioni, usando un vettore di \textit{control block}. Tramite questo campo
 si specifica quale è la natura di ciascuna di esse.
 
-\begin{figure}[!htb]
-  \footnotesize \centering
-  \begin{minipage}[c]{15cm}
-    \includestruct{listati/sigevent.h}
-  \end{minipage} 
-  \normalsize 
-  \caption{La struttura \structd{sigevent}, usata per specificare le modalità
-    di notifica degli eventi relativi alle operazioni di I/O asincrono.}
-  \label{fig:file_sigevent}
-\end{figure}
-
 Infine il campo \var{aio\_sigevent} è una struttura di tipo \struct{sigevent}
-che serve a specificare il modo in cui si vuole che venga effettuata la
-notifica del completamento delle operazioni richieste. La struttura è
-riportata in fig.~\ref{fig:file_sigevent}; il campo \var{sigev\_notify} è
-quello che indica le modalità della notifica, esso può assumere i tre valori:
-\begin{basedescript}{\desclabelwidth{2.6cm}}
-\item[\const{SIGEV\_NONE}]  Non viene inviata nessuna notifica.
-\item[\const{SIGEV\_SIGNAL}] La notifica viene effettuata inviando al processo
-  chiamante il segnale specificato da \var{sigev\_signo}; se il gestore di
-  questo è stato installato con \const{SA\_SIGINFO} gli verrà restituito il
-  valore di \var{sigev\_value} (la cui definizione è in
-  fig.~\ref{fig:sig_sigval}) come valore del campo \var{si\_value} di
-  \struct{siginfo\_t}.
-\item[\const{SIGEV\_THREAD}] La notifica viene effettuata creando un nuovo
-  \itindex{thread} \textit{thread} che esegue la funzione specificata da
-  \var{sigev\_notify\_function} con argomento \var{sigev\_value}, e con gli
-  attributi specificati da \var{sigev\_notify\_attribute}.
-\end{basedescript}
+(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
+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}.
 
 Le due funzioni base dell'interfaccia per l'I/O asincrono sono
 \funcd{aio\_read} ed \funcd{aio\_write}.  Esse permettono di richiedere una
@@ -3044,7 +3177,7 @@ file in una sezione dello spazio di indirizzi del processo che lo ha allocato.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=14cm]{img/mmap_layout}
+  \includegraphics[width=12cm]{img/mmap_layout}
   \caption{Disposizione della memoria di un processo quando si esegue la
   mappatura in memoria di un file.}
   \label{fig:file_mmap_layout}
@@ -4729,13 +4862,16 @@ dello spazio disco cos
   realizzazione di \func{posix\_fallocate} a partire dalla versione 2.10.}
 
 Trattandosi di una funzione di servizio, ed ovviamente disponibile
-esclusivamente su Linux, \funcd{fallocate} non è stata definita come funzione
-di libreria e pertanto può essere invocata da un programma soltanto in maniera
-indiretta con l'ausilio di \func{syscall} (vedi sez.~\ref{sec:intro_syscall});
-il suo prototipo è:
+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:intro_syscall}, come \code{long fallocate(int fd, int mode,
+      loff\_t offset, loff\_t len)}.} ma a partire dalle \acr{glibc} 2.10 è
+  stato fornito un supporto esplicito; il suo prototipo è:
 \begin{functions}
-  \headdecl{linux/falloc.h}
-  \funcdecl{long fallocate(int fd, int mode, loff\_t offset, loff\_t len)}
+  \headdecl{linux/fcntl.h} 
+
+  \funcdecl{int fallocate(int fd, int mode, off\_t offset, off\_t len)}
 
   Prealloca dello spazio disco per un file.
   
@@ -4775,12 +4911,8 @@ estensione dello stesso viene aggiornata, come richiesto per
 \func{fallocate} come l'implementazione ottimale di \func{posix\_fallocate} a
 livello di kernel.
 
-
-% TODO documentare \func{fallocate}, introdotta con il 2.6.23
 % vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/
 % http://kernelnewbies.org/Linux_2_6_23
-% \func{fallocate} con il 2.6.25 supporta pure XFS
-
 
 
 
@@ -4846,6 +4978,7 @@ livello di kernel.
 % LocalWords:  POLLRDHUP half close pwait Gb madvise MADV ahead REMOVE tmpfs
 % LocalWords:  DONTFORK DOFORK shmfs preadv pwritev syscall linux loff head XFS
 % LocalWords:  MERGEABLE EOVERFLOW prealloca hole FALLOC KEEP stat fstat
+% LocalWords:  conditions sigwait
 
 
 %%% Local Variables: