unix套接字中的异步和非阻塞有啥区别?
Posted
技术标签:
【中文标题】unix套接字中的异步和非阻塞有啥区别?【英文标题】:What's the difference between async and nonblocking in unix socket?unix套接字中的异步和非阻塞有什么区别? 【发布时间】:2011-09-09 17:56:29 【问题描述】:我在 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)
...
谁能告诉我fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)
和ioctl(s, FIOASYNC, &on)
有什么区别,async
和nonblocking
不是同一个东西吗??
【问题讨论】:
+1 你的一系列问题教会我避开 nginx。 :-) 【参考方案1】:FIOASYNC
为文件描述符切换O_ASYNC
标志(通常在open(2)
或fcntl(2)
中设置),当文件描述符已准备好进行 IO。
O_ASYNC
不常用:
select(2)
或poll(2)
与其他调用相比,信号提供的信息更少:它们只报告一个 fd 已准备好,而许多 fd 可能已准备好。
O_NONBLOCK
不会向用户进程提供 any 通知,告知 fd 已为 read(2)
或 write(2)
做好准备——相反,它会更改 read(2)
的行为和write(2)
和类似的调用会在文件描述符未准备好读取或写入时立即返回。 O_NONBLOCK
通常与 select(2)
或 poll(2)
或 similar calls 结合使用,以保证客户端或服务器的主循环不会阻塞某个特定对等点,从而使其所有对等点饿死。
【讨论】:
@sarnold,所以你的意思是两者是一样的? 另外,FIOASYNC
是一种完全非标准/传统的方式,与 O_ASYNC
和 open
或 fcntl
等效。
@cpuer:不,异步和非阻塞是完全不同的概念。
@cpuer:设置标志可能有充分的理由,但它应该以标准认可的方式这样做,使用 fcntl
和 O_ASYNC
,而不是一些古老的 1980 年代风格 @ 987654345@.
@sarnold,我看到了你的改变。当使用ASYNC
并调用通知回调时,1.进程会停止其当前例程吗? 2. 还是当前例程和回调例程同时运行?以上是关于unix套接字中的异步和非阻塞有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章