Newsgroup: it.comp.os.linux.development
Titolo: [?] Funzione select

salve a tutti, mi potete dare informazioni su come opera la seguente
funzione in dettaglio con qulche esempio, magari un link dove lo spiega (che
non sia 
www.cs.unibo.it/~ghini
 :-))
GRAZIE
CIAO


prova
http://www.media.dsi.unimi.it/~linux/programmazione.html
a cercare ci dovrebbe essere un esempio di chat
Cesare



L'ho postato il 4.05.2002 alle 10.50, con il titolo "Re: select()"
la select la devi usare prima di fare la recv
se la select ritorna un numero positivo significa che puoi usare recv
senza che ti si blocchi, se select ritorna zero, significa che non hai
dati in ingresso, e quindi, se usi recv bloccherai tutto
Usala cos:
fd_set rfds;
struct timeval tv;
int retval;
// azzeri il set rfds
FD_ZERO(&rfds);
// ci metti dentro il tuo file descriptor della connessione
FD_SET(fd, &rfds);
// imposti i secondi di timeout
tv.tv_sec = 5;
// imposti i millisecondi (mi pare) di timeout
tv.tv_usec = 0;
  [ qui test mi corresse: sono milionesimi di secondo ]
/* dopo questa funzione, avrai nella variabile retval il valore di 1 se
hai dati in ricezione (e quindi potrai usare recv senza problemi xk non
ti bloccher il processo), o avrai 0 se non avrai dati (usando recv dopo
bloccherai tutto in attesa di dati che non arriveranno). Ovviamente, in
caso non ci siano dati, il sistema si bloccherà per il numero di secondi
che hai impostato nel timeout, in questo caso per 5 secondi. */
retval = select(fd+1, &rfds, NULL, NULL, &tv);
if(retval) recv...
Ciao
Matic
Ps: l'esempio si riferisce esplicitamente alla recv, ma ovviamente la
puoi usare anche con send, altre funzioni per la trasmissione di dati..
basta che in &rfds ci metti uno stream di dati in arrivo/uscita (per
esempio puoi anche metterci stdin per accorgerti (uscire da un ciclo ad
esempio) di quando viene permuto invio)

Claudio Gamberini wrote:

Questo e' un pezzo di codice, vedi se ti basta perche' tutto il file e' un 
po' lunghetto: da postare:
///////////////////////////////////////////////////
int SetAllarmeRx(void)
{
         struct timeval Tempo;
         int Valore_Ritorno;                 // variabile della istruzione 
select
            // prepara l'istruzione select
           /* Watch stdin (fd 0) to see when it has input. */
           FD_ZERO(&St.Read_Device);
           FD_SET(St.i_Device, &St.Read_Device);  // aspetta i dati dalla 
porta
           /* Wait up to five seconds. */
           Tempo.tv_sec = 3;
           Tempo.tv_usec = 0;
           // controlla solo la lettura, il resto e' NULL
           Valore_Ritorno = select(FD_SETSIZE, &St.Read_Device, NULL, NULL, 
&Tempo);
           if (Valore_Ritorno)  {
               fprintf(USCITA,"E' arrivato qualcosa sulla device.\n");
               /* FD_ISSET(0, &rfds) will be true. */
            }
           else   {
               fprintf(USCITA,"%s %s\n", "Time out lettura porta: 
",St.Path_Device);
               fprintf(USCITA,"%s \n", "Operazione fallita");
               App_exit();
               return(3);
            }
        // FD_ZERO(&Read_Device);
return(0);
}
////////////////////////////////////////////////
Ciao, Nicola.
-- 
______________________________
chi va pian va san e va lontan