Materiale aggiuntivo, da completare la revisione.
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 8 Apr 2014 12:16:38 +0000 (12:16 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 8 Apr 2014 12:16:38 +0000 (12:16 +0000)
fileadv.tex

index 60a002b3e2f4769c897878ed68a891fb25c88354..00fad4adfe2a808c14ffa57e5c861aac7e782092 100644 (file)
@@ -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