【问题标题】:What is the nfds from select() used forselect() 中的 nfds 用于什么
【发布时间】:2012-01-01 21:28:57
【问题描述】:

我想知道nfds 做了什么,在阅读了不同的手册之后,我最终得到的唯一答案是它是编号最高的文件描述符加一。它到底是做什么用的?

【问题讨论】:

标签: c select


【解决方案1】:

当您使用select() 时,您正在尝试检查一组文件描述符的状态。您感兴趣的文件描述符的可能范围从低值 0(标准输入)到某个最大值(您有兴趣检查其状态的打开的最高文件描述符)。你必须告诉select() 文件描述符列表有多大,因为总数可以是“巨大的”(例如 32767)。在这种情况下,内核处理描述符需要时间,而且您可能没有将fd_set 初始化到该条目数。 FD_SETSIZE 也在等式中,但有时您可以更改该值。

因此,如果您想监视文件描述符 24-31,则将 nfds 设置为 32,并确保使用 FD_ZERO() 将整个 fd_setFD_SET() 设置为零以设置条目 24- 31.还要注意,select() 修改了输入参数,所以你必须在select() 返回后使用FD_ISSET() 进行测试,一般你必须重做fd_set 的初始化(或复制一个保存的值)在再次致电select() 之前。

【讨论】:

  • 从名称nfds文件描述符数)当我想监视fd编号2431时,我会期望7。为什么32? (我知道你是对的,手册页也这么说,但我想知道为什么)
  • @hek2mgl: 这是因为集合从文件描述符 0 开始;界面中没有办法指定另一个起点。如果您在具有数千个打开文件描述符的服务器中使用 select(),这可能会减慢速度。
  • 被否决:即使答案(大部分)是正确的,它也遗漏了关键细节,并且措辞令人无法理解。请改用unix.stackexchange.com/questions/7742/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多