12) Come vengono gestiti gli eventi multipli?

La primitiva select permette l’attesa contemporanea di eventi su più file/socket descriptor, e quindi la gestione sincrona di eventi multipli. La funzione ritorna all’accadere di un evento sui fd monitorati.

ret=select(n,readfds,writefds,exceptfds,timeout);

int ret;

int *readfds,*writefds,*exceptfds;

struct timeval *timeout;

parametri:

i tre file descriptor set (fds) servono a monitorare gli eventi:

readfds: eventi in lettura, ovvero se ci sono caratteri disponibili per la lettura, se si può accettare una chiamata (accept) o se si è verificato un errore in lettura.

writefds: eventi in scrittura, ovvero se si possono scrivere immediatamente caratteri (send), se la connessione è completata (connect) o se si è verificato un errore in scrittura.

exceptfds: eventi di eccezione, ovvero dati fuori banda, inutilizzabilità o chiusura della socket.

n è il file descriptor più alto da controllare, aumentato di uno.

timeout è il tempo massimo durante il quale si sorvegliano i set, dopodichè la funzione ritorna.

struct timeval{

long tv_sec;

long tv_usec;};

vengono esaminati i set diversi da NULL.

I set codificano in binario la maschera dei descrittori da monitorare (es. per controllare i fd 0 e 3 la maschera vale 1+8=9). Le macro FD_SET e FD_CLR aggiungono e tolgono un fd da un set. FD_ZERO vuota un set.

Se timeout è 0, select ritorna immediatamente, se è NULL attende un evento indefinitamente (e quindi crea un sincronismo). All’uscita dalla funzione, timeout fornisce (solo in Linux) il tempo ancora da trascorrere nel momento in cui viene segnalato l’evento.

Quando la funzione ritorna i set contengono gli fd sui quali ci sono eventi da segnalare, e ret il numero di fd (che può essere 0 se non è successo niente). La macro FD_ISSET permette di testare la presenza di un fd in un set.

 


Back
Index
Next