unix套接字中的异步和非阻塞有什么区别?
问题描述:
我在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)
之间的区别,不async
和nonblocking
同样的事情?
答
FIOASYNC
切换的O_ASYNC
标志的文件描述符,这将让内核发送SIGIO
或SIGPOLL
的过程时,文件描述符准备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结合使用,以保证客户端或服务器的主循环不会阻塞某个特定的对等体,从而使其所有对等体都处于不可用状态。
+1你的一系列问题已经教会我避开nginx。 :-) – 2011-06-07 02:46:21