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)有什么区别,asyncnonblocking不是同一个东西吗??

【问题讨论】:

+1 你的一系列问题教会我避开 nginx。 :-) 【参考方案1】:

FIOASYNC 为文件描述符切换O_ASYNC 标志(通常在open(2)fcntl(2) 中设置),当文件描述符已准备好进行 IO。

O_ASYNC 不常用:

在信号处理程序中正确处理 IO 非常困难;最好让它们尽可能小 因为信号中断了程序的控制流,它们运行起来比标准系统调用“花费更多”,例如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_ASYNCopenfcntl 等效。 @cpuer:不,异步和非阻塞是完全不同的概念。 @cpuer:设置标志可能有充分的理由,但它应该以标准认可的方式这样做,使用 fcntlO_ASYNC,而不是一些古老的 1980 年代风格 @ 987654345@. @sarnold,我看到了你的改变。当使用ASYNC 并调用通知回调时,1.进程会停止其当前例程吗? 2. 还是当前例程和回调例程同时运行?

以上是关于unix套接字中的异步和非阻塞有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

阻塞和非阻塞同步和异步

java同异步请求和阻塞非阻塞的区别

名词解释:同步、异步、阻塞和非阻塞

Unix下IO模型及他们之间的区别

通过 Unix 套接字和 TCP/IP 套接字运行 PHP-FPM 有啥区别?

同步异步阻塞非阻塞的概念理解