file descriptor pronti per le operazioni ad esso relative, in modo da poterli
controllare con \macro{FD\_ISSET}. Se invece scade il tempo indicato
da \param{timout} viene restituito un valore nullo e i \textit{file descriptor
- set} non vengono modificati. In caso di errore la funzione restituisce -1, i
+ set} non vengono modificati. In caso di errore la funzione restituisce $-1$, i
valori dei tre insiemi e di \param{timeout} sono indefiniti e non si può fare
nessun affidamento sul loro contenuto; nelle versioni più recenti della
funzione invece i \textit{file descriptor set} non vengono modificati anche in
di Linux aggiorna il valore al tempo rimanente, ma la funzione fornita dalle
\acr{glibc} modifica questo comportamento passando alla \textit{system call}
una variabile locale, in modo da mantenere l'aderenza allo standard POSIX che
-richiede che il valore di \param{timeout} non sia modificato. Ma rispetto a
-\func{select} prende un argomento aggiuntivo \param{sigmask} che è il
-puntatore ad una \index{maschera~dei~segnali} maschera di segnali (si veda
-sez.~\ref{sec:sig_sigmask}). La maschera corrente viene sostituita da questa
-immediatamente prima di eseguire l'attesa, e ripristinata al ritorno della
-funzione.
-
-L'uso di \param{sigmask} è stato introdotto allo scopo di prevenire possibili
-\textit{race condition} \itindex{race~condition} quando ci si deve porre in
-attesa sia di un segnale che di dati. La tecnica classica è quella di
-utilizzare il gestore per impostare una \index{variabili!globali} variabile
-globale e controllare questa nel corpo principale del programma; abbiamo visto
-in sez.~\ref{sec:sig_example} come questo lasci spazio a possibili
-\itindex{race~condition} \textit{race condition}, per cui diventa essenziale
-utilizzare \func{sigprocmask} per disabilitare la ricezione del segnale prima
-di eseguire il controllo e riabilitarlo dopo l'esecuzione delle relative
-operazioni, onde evitare l'arrivo di un segnale immediatamente dopo il
-controllo, che andrebbe perso.
-
-Nel nostro caso il problema si pone quando oltre al segnale si devono tenere
+richiede che il valore di \param{timeout} non sia modificato.
+
+Rispetto a \func{select} la nuova funzione prende un argomento
+aggiuntivo \param{sigmask}, un puntatore ad una \index{maschera~dei~segnali}
+maschera di segnali (si veda sez.~\ref{sec:sig_sigmask}). Nell'esecuzione la
+maschera dei segnali corrente viene sostituita da quella così indicata
+immediatamente prima di eseguire l'attesa, e viene poi ripristinata al ritorno
+della funzione. L'uso di \param{sigmask} è stato introdotto allo scopo di
+prevenire possibili \textit{race condition} \itindex{race~condition} quando
+oltre alla presenza di dati sui file descriptor come nella \func{select}
+ordinaria, ci si deve porre in attesa anche dell'arrivo di un segnale.
+
+Come abbiamo visto in sez.~\ref{sec:sig_example} la tecnica classica per
+rilevare l'arrivo di un segnale è quella di utilizzare il gestore per
+impostare una \index{variabili!globali} variabile globale e controllare questa
+nel corpo principale del programma; abbiamo visto in quell'occasione come
+questo lasci spazio a possibili \itindex{race~condition} \textit{race
+ condition}, per cui diventa essenziale utilizzare \func{sigprocmask} per
+disabilitare la ricezione del segnale prima di eseguire il controllo e
+riabilitarlo dopo l'esecuzione delle relative operazioni, onde evitare
+l'arrivo di un segnale immediatamente dopo il controllo, che andrebbe perso.
+
+Nel nostro caso il problema si pone quando, oltre al segnale, si devono tenere
sotto controllo anche dei file descriptor con \func{select}, in questo caso si
può fare conto sul fatto che all'arrivo di un segnale essa verrebbe interrotta
e si potrebbero eseguire di conseguenza le operazioni relative al segnale e
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)}
-
- La funzione attende un cambiamento di stato su un insieme di file
- descriptor.
-
- \bodydesc{La funzione restituisce il numero di file descriptor con attività
- in caso di successo, o 0 se c'è stato un timeout e -1 in caso di errore,
- ed in quest'ultimo caso \var{errno} assumerà uno dei valori:
+
+\begin{funcproto}{
+\fhead{sys/poll.h}
+\fdecl{int poll(struct pollfd *ufds, unsigned int nfds, int timeout)}
+\fdesc{La funzione attende un cambiamento di stato su un insieme di file
+ descriptor.}
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EBADF}] si è specificato un file descriptor sbagliato in uno
degli insiemi.
\item[\errcode{EINVAL}] il valore di \param{nfds} eccede il limite
\const{RLIMIT\_NOFILE}.
\end{errlist}
- ed inoltre \errval{EFAULT} e \errval{ENOMEM}.}
-\end{prototype}
+ ed inoltre \errval{EFAULT} e \errval{ENOMEM} nel loro significato generico.}
+\end{funcproto}
La funzione permette di tenere sotto controllo contemporaneamente \param{ndfs}
file descriptor, specificati attraverso il puntatore \param{ufds} ad un