X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=b65f9228c2ab84c1783a8e20b5c32571f36b05b5;hp=58c7ee6bed6825316e9765751e1cd1ca6512a516;hb=d7db23a35bbd9c7465780719188709ca06e99eaf;hpb=089db6406b8f3c725a5830457fd591f9c86eb986 diff --git a/fileadv.tex b/fileadv.tex index 58c7ee6..b65f922 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -127,10 +127,10 @@ degli insiemi specificati (\param{readfds}, \param{writefds} e Per specificare quali file descriptor si intende \textsl{selezionare}, la funzione usa un particolare oggetto, il \textit{file descriptor set}, identificato dal tipo \type{fd\_set}, che serve ad identificare un insieme di -file descriptor, in maniera analoga a come un -\itindex{signal~set}\textit{signal set} (vedi sez.~\ref{sec:sig_sigset}) -identifica un insieme di segnali. Per la manipolazione di questi \textit{file - descriptor set} si possono usare delle opportune macro di preprocessore: +file descriptor, in maniera analoga a come un \itindex{signal~set} +\textit{signal set} (vedi sez.~\ref{sec:sig_sigset}) identifica un insieme di +segnali. Per la manipolazione di questi \textit{file descriptor set} si +possono usare delle opportune macro di preprocessore: \begin{functions} \headdecl{sys/time.h} \headdecl{sys/types.h} @@ -185,7 +185,6 @@ ritorni; se impostato a \val{NULL} la funzione attende indefinitamente. Si pu specificare anche un tempo nullo (cioè una struttura \struct{timeval} con i campi impostati a zero), qualora si voglia semplicemente controllare lo stato corrente dei file descriptor. -\itindend{file~descriptor~set} La funzione restituisce il numero di file descriptor pronti,\footnote{questo è il comportamento previsto dallo standard, ma la standardizzazione della @@ -198,6 +197,8 @@ modificati. In caso di errore la funzione restituisce -1, ed i valori dei tre insiemi sono indefiniti e non si può fare nessun affidamento sul loro contenuto. +\itindend{file~descriptor~set} + In Linux \func{select} modifica anche il valore di \param{timeout}, impostandolo al tempo restante in caso di interruzione prematura; questo è utile quando la funzione viene interrotta da un segnale, in tal caso infatti @@ -291,25 +292,26 @@ interrotta, e la ricezione del segnale non sar Per questo è stata introdotta \func{pselect} che attraverso l'argomento \param{sigmask} permette di riabilitare la ricezione il segnale -contestualmente all'esecuzione della funzione,\footnote{in Linux però non è - presente la relativa system call, e la funzione è implementata nelle - \acr{glibc} attraverso \func{select} (vedi \texttt{man select\_tut}) per cui - la possibilità di \itindex{race~condition}\textit{race condition} permane; - esiste però una soluzione, chiamata \itindex{self-pipe trick} - \textit{self-pipe trick}, che consiste nell'aprire una pipe (vedi - sez.~\ref{sec:ipc_pipes}) ed usare \func{select} sul capo in lettura della - stessa, e indicare l'arrivo di un segnale scrivendo sul capo in scrittura - all'interno del manipolatore; in questo modo anche se il segnale va perso - prima della chiamata di \func{select} questa lo riconoscerà comunque dalla - presenza di dati sulla pipe.} ribloccandolo non appena essa ritorna, così -che il precedente codice potrebbe essere riscritto nel seguente modo: +contestualmente all'esecuzione della funzione,\footnote{in Linux però, fino al + kernel 2.6.26, non è presente la relativa system call, e la funzione è + implementata nelle \acr{glibc} attraverso \func{select} (vedi \texttt{man + select\_tut}) per cui la possibilità di \itindex{race~condition} + \textit{race condition} permane; esiste però una soluzione, chiamata + \itindex{self-pipe trick} \textit{self-pipe trick}, che consiste nell'aprire + una pipe (vedi sez.~\ref{sec:ipc_pipes}) ed usare \func{select} sul capo in + lettura della stessa, e indicare l'arrivo di un segnale scrivendo sul capo + in scrittura all'interno del manipolatore; in questo modo anche se il + segnale va perso prima della chiamata di \func{select} questa lo riconoscerà + comunque dalla presenza di dati sulla pipe.} ribloccandolo non appena essa +ritorna, così che il precedente codice potrebbe essere riscritto nel seguente +modo: \includecodesnip{listati/pselect_norace.c} in questo caso utilizzando \var{oldmask} durante l'esecuzione di \func{pselect} la ricezione del segnale sarà abilitata, ed in caso di interruzione si potranno eseguire le relative operazioni. % TODO pselect è stata introdotta nel kernel 2.6.16 (o 15 o 17?) insieme a -% ppoll mettere e verificare +% ppoll mettere e verificare, vedi articolo LWN http://lwn.net/Articles/176750/ \subsection{La funzione \func{poll}}