【发布时间】:2015-06-09 22:32:31
【问题描述】:
给定这样的选择调用:
select(fdMax+1, &readFds, NULL, NULL, &timeoutVal)
readFds 随时更新的地方
- 添加了新的 fd
- 现有 fd 已删除
每当添加新的 fd 时,我都会更新 fdMax。但是,每当删除现有的 fd 时,我想知道 if I really need to update the fdMax also ?
如果我有更高的 fdMax 而没有足够的 fds 来阅读会有什么不同?
【问题讨论】:
-
值得注意的是,您几乎应该始终使用
poll(POSIX)或特定于操作系统的东西,例如epoll或kqueue。 -
@o11c:
select的内核实现相当高效。依赖于select的用户代码经常维护自己的活动文件描述符“稀疏数组”,他们将这些文件描述符与返回的集合进行比较以避免使用while (fd < fdMax) FD_ISSET(++fd, &readfds)遍历集合,而是使用while (i < fdCount) FD_ISSET(fds[++i], &readfds)。 -
@jxh 我使用
::来划分这个函数在我的c++代码中的全局命名空间中。