2011-10-03 11 views
19

Sto usando la funzione di selezione per la comunicazione tra le mie prese. Ho un ciclo while e lo faccio -Perché FD_SET/FD_ZERO per select() all'interno del ciclo?

while(!done) { 

    FD_ZERO(&read_flags); 
    FD_ZERO(&write_flags); 
    FD_SET(comm_fd1, &read_flags); 
    FD_SET(comm_fd2, &read_flags); 
    FD_SET(STDIN_FILENO, &read_flags); 
    FD_SET(comm_fd1, &write_flags); 
    FD_SET(comm_fd2, &write_flags); 
    FD_SET(STDIN_FILENO, &write_flags); 

    //call select 
    sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd); 

e lo stesso con diverse variabili sul lato client. Ho preso questa tecnica di base da un tutorial online e ci sono andato. Poi mi ha colpito - perché cancellare il set e aggiungere i descrittori di file ogni volta che faccio un ciclo? Se sono già stati aggiunti, perché eliminarli e aggiungerli di nuovo? Quindi ho provato a farlo solo una volta e il codice non funziona più allo stesso modo. Qualcuno può spiegare perché? È solo perché selezionare modifica il contenuto del set? Qualsiasi aiuto e/o intuizione è apprezzato.

risposta

21

Quando select rendimenti, ha aggiornato i set per mostrare che i descrittori di file sono diventati pronto per lettura/scrittura/eccezione. Tutte le altre bandiere sono state cancellate.

E 'importante che si ri-abilitare i descrittori di file che sono stati cancellati prima di iniziare un altro di selezione, in caso contrario, non sarà più essere in attesa su tali descrittori di file.

Per quanto riguarda la riscrittura, può essere una buona abitudine entrare, dal momento che se è necessario modificare l'insieme di descrittori di file (come l'aggiunta di un socket appena aperto al set di lettura), si vorrà cancellarlo e ricostruirlo ogni volta, in modo che sia corretto al cambiare dello stato del programma.

+2

Ricordare inoltre che è necessario reimpostare la struttura temporale (waitd nell'esempio) ogni volta che si esegue un ciclo. –

3

È solo perché selezionare modifica il contenuto del set?

Sì, dopo i ritorni select, solo i descrittori pronti vengono lasciati all'interno dei set.