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

时间:2015-06-09 22:32:32

标签: c sockets select

给出这样的选择调用:

select(fdMax+1, &readFds, NULL, NULL, &timeoutVal)

每当

更新readFds时
  • 添加了新的fd
  • 现有fd已删除

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

如果我的fdMax更高,没有足够的fds可以读取,会有什么不同?

2 个答案:

答案 0 :(得分:5)

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

在Linux中,函数max_select_fd使用fdMax开始对相关文件描述符进行反向扫描。 LXR

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

答案 1 :(得分:-1)

您可以使用预定义的符号(maxfd)。然后,无论使用多少实际FD,都不必修改该参数。