Altre aggiunte e modifiche
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 17 Jun 2007 13:27:50 +0000 (13:27 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 17 Jun 2007 13:27:50 +0000 (13:27 +0000)
fileadv.tex

index 34d7ccc0c2523e468f1b5ad4484541b38718e72d..9a717f2e9b76b4370dd2d4ec1c24b1674f628221 100644 (file)
@@ -1,4 +1,4 @@
-%% fileadv.tex
+gb%% fileadv.tex
 %%
 %% Copyright (C) 2000-2007 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
@@ -616,8 +616,11 @@ chiamare la funzione \funcd{epoll\_create}, il cui prototipo 
 }
 \end{prototype}
 
-La funzione restituisce un file descriptor speciale, detto anche \textit{epoll
-  descriptor} che viene associato alla infrastruttura utilizzata dal kernel
+La funzione restituisce 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; l'argomento \param{size} serve a dare
 l'indicazione del numero di file descriptor che si vorranno tenere sotto
 controllo, ma costituisce solo un suggerimento per semplificare l'allocazione
@@ -653,7 +656,7 @@ controllare, per questo si deve usare la seconda funzione dell'interfaccia,
 
 Il comportamento della funzione viene controllato dal valore dall'argomento
 \param{op} che consente di specificare quale operazione deve essere eseguita.
-Le costanti che definiscono i valori utilizzabili per l'argomento \param{op}
+Le costanti che definiscono i valori utilizzabili per \param{op}
 sono riportate in tab.~\ref{tab:epoll_ctl_operation}, assieme al significato
 delle operazioni cui fanno riferimento.
 
@@ -710,17 +713,18 @@ sotto controllo.  L'argomento viene ignorato con
   \label{fig:epoll_event}
 \end{figure}
 
-
-La struttura \struct{epoll\_event} è l'analoga di \struct{pollfd} e serve da
-una parte ad impostare quali eventi osservare, dall'altra a ricevere le
-notifiche degli eventi avvenuti.  La sua definizione è riportata in
-fig.~\ref{fig:epoll_event}; il primo campo, \var{events}, è una maschera
-binaria in cui ciascun bit corrisponde o ad un tipo di evento, o una modalità
-di notifica. Detto campo deve essere specificato come OR aritmetico delle
-costanti riportate in tab.~\ref{tab:epoll_events}. Il secondo campo,
-\var{data}, serve ad indicare a quale file descriptor si intende fare
-riferimento, ed in astratto può contenere un valore qualsiasi che permetta di
-identificarlo, di norma comunque si usa come valore lo stesso \param{fd}.
+La struttura \struct{epoll\_event} è l'analoga di \struct{pollfd} e come
+quest'ultima serve sia in ingresso (quando usata con \func{epoll\_ctl}) ad
+impostare quali eventi osservare, che in uscita (nei risultati ottenuti con
+\func{epoll\_wait}) per ricevere le notifiche degli eventi avvenuti.  La sua
+definizione è riportata in fig.~\ref{fig:epoll_event}; il primo campo,
+\var{events}, è una maschera binaria in cui ciascun bit corrisponde o ad un
+tipo di evento, o una modalità di notifica. Detto campo deve essere
+specificato come OR aritmetico delle costanti riportate in
+tab.~\ref{tab:epoll_events}. Il secondo campo, \var{data}, serve ad indicare a
+quale file descriptor si intende fare riferimento, ed in astratto può
+contenere un valore qualsiasi che permetta di identificarlo, di norma comunque
+si usa come valore lo stesso \param{fd}.
 
 \begin{table}[htb]
   \centering
@@ -734,23 +738,55 @@ identificarlo, di norma comunque si usa come valore lo stesso \param{fd}.
                           (analogo di \const{POLLIN}).\\
     \const{EPOLLOUT}    & Il file è pronto per le operazioni di scrittura
                           (analogo di \const{POLLOUT}).\\
-    \const{EPOLLRDHUP}  & .\\
+    \const{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}).\\
     \const{EPOLLPRI}    & Ci sono \itindex{out-of-band} dati urgenti
                           disponibili in lettura (analogo di
-                          \const{POLLPRI}).\\ 
+                          \const{POLLPRI}); questa condizione viene comunque
+                          riportata in uscita, e non è necessaria impostarla
+                          in ingresso.\\ 
     \const{EPOLLERR}    & Si è verificata una condizione di errore 
-                          (analogo di \const{POLLERR}).\\
+                          (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.\\
-    \const{EPOLLET}     & .\\
-    \const{EPOLLONESHOT}& .\\
+    \const{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
+                          descriptor associato.\footnotemark\\
     \hline    
   \end{tabular}
   \caption{Valori del campo \param{events} di \struct{epoll\_event}.} 
   \label{tab:epoll_events}
 \end{table}
 
-
-
+\footnotetext{questa modalità è disponibile solo a partire dal kernel 2.6.2.}
+
+Le modalità di utilizzo di \textit{epoll} prevedano che si definisca un
+insieme di file descriptor da tenere sotto controllo su un \textit{epoll
+  descriptor} \param{epfd} con una serie di chiamate a
+\const{EPOLL\_CTL\_ADD}.  Il default prevede la notifica in modalità
+\textit{level triggered}, a meno che sul file descriptor non si sia impostata
+la modalità \textit{edge triggered} con \const{EPOLLET}.  Si tenga presente
+che è possibile tenere sotto osservazione uno stesso file descriptor su due
+\textit{epoll descriptor} diversi, ed entrambi riceveranno le notifiche, ma la
+pratica è sconsigliata.
+
+Una particolare modalità di notifica è quella impostata con
+\const{EPOLLONESHOT}: quando si è in modalità \textit{edge triggered} l'arrivo
+in rapida successione di dati in blocchi separati causa la generazione di una
+serie di eventi multipli; in questo caso si può utilizzare la modalità
+\textit{one-shot} in cui la notifica viene effettuata solo la prima volta,
+dopo di che il file descriptor osservato, pur restando nella lista di
+\param{epfd}, viene disattivato, e per essere riutilizzato dovrà essere
+riabilitato con una successiva chiamata con \const{EPOLL\_CTL\_MOD}.
+
+
+Infine qualora un file descriptor posto sotto osservazione dovesse essere
+chiuso, esso sarà automaticamente eliminato dall'insieme dei file descriptor
+osservati.