Altre revisioni e aggiunta epoll_pwait
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 26 Aug 2009 21:49:32 +0000 (21:49 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 26 Aug 2009 21:49:32 +0000 (21:49 +0000)
fileadv.tex
gapil.tex
listati/epoll_pwait_means.c [new file with mode: 0644]

index 9e732547eb7122948ba69907a40944a71792e0f6..983a14ccef9e0ad773ef044061c22d500dda1112 100644 (file)
@@ -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
index 961c36b5a1dee549e4b2268d4e53bfe99a8aac15..ceb5c0131ec62af3f4724c29a5f6d9a2544e723f 100644 (file)
--- a/gapil.tex
+++ b/gapil.tex
 \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 (file)
index 0000000..75645f1
--- /dev/null
@@ -0,0 +1,5 @@
+sigset_t origmask;
+
+sigprocmask(SIG_SETMASK, &sigmask, &origmask);
+ready = epoll_wait(epfd, &events, maxevents, timeout);
+sigprocmask(SIG_SETMASK, &origmask, NULL);