c network-programming nonblocking asyncsocket

¿Cuál es la diferencia entre async y nonblocking en unix socket?



network-programming asyncsocket (1)

Estoy viendo tal código en nginx:

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) { ...

Cualquiera puede decirme cuál es la diferencia entre fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) y ioctl(s, FIOASYNC, &on) , ¿no son async y no nonblocking la misma cosa?


FIOASYNC alterna el indicador O_ASYNC (que generalmente se establece en open(2) o fcntl(2) ) para un descriptor de archivo, que le pedirá al núcleo que envíe SIGIO o SIGPOLL al proceso cuando el descriptor de archivo esté listo para IO.

O_ASYNC no se usa a menudo:

  • es extremadamente difícil manejar adecuadamente la IO en los manejadores de señales; es mejor dejarlos lo más pequeños posible
  • Debido a que las señales interrumpen el flujo de control del programa, ''cuestan más'' para ejecutarse que las llamadas estándar del sistema, como select(2) o poll(2)
  • las señales brindan menos información que otras llamadas: solo informan un fd listo frente a muchos fds que podrían estar listos.

El O_NONBLOCK no proporciona ninguna notificación al proceso del usuario de que un fd está listo para read(2) o write(2) ; en cambio, cambia el comportamiento de read(2) y write(2) y llamadas similares para devolver inmediatamente si el descriptor de archivo no está listo para leer o escribir. O_NONBLOCK se usa generalmente junto con las llamadas select(2) o poll(2) o similares para garantizar que el bucle principal de un cliente o servidor no se bloquee en un par específico, y por lo tanto no permita que todos los pares se bloqueen.