%% license is included in the section entitled "GNU Free Documentation
%% License".
%%
-
\chapter{La gestione avanzata dei file}
\label{cha:file_advanced}
In questo capitolo affronteremo le tematiche relative alla gestione avanzata
}
\end{funcproto}
-Entrambe le funzioni restituiscono un file descriptor speciale,\footnote{esso
- non è associato a nessun file su disco, inoltre a differenza dei normali
- file descriptor non può essere inviato ad un altro processo attraverso un
- socket locale (vedi sez.~\ref{sec:sock_fd_passing}).} detto anche
-\textit{epoll descriptor}, che viene associato alla infrastruttura utilizzata
-dal kernel per gestire la notifica degli eventi. Una volta che se ne sia
-terminato l'uso si potranno rilasciare tutte le risorse allocate chiudendolo
-come ogni altro file descriptor con \func{close}.
+Entrambe le funzioni restituiscono un file descriptor, detto anche
+\textit{epoll descriptor}; si tratta di un file descriptor speciale (per cui
+\func{read} e \func{write} non sono supportate) che viene associato alla
+infrastruttura utilizzata dal kernel per gestire la notifica degli eventi, e
+che può a sua volta essere messo sotto osservazione con una chiamata a
+\func{select}, \func{poll} o \func{epoll\_ctl}; in tal caso risulterà pronto
+quando saranno disponibili eventi da notificare riguardo i file descriptor da
+lui osservati.\footnote{è anche possibile inviarlo ad un altro processo
+ attraverso un socket locale (vedi sez.~\ref{sec:sock_fd_passing}) ma
+ l'operazione non ha alcun senso dato che il nuovo processo non avrà a
+ disposizione le copie dei file descriptor messe sotto osservazione tramite
+ esso.} Una volta che se ne sia terminato l'uso si potranno rilasciare tutte
+le risorse allocate chiudendolo semplicemente con \func{close}.
Nel caso di \func{epoll\_create} l'argomento \param{size} serviva a dare
l'indicazione del numero di file descriptor che si vorranno tenere sotto
% http://lwn.net/Articles/520012/ e http://lwn.net/Articles/520198/
La funzione prende sempre come primo argomento un file descriptor di
-\textit{epoll}, \param{epfd}, che deve essere stato ottenuto in precedenza con
-una chiamata a \func{epoll\_create}. L'argomento \param{fd} indica invece il
-file descriptor che si vuole tenere sotto controllo, quest'ultimo può essere
-un qualunque file descriptor utilizzabile con \func{poll}, ed anche un altro
-file descriptor di \textit{epoll}, ma non lo stesso \param{epfd}.
+\textit{epoll}, \param{epfd}, che indica quale istanza di \textit{epoll} usare
+e deve pertanto essere stato ottenuto in precedenza con una chiamata a
+\func{epoll\_create}. L'argomento \param{fd} indica invece il file descriptor
+che si vuole tenere sotto controllo, quest'ultimo può essere un qualunque file
+descriptor utilizzabile con \func{poll}, ed anche un altro file descriptor di
+\textit{epoll}, ma non lo stesso \param{epfd}.
+
+Anche se è possibile tenere sotto controllo lo stesso file descriptor in due
+istanze distinte di \textit{epoll} in genere questo è sconsigliato in quanto
+entrambe riceveranno le notifiche, ma gestire correttamente le notifiche
+multiple richiede molta attenzione. Se invece si cerca di inserire due volte
+lo stesso file descriptor nella stessa istanza di \textit{epoll} (con lo
+stesso \param{epfd}) la funzione fallirà con un errore di \errval{EEXIST}.
+Tuttavia è possibile inserire nella stessa istanza file descriptor duplicati
+(si ricordi quanto visto in sez.~\ref{sec:file_dup}), una tecnica che può
+essere usata per registrarli con un valore diverso per \param{events} e
+classificare così diversi tipi di eventi.
+
+Si tenga presente che quando si chiude un file descriptor questo, se era stato
+posto sotto osservazione da una istanza di \textit{epoll}, viene rimosso
+automaticamente solo nel caso esso sia l'unico riferimento al file sottostante
+(alla struttura \kstruct{file}, si ricordi fig.~\ref{fig:file_dup}), quindi
+qualora esso sia stato duplicato si potranno ricevere eventi relativi ad esso
+anche dopo che lo si è chiuso, per evitare questo è necessario rimuoverlo
+esplicitamente dalla lista dei file descriptor mantenuti sotto controllo con
+\const{EPOLL\_CTL\_DEL}.
L'ultimo argomento, \param{event}, deve essere un puntatore ad una struttura
di tipo \struct{epoll\_event}, ed ha significato solo con le operazioni