2010-12-30 11 views
5

Tengo un problema al usar la función de selección en Unix.¿Es necesario restablecer el fd_set entre la llamada al sistema seleccionada?

Tengo un servidor que espera una conexión. Primero agrego el descriptor de archivo de socket de escucha listener al fd_set readfds usando FD_SET(listener, readfds) y luego lo uso en select().

Cuando llego a una conexión, que llamo accept() y establecer el readfds en select con el descriptor de archivo aceptados y empieza a recibir los datos de conexión. Sin embargo, cuando verifico el código en strace, The select no muestra el oyente en el readfds mientras que select() se está ejecutando por segunda vez.

¿Debo volver a configurar el descriptor del archivo de escucha utilizando FD_SET(listener, readfds) antes de llamar al select() nuevamente?

Gracias.

+0

Además, no en Linux, el valor del tiempo de espera se puede modificar y, por lo tanto, también deberá reinicializarse. El estándar lo permite pero es poco común en otros sabores de Unix. –

Respuesta

10

Sí (es necesario restablecer el fd_set entre las llamadas al sistema fd_set).

Es una molestia, pero actúan como parámetros de entrada/salida; son leídos y modificados por la llamada al sistema. Cuando select() regresa, todos los valores han sido modificados para reflejar el conjunto de descriptores de archivos listos. Por lo tanto, cada vez antes de llamar al select(), debe (re) inicializar los valores fd_set.

+0

No recibí tu respuesta con claridad. ¿Es el después de la selección devuelve listenfd (en el que acepto) se restablece desde la lectura fd_set que estoy buscando para recibir datos en la selección. – sandeep

+0

Gracias Jonathan ... Está claro ahora. – sandeep

1

Jonathan es el correcto. Debe hacer lo siguiente cada vez:

set readFDs 
set writeFDs 
set errorFDs 
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout) 
Cuestiones relacionadas