我在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
是不是一样?
答案 0 :(得分:17)
FIOASYNC
切换O_ASYNC
标志(通常在open(2)
或fcntl(2)
中设置)以查找文件描述符,该文件描述符将要求内核发送SIGIO
当文件描述符为IO做好准备时,或者SIGPOLL
到进程。
O_ASYNC
:
select(2)
或poll(2)
O_NONBLOCK
未向用户进程提供任何通知,表明fd已为read(2)
或write(2)
做好准备 - 相反,它会更改read(2)
和write(2)
的行为以及类似的调用,如果文件描述符尚未准备好进行读取或写入,则立即返回。 O_NONBLOCK
通常与select(2)
或poll(2)
或similar calls一起使用,以保证客户端或服务器的主循环不会阻塞某个特定的对等方,从而所有同龄人都饿死了。