2011-10-03 8 views
19

Estoy usando la función de selección para la comunicación entre mis enchufes. Tengo un ciclo while y lo hago -¿Por qué FD_SET/FD_ZERO para seleccionar() dentro 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); 

y lo mismo con diferentes variables en el lado del cliente. Obtuve esta técnica básica de un tutorial en línea y simplemente fui con él. Entonces me di cuenta: ¿por qué borro el conjunto y agrego descriptores de archivo cada vez que bucleo? Si ya están agregados, ¿por qué borrarlos y volver a agregarlos? Así que intenté hacer esto solo una vez antes, y el código ya no funciona. ¿Alguien puede explicar por qué? ¿Es solo porque select modifica el contenido del conjunto? Cualquier ayuda y/o visión es apreciada.

Respuesta

21

Cuando select devuelve, ha actualizado los conjuntos para mostrar qué descriptores de archivos están listos para lectura/escritura/excepción. Todas las demás banderas se han borrado.

Es importante que vuelva a habilitar los descriptores de archivo que se borraron antes de iniciar otra selección, de lo contrario, ya no estará esperando los descriptores de archivos.

En cuanto a volver a borrar, puede ser un buen hábito para entrar, ya que si necesita cambiar el conjunto de descriptores de archivo (como agregar un socket recién abierto al conjunto de lectura), querrá despejarlo y reconstruirlo cada vez, para que sea correcto a medida que cambia el estado del programa.

+2

También tenga en cuenta que debe restablecer la estructura timeval (espere en su ejemplo) cada vez que realice un ciclo. –

3

¿Es solo porque select modifica el contenido del conjunto?

Sí, después de select devuelve, solo los descriptores listos quedan dentro de los conjuntos.

Cuestiones relacionadas