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

时间:2011-06-07 02:35:08

标签: 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) {
...

任何人都可以告诉我fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)ioctl(s, FIOASYNC, &on)之间有什么区别,asyncnonblocking是不是一样?

1 个答案:

答案 0 :(得分:17)

FIOASYNC切换O_ASYNC标志(通常在open(2)fcntl(2)中设置)以查找文件描述符,该文件描述符将要求内核发送SIGIO当文件描述符为IO做好准备时,或者SIGPOLL到进程。

经常不使用

O_ASYNC

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

O_NONBLOCK未向用户进程提供任何通知,表明fd已为read(2)write(2)做好准备 - 相反,它会更改read(2)write(2)的行为以及类似的调用,如果文件描述符尚未准备好进行读取或写入,则立即返回。 O_NONBLOCK通常与select(2)poll(2)similar calls一起使用,以保证客户端或服务器的主循环不会阻塞某个特定的对等方,从而所有同龄人都饿死了。