Chiamate bloccanti
description
Transcript of Chiamate bloccanti
Sistemi di elaborazione dell’informazione
Modulo 4 - Tecniche di programmazione distribuita
Unità didattica 1 - Socket library
Ernesto Damiani
Lezione 6 – Select
Chiamate bloccanti
• Molte delle funzioni esaminate bloccano il programma che le chiama fino a un determinato evento:
– accept: fino a che non arriva una connessione;– connect: fino a che non viene stabilita la connessione;– recv, recvfrom: fino a che non viene ricevuto un pacchetto (di
dati);– send, sendto: fino a che i dati non vengono immessi nel buffer
del socket.
• Per programmi semplici il blocco è utile.
• Nel caso di programmi più complessi diventa un problema:
– connessioni multiple;– invio e connessioni simultanee.
Chiamate non bloccanti
Opzioni:
• usare chiamate bloccanti, ma scrivere codice multi-thread o multiprocesso;
• disattivare la funzione di blocco, per esempio usando la funzione di controllo del descrittore di file fcntl;
• usare la chiamata select.
Chiamata select (1)
• Può essere bloccante permanentemente, bloccante per un tempo limitato o non bloccante.
• Input: una serie di descrittori di file.
• Output: informazioni sullo stato dei descrittori di file.
• Identifica i socket che sono “pronti per l’uso”, su cui sono disponibili dei dati.
Chiamata select (2)
• Usa la struttura struct fd_set
– È un vettore di bit.
– Se il bit i è impostato a [readfds, writefds, exceptfds], select controllerà se il descrittore di file (cioè il socket) i è pronto per [lettura, scrittura, eccezione].
• Prima di chiamare select
– FD_ZERO(&fdvar): cancella la struttura;
– FD_SET(&fdvar): per controllare il descrittore di file i.
• Dopo aver chiamato select
– Int FD_ISSET(i, &fdvar): booleano restituisce TRUE se i è “pronto”.
Chiamata della funzione select
• int status = select(nfds, &readfds, &writefds, &exceptfds, &timeout);
– status: numero di oggetti pronti, altrimenti -1;
– nfds: 1 + il descrittore di file più grande da controllare;
– readfds: elenco di descrittori da controllare perchè pronti alla lettura;
– writefds: elenco di descrittori da controllare perchè pronti alla scrittura;
– exceptfds: elenco di descrittori da controllare perchè si è verificata un’eccezione;
– timeout: tempo dopo il quale select ritorna, anche se nulla è pronto (può essere 0 o ) (parametro di timeout punta a NULL per ).
FINE