2011-06-07 45 views
16

我在nginx的看到这样的代码:unix套接字中的异步和非阻塞有什么区别?

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同样的事情?

+2

+1你的一系列问题已经教会我避开nginx。 :-) – 2011-06-07 02:46:21

回答

17

FIOASYNC切换的O_ASYNC标志的文件描述符,这将让内核发送SIGIOSIGPOLL的过程时,文件描述符准备IO(通常在open(2)fcntl(2)设置)。

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)similar calls结合使用,以保证客户端或服务器的主循环不会阻塞某个特定的对等体,从而使其所有对等体都处于不可用状态。

+0

@ sarnold,所以你的意思是两者是相同的东西? – cpuer 2011-06-07 02:45:47

+0

另外'FIOASYNC'是一个完全非标准/传统的方法,可以用'open'或'fcntl'做等价的'O_ASYNC'。 – 2011-06-07 02:47:01

+0

nginx必须有它的理由来设置这个标志,我认为... – cpuer 2011-06-07 02:47:29