I'm seeing such code in 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) {
...
Anyone can tell me what's the difference between fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)
and ioctl(s, FIOASYNC, &on)
,aren't async
and nonblocking
the same thing??
FIOASYNC
toggles the O_ASYNC
flag (which is usually set in open(2)
or fcntl(2)
) for a file descriptor, which will ask the kernel to send SIGIO
or SIGPOLL
to the process when the file descriptor is ready for IO.
O_ASYNC
is not used often:
select(2)
or poll(2)
The O_NONBLOCK
doesn't provide any notification to the user process that a fd is ready for read(2)
or write(2)
-- instead, it changes the behavior of read(2)
and write(2)
and similar calls to return immediately if the file descriptor isn't ready for reading or writing. O_NONBLOCK
is typically used in conjunction with select(2)
or poll(2)
or similar calls to guarantee that the main loop of a client or server won't block on one specific peer, and thus starve all its peers.