X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=744237990b07fc99dc9948e48d0e189b80d4f2bb;hp=067e1ff04970e5009e230935f97f2a1f5a527a7f;hb=81ff87c3e2a6ecd3e33867798cba0d27576f44d0;hpb=6c705d16151fa82874be6aced255d346c9d2bd7b diff --git a/fileadv.tex b/fileadv.tex index 067e1ff..7442379 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -84,11 +84,56 @@ Attende che un certo insieme di file descriptor cambi stato. \end{prototype} La funzione mette il processo in stato di \textit{sleep} (vedi -\ref{tab:proc_proc_states}) +\tabref{tab:proc_proc_states}) fintanto che non viene rilevate dell'attività +sull'insieme dei file descriptor specificati (\param{readfds}, +\param{writefds} e \param{exceptfds}), per un tempo massimo specificato da +\param{timeout}. + +Per specificare quali file descriptor si intende 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 \textit{signal set} (vedi \secref{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/select.h} + \funcdecl{FD\_ZERO(fd\_set *set)} + Inizializza l'insieme (vuoto). + + \funcdecl{FD\_SET(int fd, fd\_set *set)} + Inserisce il file descriptor \param{fd} nell'insieme. + + \funcdecl{FD\_CLR(int fd, fd\_set *set)} + Rimuove il file descriptor \param{fd} nell'insieme. + + \funcdecl{FD\_ISSET(int fd, fd\_set *set)} + Controlla se il file descriptor \param{fd} è nell'insieme. +\end{functions} +In genere un \textit{file descriptor set} può contenere fino ad un massimo di +\macro{FD\_SETSIZE} file descriptor. Questo a seconda del sistema può essere +il limite del numero massimo di file aperti\footnote{ad esempio in Linux, fino + alla serie 2.0.x, c'era un limite di 256 file per processo.}, ma quando, +come nelle versioni più recenti del kernel, questo limite non c'è un massimo, +esso indica le dimensioni in munero di bit utilizzabili per l'insieme. -il cui prototipo è: +La funzione richiede di specificare tre insiemi distinti di file descriptor; +il primo, \param{readfds}, verrà osservato per rilevare la disponibilità di +input in lettura, il secondo, \param{writefds} per verificare la possibilità +di scrivere ed il terzo, \param{exceptfds}, per verificare l'esistenza di +eccezioni. I corrispondenti valori dei \textit{file descriptor set} saranno +modificati di conseguenza per mostrare quale dei file descriptor ha cambiato +stato. + + + + + +Come accennato l'interfaccia di \func{select} è una estensione aggiunta BSD, e +poi entrata a far parte di POSIX; allo stesso tempo System V aveva introdotto +una interfaccia alternativa, basata sulla funzione \func{poll}, il cui +prototipo è: \begin{prototype}{sys/poll.h} {int poll(struct pollfd *ufds, unsigned int nfds, int timeout)} @@ -97,7 +142,9 @@ specificati da \param{ufds}. \bodydesc{La funzione restituisce il numero di file descriptor con attività in caso di successo, o 0 se c'è stato un timeout; in caso di errore viene - restituito -1 ed \var{errno} viene .} + restituito -1 ed \var{errno} viene settata ai valori: + +.} \end{prototype} @@ -145,11 +192,12 @@ diversi. In quell'occasione si in \textit{append mode}, quando più processi scrivono contemporaneamente sullo stesso file non è possibile determinare la sequenza in cui essi opereranno. -Questo causa la possibilità di race condition; in generale le situazioni più -comuni sono due: l'interazione fra un processo che scrive e altri che leggono, -in cui questi ultimi possono leggere informazioni scritte solo in maniera -parziale o incompleta; o quella in cui diversi processi scrivono, mescolando -in maniera imprevedebile il loro output sul file. +Questo causa la possibilità di race condition\index{race condition}; in +generale le situazioni più comuni sono due: l'interazione fra un processo che +scrive e altri che leggono, in cui questi ultimi possono leggere informazioni +scritte solo in maniera parziale o incompleta; o quella in cui diversi +processi scrivono, mescolando in maniera imprevedebile il loro output sul +file. In tutti questi casi il \textit{file locking} è la tecnica che permette di evitare le race condition, attraverso una serie di funzioni che permettono di