Newsgroup: it.comp.os.linux.development
Titolo: select() -- gioie e dolori

Ciao a tutti.
Certo che sta' select() e' una figata, anche ben documentata, pero'
ho bisogno di una info che non ho trovato neanche sullo Stevens:
dopo che select() fa ritorno le strutture dati fd_set sono modificate
con settati solo i socket pronti per la gestione prevista (read, write
o eccez.) quindi per richiamare ancora select bisogna ricostruire
i valori dei tre set originali. Ho visto esempi di codice funzionante
sotto Linux che fa una copia in
fd_set tempreadset;
tempreadset = readset;
per poi recuperarlo con:
readset = tempreadset;
Funzia perche' sotto Linux fd_set e' una struct, ma e' codice
portabile? Cioe' e' previsto che fd_set debba essere copiabile
o con memcopy() o con assegnaz diretta o su altri sistemi
potrebbe contenere puntatori a code che renderebbero necessario
iterare ancora n volte la macro standard FD_SET() ??????
POSIX cosa dice ???
Certo che non aver previsto un macro efficiente e standard per
la copia dei set e' una fregatura.
Altra cosetta meno importante: con select() voi usereste socket
non bloccanti o e' indifferente? Credo che con select si riesca
sempre a scongiurare di rimanere bloccati su una read() o anche
su una write() con finestra TCP a 0, ma ci sono sircostanze in
cui puo' essere consigliabile IO non bloccante con select() ???
grazie e ciao.
Roberto.

 i valori dei tre set originali. 
Perchè dici "ricostruire i valori originali" ? Non puoi reisnerire quelli di 
prima ( o sono divenuti invalidi ? )

 cui puo' essere consigliabile IO non bloccante con select() ???
in genere se utilizzo una select() posso utilizzare socket bloccanti, dal 
momento che è la select() stessa a permettermi di "evitare" blocchi 
indesiderati;
viceversa con socket non bloccanti, potrei fare a meno della select() e 
controllare il valore di ritorno di una eventuale recv() per determinare la 
presenza di dati o meno;
ciao

Grazie dela risposta. Nel seguente URL
http://www.media.dsi.unimi.it/~linux/programmazione.html
trovi un esempio di conferenza che realizza connessioni
peer-to-peer sotto sorveglianza di un server centrale.
qui la select e' usata dando per scontato che gli fd_set
siano assegnabili direttamente come struct. Funziona
molto bene (complimenti agli autori), ma questo dettaglio
non e' stato discusso.
ciao
roberto
klavius wrote:
....

Direi di si! Sono divenuti invalidi. Se select() ritorna con
valore diverso da 0 (cioe' non per scadenza del timer) nei
set ci sono settati solo i falori dei descrittori per cui si
sono verificare le condizioni monitorate. Se select() e' chiamata
in un ciclo ed e' necessario ripassargli gli stessi set del
ciclo precedente, bisogna risettarli. Ora, se fd_set e' sicuramente
una struct contigua l assegnazione o memcopy() va bene, altrimenti
non da garanzie di poter compilare lo stesso progetto su tutti i
sistemi. Iterare FD_SET() e' sicuramente portabile, ma un po'
dispendioso (credo)
ciao
Roberto.

 ciclo precedente, bisogna risettarli. 
Trattot da select_tut(2)
[...]
readfds
This  set  is  watched to see if data is available for reading from any of 
its file descriptors. After select has returned, readfds will be  cleared  
of  all file descriptors except for those file descriptors that are 
immediately avail­ able for reading with a recv() (for sockets) or read() 
(for pipes, files,  and sockets) call.
[...]
In effetti i set in uscita in generale sono diversi da quelli in ingresso e 
non possono, ne DEVONO in generale, essere riusati. Ho imparato una cosa 
nuova :).

 POSIX cosa dice ???
Nello standard IEEE Std 1003.1-2001 (che se ricordo bene corrisponde a 
POSIX.1) e` richiesto fd_set sia definito in sys/select.h e che sia una 
struttura.
Ciao
Simone

Grazie!
Hai accesso al capitolato IEEE?? Che cuccagna! Quanto hai riportato
puo' considerarsi come "fd_set deve essere copiabile con memcpy()"
o uno dei campi struct puo' essere cosi':
struct mio_fd_set
{
  size_t numerosocketdelset;
  int * socketset;
}
grazie e ciao.
Roberto


 Hai accesso al capitolato IEEE?? Che cuccagna! Quanto hai riportato
No, ho fatto una ricerca su google e ho ripreso quanto riportato dalle 
specifiche pubblicate da opengroup. 
Ciao
Simone