当我从主集中删除fds时,为什么需要在select调用中更新nfds?

bra*_*ter 2 c sockets select

给出这样的选择调用:

select(fdMax+1, &readFds, NULL, NULL, &timeoutVal)
Run Code Online (Sandbox Code Playgroud)

readFds何时更新

  • 新的fd被添加
  • 现有的fd被删除

每当添加新的fd时,我都会更新fdMax.但是,每当现有的fd被删除时,我都在想if I really need to update the fdMax also

如果我有更高的fdMax并且没有足够的fds来读取它会有什么不同?

jxh*_*jxh 5

您可以设置fdMax为系统支持的最大文件描述符值(可以表示FD_SETSIZE),而不用担心它,但可能会导致效率低下.select将使用该fdMax值作为何时可以停止对文件描述符表进行线性扫描的提示.如果你撒谎select,它可能会使它循环的时间比找到感兴趣的文件描述符所需的时间长得多.

在Linux中,该函数max_select_fd使用它fdMax来启动相关文件描述符的反向扫描.LXR

在FreeBSD中,如果更大,该函数kern_select将调整fdMax为进程的最高打开文件描述符fdMax.FXR对于纯服务器,这看起来是一个很好的启发式选择,但对于小心地将套接字文件描述符保持在比其他文件描述符更低的值的系统来说可能仍然太大.