¿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.