unix socket中的异步和非阻塞有什么区别?

cpu*_*uer 18 c network-programming nonblocking asyncsocket

我在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) {
...
Run Code Online (Sandbox Code Playgroud)

谁能告诉我什么是之间的区别fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)ioctl(s, FIOASYNC, &on),不asyncnonblocking一样的东西?

sar*_*old 17

FIOASYNC切换文件描述符的O_ASYNC标志(通常设置在open(2)或中fcntl(2)),当文件描述符为IO准备好时,它将要求内核发送SIGIOSIGPOLL进程.

O_ASYNC 不经常使用:

  • 在信号处理程序中正确处理IO非常困难; 他们最好留下尽可能小的
  • 因为信号会中断程序的控制流程,所以它们比标准系统调用(例如select(2)或更高)运行成本更高poll(2)
  • 信号提供的信息少于其他信号:它们仅报告一个fd就绪,而不是许多可能准备好的fds.

O_NONBLOCK不提供任何以用户进程,一个fd是准备通知read(2)write(2)-相反,它改变的行为read(2),并write(2)与类似的调用立即返回,如果文件描述符没有准备好进行读取或写入.O_NONBLOCK通常用于与结合select(2)poll(2)类似的调用,以保证一个客户端或服务器的主循环将不会在一个具体的对等体阻断,并且因此它的饿死所有对等体.

  • @cpuer:不,异步和非阻塞是完全不同的概念. (5认同)