From b7d7d53a7edf4b2d1803041bc82136d0c07ba516 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 18 Feb 2014 13:16:28 +0000 Subject: [PATCH] Revisione select e pselect completata --- fileadv.tex | 68 ++++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 53e4cb3..325d8a5 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1118,7 +1118,7 @@ POSIX.1-2001,\footnote{si tenga però presente che esistono alcune versioni di 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 @@ -1222,26 +1222,29 @@ caso di interruzione. In realtà anche in questo caso la \textit{system call} 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 @@ -1282,15 +1285,16 @@ 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)} - - 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. @@ -1298,8 +1302,8 @@ cui prototipo è: \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 -- 2.30.2