2011-06-07 9 views
16

que estoy viendo tal código en nginx:¿Cuál es la diferencia entre async y nonblocking en unix socket?

if(fcntl(ngx_processes[s].channel[0], F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) == -1) { 
... 
if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { 
... 

alguien me puede decir cuál es la diferencia entre fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) y ioctl(s, FIOASYNC, &on), ¿no async y nonblocking lo mismo ??

+2

+1 su serie de preguntas me ha enseñado a mantenerse alejado de nginx. :-) –

Respuesta

17

FIOASYNC conmuta la bandera O_ASYNC (que normalmente se encuentra en open(2) o fcntl(2)) para un descriptor de archivo, que le pedirá el kernel para enviar SIGIO o SIGPOLL para el proceso cuando el descriptor de archivo está listo para IO.

O_ASYNC no se utiliza a menudo:

  • es extremadamente difícil de manejar adecuadamente IO en manejadores de señales; que es mejor dejar tan pequeño como sea posible
  • porque las señales interrumpen el flujo de control del programa, que 'cuestan más' de mantener que las llamadas al sistema estándar, tales como select(2) o poll(2)
  • señales proporcionan menos información que otras llamadas: se solo reporte un fd listo contra muchos fds que puedan estar listos.

El O_NONBLOCK no proporciona ninguna notificación al proceso de usuario que un fd está listo para read(2) o write(2) - en su lugar, cambia el comportamiento de read(2) y write(2) y similares llamadas para volver de inmediato si el archivo el descriptor no está listo para leer o escribir. O_NONBLOCK se usa generalmente junto con select(2) o poll(2) o similar calls para garantizar que el bucle principal de un cliente o servidor no se bloqueará en un par específico y, por lo tanto, privará a todos sus pares.

+0

@ sarnold, ¿quiere decir que ambos son lo mismo? – cpuer

+0

También 'FIOASYNC' es una forma completamente no estándar/heredada de hacer el equivalente de' O_ASYNC' con 'open' o' fcntl'. –

+0

nginx debe tener su razón para establecer este indicador, creo ... – cpuer

Cuestiones relacionadas