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??
Non-Blocking: It refers to the program that does not block the execution of further operations. Non-Blocking methods are executed asynchronously. Asynchronously means that the program may not necessarily execute line by line.
Generally, a non-blocking architecture is based on method calls that, while they may execute for a long time on the worker thread, do not block the calling thread. If the calling thread needs to acquire information about or from the task the worker thread is executing, it is up to the calling thread to do that.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With