2012-08-29 11 views
5

escribí un pequeño servidores TCP con socket() + POLLINpoll() + + recv()send(), pero no sé cuándo usar POLLOUT sondeo o seleccionar writefds para sondear en el evento de escritura.Cuándo utilizar el evento POLLOUT de la función C de sondeo?

¿Alguien me puede dar un ejemplo del uso real de POLLOUT?

+0

por lo general no es un método seguro;) – Shawn

+0

@Shawn, ¿por qué POLLOUT no es seguro? – xiaochen

+0

posible duplicado de [Lo que hay que utilizar el parámetro "* writefds fd_set" en la instrucción SELECT() para] (http://stackoverflow.com/questions/7076320/what-to-use-the-fd-set-writefds- parameter-in-the-select-statement-for) –

Respuesta

15

El patrón habitual es utilizar sin bloqueo descriptores de fichero con poll() así:

  • Cuando esté preparado para poll(),
    • establecer Siempre POLLIN porque siempre estás interesado en leer lo que el otro El final del socket te lo ha enviado.
      • Excepto si tiene una gran acumulación de datos entrantes y desea intencionalmente que el otro extremo espere antes de enviar más.
    • Configure POLLOUT solo si tiene datos pendientes para enviar al otro extremo.
  • Al regresar de poll(), si se indica que los datos están disponibles para leer,
    • leerlo y hacer algo con él
  • Al regresar de poll(), si indica que la toma es modificable,
    • Intente enviar sus datos sobresalientes.
      • Si se las arregló para escribir toda ella, no vamos a establecer POLLOUT próxima vez a través del bucle
      • Si sólo logró enviar algo de él (o ninguno de ellos) y luego mantener el resto de luego. Establecerá POLLOUT la próxima vez a través del ciclo.
  • Cuando tiene nuevos datos para enviar (ya sea en respuesta a los datos que lee o en respuesta a algún evento externo), tiene dos opciones:
    • impaciencia intente enviar algo de él inmediatamente. Puede enviar con éxito ninguno, algunos o todos. Al igual que en el caso anterior, guarde la parte de los datos que no se escribió para la próxima vez y planifique establecer POLLOUT la próxima vez a través del bucle solo si quedaban algunos datos.
    • Simplemente mantenga los datos en espera y planifique establecer POLLOUT la próxima vez a través del ciclo. (Esta opción a menudo es más fácil de programar porque solo necesita manejar datos de escritura en un lugar de su ciclo pero, por otro lado, retrasa la escritura de los datos hasta la próxima vez a través del ciclo.)
+1

+1 para la descripción del flujo detallado, porque nunca hay buenos ejemplos de 'POLLOUT'. – laindir

+0

'POLLHUP' no debe ser configurado por la persona que llama. Lo establece el kernel si detecta un socket que se cerró (conexión perdida). –

+0

@AlexisWilke gracias por la corrección. Nunca estuve demasiado seguro acerca de 'POLLHUP' y pensé en configurarlo" solo para estar seguro ". – Celada

0

desde fuente de Nginx, encontré que:

Si hay algunos datos que envían, nginx intenta enviarlo con una llamada al sistema (tal vez writev). Sin embargo, si nginx no puede enviar datos totales a la vez, establecerá POLLOUT en pollfd, si usa el evento de encuesta, para esperar un evento escribible. Al obtener un evento de escritura, nginx enviará los datos de la izquierda.

Es fácil de reproducir este caso cuando se trata de la respuesta nginx gran archivo estático

Cuestiones relacionadas