我在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)
有什么区别,async
和nonblocking
不是一回事吗?
发布于 2011-06-07 10:38:45
FIOASYNC
切换文件描述符的O_ASYNC
标志(通常在open(2)
或fcntl(2)
中设置),这将要求内核在文件描述符准备好IO时向进程发送SIGIO
或SIGPOLL
。
O_ASYNC
不常使用:
在信号处理程序中正确处理IO是极其困难的;它们最好像possible
select(2)
或O_NONBLOCK
不会向用户进程提供任何fd已准备好用于read(2)
或write(2)
的通知--相反,它会更改read(2)
和write(2)
以及类似调用的行为,以便在文件描述符未准备好读取或写入时立即返回。O_NONBLOCK
通常与select(2)
、poll(2)
或similar calls结合使用,以保证客户端或服务器的主循环不会阻塞某个特定的对等点,从而使其所有对等点都处于饥饿状态。
https://stackoverflow.com/questions/6260114
复制相似问题