20

我在 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),不是asyncnonblocking同一件事吗?

4

1 回答 1

21

FIOASYNC切换文件描述符的O_ASYNC标志(通常设置在open(2)or中),当文件描述符准备好进行 IO 时fcntl(2),它将要求内核发送SIGIOor到进程。SIGPOLL

O_ASYNC不经常使用:

  • 在信号处理程序中正确处理 IO 非常困难;它们最好尽可能小
  • 因为信号中断了程序的控制流,所以它们比标准系统调用“花费更多”运行,例如select(2)poll(2)
  • 与其他调用相比,信号提供的信息更少:它们只报告一个 fd 准备好与许多 fd 可能准备好。

O_NONBLOCK不会向用户进程提供 fd 准备就绪的任何通知,read(2)或者write(2)- 相反,如果文件描述符尚未准备好读取或写入,它会更改和类似调用的行为以立即返回read(2)。通常与或类似调用结合使用,以保证客户端或服务器的主循环不会阻塞一个特定的对等点,从而使其所有对等点饿死。write(2)O_NONBLOCKselect(2)poll(2)

于 2011-06-07T02:38:45.153 回答