From: Simone Piccardi Date: Wed, 26 Aug 2009 21:49:32 +0000 (+0000) Subject: Altre revisioni e aggiunta epoll_pwait X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=7186ce7b398622a10d1c6400bf9a8ad0243d8a2d;p=gapil.git Altre revisioni e aggiunta epoll_pwait --- diff --git a/fileadv.tex b/fileadv.tex index 9e73254..983a14c 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -892,6 +892,7 @@ possibilit \section{L'\textit{I/O multiplexing}} \label{sec:file_multiplexing} + Uno dei problemi che si presentano quando si deve operare contemporaneamente su molti file usando le funzioni illustrate in cap.~\ref{cha:file_unix_interface} e cap.~\ref{cha:files_std_interface} è che @@ -1594,8 +1595,6 @@ sotto controllo. L'argomento viene ignorato con l'operazione che questo fosse un puntatore valido, anche se poi veniva ignorato, a partire dal 2.6.9 si può specificare anche un valore \texttt{NULL}.} - - \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} @@ -1613,7 +1612,7 @@ 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 @@ -1774,16 +1773,40 @@ Questa condizione viene generalmente rilevata dall'occorrere di un errore di sola modalità possibile, ad esempio la condizione può essere riconosciuta anche con il fatto che sono stati restituiti meno dati di quelli richiesti. -Come le precedenti \func{select} e \func{poll}, le funzioni dell'interfaccia -di \textit{epoll} vengono utilizzate prevalentemente con i server di rete, -quando si devono tenere sotto osservazione un gran numero di socket; per -questo motivo rimandiamo di nuovo la trattazione di un esempio concreto a -quando avremo esaminato in dettaglio le caratteristiche dei socket, in -particolare si potrà trovare un programma che utilizza questa interfaccia in -sez.~\ref{sec:TCP_sock_multiplexing}. +Come già per \func{select} e \func{poll} anche per l'interfaccia di +\textit{epoll} si pone il problema di gestire l'attesa di segnali e di dati +contemponeamente, per far questo di nuovo è necessaria una variante della +funzione di attesa che consenta di reimpostare all'uscita una maschera di +segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll}; in +questo caso la funzione si chiama \funcd{epoll\_pwait} ed il suo prototipo è: +\begin{prototype}{sys/epoll.h} + {int epoll\_pwait(int epfd, struct epoll\_event * events, int maxevents, + int timeout, const sigset_t *sigmask)} -\itindend{epoll} + Attende che uno dei file descriptor osservati sia pronto, mascherando i + segnali. + \bodydesc{La funzione restituisce il numero di file descriptor pronti in + caso di successo o $-1$ in caso di errore, nel qual caso \var{errno} + assumerà uno dei valori già visti con \funcd{epoll\_wait}. +} +\end{prototype} + +La funzione è del tutto analoga \funcd{epoll\_wait}, soltanto che alla sua +uscita viene ripristinata la maschera di segnali impostata con +l'argomento \param{sigmask}, in sostanza la chiamata a questa funzione è +equivalente al seguente codice, eseguito però in maniera atomica: +\includecodesnip{listati/epoll_pwait_means.c} + +Si tenga presente che come le precedenti funzioni di \textit{I/O multiplexing} +anche le funzioni dell'interfaccia di \textit{epoll} vengono utilizzate +prevalentemente con i server di rete, quando si devono tenere sotto +osservazione un gran numero di socket; per questo motivo rimandiamo di nuovo +la trattazione di un esempio concreto a quando avremo esaminato in dettaglio +le caratteristiche dei socket, in particolare si potrà trovare un programma +che utilizza questa interfaccia in sez.~\ref{sec:TCP_sock_multiplexing}. + +\itindend{epoll} \section{L'accesso \textsl{asincrono} ai file} @@ -3722,7 +3745,8 @@ ma si perder % inserite nel kernel 2.6.30, vedi http://lwn.net/Articles/326818/ -\subsection{L'I/O diretto fra file descriptor: \func{sendfile} e \func{splice}} +\subsection{L'I/O diretto fra file descriptor: \func{sendfile} e + \func{splice}} \label{sec:file_sendfile_splice} Uno dei problemi che si presentano nella gestione dell'I/O è quello in cui si diff --git a/gapil.tex b/gapil.tex index 961c36b..ceb5c01 100644 --- a/gapil.tex +++ b/gapil.tex @@ -157,8 +157,8 @@ \include{system} \include{signal} \include{session} -\include{fileadv} \include{ipc} +\include{fileadv} \include{thread} % Commentare sotto se si genera la prima parte diff --git a/listati/epoll_pwait_means.c b/listati/epoll_pwait_means.c new file mode 100644 index 0000000..75645f1 --- /dev/null +++ b/listati/epoll_pwait_means.c @@ -0,0 +1,5 @@ +sigset_t origmask; + +sigprocmask(SIG_SETMASK, &sigmask, &origmask); +ready = epoll_wait(epfd, &events, maxevents, timeout); +sigprocmask(SIG_SETMASK, &origmask, NULL);