¿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)opoll(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.