From 3dbc1b59f029f1ae890d56f209e8ddacaf468a73 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 17 Jun 2007 13:27:50 +0000 Subject: [PATCH] Altre aggiunte e modifiche --- fileadv.tex | 80 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 34d7ccc..9a717f2 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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. -- 2.30.2