\subsection{La funzione \func{poll}}
\label{sec:file_poll}
-System V, invece di utilizzare l'interfaccia di \func{select}, che è una
-estensione creata nello sviluppo di BSD, ha introdotto una sua interfaccia per
-gestire l'\textit{I/O multiplexing}, basata sulla funzione
-\funcd{poll},\footnote{la funzione è prevista dallo standard XPG4, ed è stata
- introdotta in Linux come system call a partire dal kernel 2.1.23 ed inserita
- nelle \acr{libc} 5.4.28.} il cui prototipo è:
+Nello sviluppo di System V, invece di utilizzare l'interfaccia di
+\func{select}, che è una estensione tipica di BSD, è stata introdotta un'altra
+interfaccia, basata sulla funzione \funcd{poll},\footnote{la funzione è
+ prevista dallo standard XPG4, ed è stata introdotta in Linux come system
+ call a partire dal kernel 2.1.23 ed inserita nelle \acr{libc} 5.4.28.} il
+cui prototipo è:
\begin{prototype}{sys/poll.h}
{int poll(struct pollfd *ufds, unsigned int nfds, int timeout)}
ed inoltre \errval{EFAULT} e \errval{ENOMEM}.}
\end{prototype}
-La funzione permette di tenere sotto controllo un certo numero \param{ndfs} di
-file descriptor, specificati attraverso un vettore di puntatori a strutture
-\struct{pollfd}. Come \func{select} anche \func{poll} permette di
-interrompere l'attesa dopo un certo tempo, che va specificato attraverso
+La funzione permette di tenere sotto controllo contemporaneamente \param{ndfs}
+file descriptor, specificati attraverso il puntatore \param{ufds} ad un
+vettore di strutture \struct{pollfd}. Come con \func{select} si può
+interrompere l'attesa dopo un certo tempo, questo deve essere specificato con
l'argomento \param{timeout} in numero di millisecondi: un valore negativo
-indica un'attesa indefinita mentre si può usare un valore nullo per eseguire
-la funzione in modalità \textsl{non-bloccante}.
+indica un'attesa indefinita, mentre un valore comporta il ritorno immediato (e
+può essere utilizzato per impiegare \func{poll} in modalità
+\textsl{non-bloccante}).
\begin{figure}[!htb]
\footnotesize \centering
\label{fig:file_pollfd}
\end{figure}
-Per ciascun file da controllare deve essere opportunamente predisposta una
-struttura \struct{pollfd}, la cui definizione è riportata in
-\figref{fig:file_pollfd}. La struttura prevede tre campi: il campo \var{fd}
-viene utilizzato per specificare il file descriptor relativo al file da
-controllare, mentre nel campo \var{events} deve essere specificata una
-maschera binaria data in ingresso che indichi il tipo di evento che si vuole
-controllare, il kernel restituirà il relativo risultato nel campo
-\var{revents}. Usando un valore negativo per \param{fd} la corrispondente
-struttura sarà ignorata da \func{poll}.
+Per ciascun file da controllare deve essere inizializzata una struttura
+\struct{pollfd} nel vettore indicato dall'argomento \param{ufds}. La
+struttura, la cui definizione è riportata in \figref{fig:file_pollfd}, prevede
+tre campi: in \var{fd} deve essere indicato il numero del file descriptor da
+controllare, in \var{events} deve essere specificata una maschera binaria di
+flag che indichino il tipo di evento che si vuole controllare, mentre in
+\var{revents} il kernel restituirà il relativo risultato. Usando un valore
+negativo per \param{fd} la corrispondente struttura sarà ignorata da
+\func{poll}. Dato che i dati in ingresso sono del tutto indipendenti da quelli
+in uscita (che vengono restituiti in \var{revents}) non è necessario
+reinizializzare tutte le volte il valore delle strutture \struct{pollfd} a
+meno di non voler cambiare qualche condizione.
Le costanti che definiscono i valori relativi ai bit usati nelle maschere
binarie dei campi \var{events} e \var{revents} sono riportati in
\label{tab:file_pollfd_flags}
\end{table}
-Infine il valore \const{POLLMSG} non viene utilizzato ed è definito solo per
-compatibilità con l'implementazione di SysV, dove indica segnale
-\const{SIGPOLL} è arrivato alla cima dello \textit{stream}. Gli
-\textit{stream} sono una interfaccia specifica di SysV non presente in Linux,
-e non hanno nulla a che fare con i file \textit{stream} delle librerie
-standard del C, è da questi che derivano i nomi delle costanti, in quanto per
-essi sono definite tre classi di dati: \textsl{normali}, \textit{prioritari}
-ed \textit{urgenti}. Nel caso di Linux la distinzione ha senso solo nel caso
-per i dati \textit{out-of-band} dei socket (vedi
+Il valore \const{POLLMSG} non viene utilizzato ed è definito solo per
+compatibilità con l'implementazione di SysV che usa gli
+\textit{stream};\footnote{essi sono una interfaccia specifica di SysV non
+ presente in Linux, e non hanno nulla a che fare con i file \textit{stream}
+ delle librerie standard del C.} è da questi che derivano i nomi di alcune
+costanti, in quanto per essi sono definite tre classi di dati:
+\textsl{normali}, \textit{prioritari} ed \textit{urgenti}.} In Linux la
+distinzione ha senso solo per i dati \textit{out-of-band} dei socket (vedi
\secref{sec:TCP_urgent_data}), ma su questo e su come \func{poll} reagisce
alle varie condizioni dei socket torneremo in \secref{sec:TCP_serv_poll}, dove
-vedremo anche un esempio del suo utilizzo.
+vedremo anche un esempio del suo utilizzo. Si tenga conto comunque che le
+costanti relative ai diversi tipi di dati (come \macro{POLLRDNORM} e
+\macro{POLLRDBAND}) sono utilizzabili soltanto qualora si sia definito
+\macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di farlo sempre in testa al
+ file, definirla soltanto prima di includere \file{sys/poll.h} non è
+ sufficiente.}
In caso di successo funzione ritorna restituendo il numero di file (un valore
positivo) per i quali si è verificata una delle condizioni di attesa richieste
%\label{sec:file_epoll}
% placeholder ...
-
-
+%da fare
\section{Altre modalità e funzioni di I/O avanzato}
\label{sec:file_advanced_io}
questa sezione.
-\subsection{L'I/O asincrono}
-\label{sec:file_asyncronous_io}
+\subsection{L'apertura asincrona dei file}
+\label{sec:file_asyncronous_open}
-Una modalità alternativa all'uso dell'\textit{I/O multiplexing} è quella di
-fare ricorso al cosiddetto \textsl{I/O asincrono}. Il concetto base
-dell'\textsl{I/O asincrono} è che le funzioni di I/O non attendono il
-completamento delle operazioni prima di ritornare, così che il processo non
-viene bloccato. In questo modo diventa ad esempio possibile effettuare una
-richiesta preventiva di dati, in modo da poter effettuare in contemporanea le
-operazioni di calcolo e quelle di I/O.
+Una modalità alternativa all'uso dell'\textit{I/O multiplexing} per gestione
+dell'I/O simultaneo su molti file, è costituita dal cosiddetto \textsl{I/O
+ asincrono}. Il concetto base dell'\textsl{I/O asincrono} è che le funzioni
+di I/O non attendono il completamento delle operazioni prima di ritornare,
+così che il processo non viene bloccato. In questo modo diventa ad esempio
+possibile effettuare una richiesta preventiva di dati, in modo da poter
+effettuare in contemporanea le operazioni di calcolo e quelle di I/O.
Abbiamo accennato in \secref{sec:file_open} che è possibile, attraverso l'uso
del flag \const{O\_ASYNC},\footnote{l'uso del flag di \const{O\_ASYNC} e dei
di Linux e BSD.} aprire un file in modalità asincrona, così come è possibile
attivare in un secondo tempo questa modalità impostando questo flag attraverso
l'uso di \func{fcntl} con il comando \const{F\_SETFL} (vedi
-\secref{sec:file_fcntl}).
-
-In realtà in questo caso non si tratta di I/O asincrono vero e proprio, quanto
-di un meccanismo asincrono di notifica delle variazione dello stato del file
-descriptor; quello che succede è che il sistema genera un segnale (normalmente
-\const{SIGIO}, ma è possibile usarne altri) tutte le volte che diventa
-possibile leggere o scrivere dal file descriptor che si è posto in questa
-modalità. Si può inoltre selezionare, con il comando \const{F\_SETOWN} di
-\func{fcntl}, quale processo (o gruppo di processi) riceverà il segnale.
+\secref{sec:file_fcntl}).
+
+In realtà in questo caso non si tratta di I/O asincrono vero e proprio (che
+vedremo in \secref{sec:file_asyncronous_io}), quanto di un meccanismo
+asincrono di notifica delle variazione dello stato del file descriptor; quello
+che succede è che il sistema genera un segnale (normalmente \const{SIGIO}, ma
+è possibile usarne altri) tutte le volte che diventa possibile leggere o
+scrivere dal file descriptor che si è posto in questa modalità. Si può inoltre
+selezionare, con il comando \const{F\_SETOWN} di \func{fcntl}, quale processo
+(o gruppo di processi) riceverà il segnale. Se pertanto si effettuano le
+operazioni in risposta alla ricezione del segnale non ci sarà più la necessità
+di restare bloccati in attesa della disponibilità di accesso ai file.
In questo modo si può evitare l'uso delle funzioni \func{poll} o \func{select}
che, quando vengono usate con un numero molto grande di file descriptor, non
-hanno buone prestazioni. In tal caso infatti la maggior parte del loro tempo
+hanno buone prestazioni. % aggiungere cenno a epoll quando l'avrò scritta
+ In tal caso infatti la maggior parte del loro tempo
di esecuzione è impegnato ad eseguire una scansione su tutti i file descriptor
tenuti sotto controllo per determinare quali di essi (in genere una piccola
percentuale) sono diventati attivi.
in eccesso, e si dovrà determinare al solito modo quali sono i file diventati
attivi.
+\subsection{L'interfaccia POSIX per l'I/O asincrono}
+\label{sec:file_asyncronous_io}
+
Benché la modalità di apertura asincrona di un file possa risultare utile in
varie occasioni (in particolar modo con i socket\index{socket} e gli altri
file per i quali le funzioni di I/O sono system call lente), essa è comunque
notifica del completamento delle operazioni richieste. La struttura è
riportata in \secref{fig:file_sigevent}; il campo \var{sigev\_notify} è quello
che indica le modalità della notifica, esso può assumere i tre valori:
-\begin{basedescript}{\desclabelwidth{3.0cm}}
+\begin{basedescript}{\desclabelwidth{2.6cm}}
\item[\const{SIGEV\_NONE}] Non viene inviata nessuna notifica.
\item[\const{SIGEV\_SIGNAL}] La notifica viene effettuata inviando al processo
chiamante il segnale specificato da \var{sigev\_signo}; se il gestore di