From 47d10afa7a33ffb8e4fa6a49d07d72b928bec420 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 8 Apr 2014 12:16:38 +0000 Subject: [PATCH] Materiale aggiuntivo, da completare la revisione. --- fileadv.tex | 53 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 60a002b..00fad4a 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -8,7 +8,6 @@ %% 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 @@ -1601,14 +1600,19 @@ i cui prototipi sono: } \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 @@ -1697,11 +1701,32 @@ delle operazioni cui fanno riferimento. % 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 -- 2.30.2