cpu*_*uer 18 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) {
...
Run Code Online (Sandbox Code Playgroud)
谁能告诉我什么是之间的区别fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK)和ioctl(s, FIOASYNC, &on),不async和nonblocking一样的东西?
sar*_*old 17
FIOASYNC切换文件描述符的O_ASYNC标志(通常设置在open(2)或中fcntl(2)),当文件描述符为IO准备好时,它将要求内核发送SIGIO或SIGPOLL进程.
O_ASYNC 不经常使用:
select(2)或更高)运行成本更高poll(2)在O_NONBLOCK不提供任何以用户进程,一个fd是准备通知read(2)或write(2)-相反,它改变的行为read(2),并write(2)与类似的调用立即返回,如果文件描述符没有准备好进行读取或写入.O_NONBLOCK通常用于与结合select(2)或poll(2)或类似的调用,以保证一个客户端或服务器的主循环将不会在一个具体的对等体阻断,并且因此它的饿死所有对等体.