select函数的第一个参数为什么是最大描述符加1呢
2014-05-07 22:11
218 查看
ChinaUnix.net
标题: 一直不明白,select函数的第一个参数为什么是最大描述符加1呢? [打印本页]作者: iw1210 时间: 2013-01-23 18:51 标题: 一直不明白,select函数的第一个参数为什么是最大描述符加1呢?
本帖最后由 iw1210 于 2013-01-23 18:51 编辑
一直不明白,select函数的第一个参数为什么是最大描述符加1呢? 如果是描述符的数量加1还好理解,但是为什么要求是最大描述符加1呢?
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds is the highest-numbered file descriptor in any of the three sets,
plus 1.
作者: windoze 时间: 2013-01-23 18:53
参见另外一个问题,自己想想为什么
作者: iw1210 时间: 2013-01-23 18:57
本帖最后由 iw1210 于 2013-01-23 18:58 编辑
windoze 发表于 2013-01-23 18:53
参见另外一个问题,自己想想为什么
明白了,非常感谢!
开多进程可以解决这个限制么?让服务器达到高并发的要求,下面是此问题的贴子:
http://bbs.chinaunix.net/thread-4065287-1-1.html
作者: windoze 时间: 2013-01-23 19:06
参见之前的答案,你觉得可以还是不可以?
作者: iw1210 时间: 2013-01-23 19:09
windoze 发表于 2013-01-23 19:06
参见之前的答案,你觉得可以还是不可以?
就是确认一下,那我就回答:可以!
作者: linux_c_py_php 时间: 2013-01-23 19:26
因为它遍历[0, maxfd)
作者: cjaizss 时间: 2013-01-23 19:55
根据POSIX标准,
The nfds argument specifies the range of descriptors to be tested. The first nfds descriptors shall be checked in each set; that is, the descriptors from zero through nfds-1 in the descriptor sets shall be examined.
作者: timothyqiu 时间: 2013-01-23 20:17
本帖最后由 timothyqiu 于 2013-01-23 20:24 编辑
如果 fd_set 真的是一个 set 的话,那么连 nfds 也不需要用,因为 set 本身应该知道有多少 fd 在里面。
作为一个细节,你可以认为 fd_set 的原理类似于 bitmask:
例如 FD_SETSIZE 的值是 1024 的话,说明 fd_set 里最多可以容纳 1024 个 fd。因为 fd 是从 0 递增的,所以如果用位的 0/1 表示某个 fd 的状态,那么整个 fd_set 在 32 位系统需要 32 个 WORD。作为对于处理所有 32 个 WORD 的优化手段,如果给出最大 fd+1 就可以判断出需要读这 32 个 WORD 中的哪些(比如如果 nfds 是 16 的话,就只需要处理第一个
WORD;nfds 是 34 的话,只需读取前两个 WORD)。给出 fd 的数量无济于事,除非额外给出一个起始 fd。
作者: selfrun 时间: 2013-01-23 23:18
如8楼所说,linux下的fd_set是个maxfd长的位段,所以要第一个参数告诉select这个位段的长度;
而windows下的是个 struct { int count; int fds[FD_SETSIZE; },所以win下的select不需要第一个参数。
作者: iw1210 时间: 2013-01-24 09:18
本帖最后由 iw1210 于 2013-01-24 09:19 编辑
回复 8# timothyqiu
如果是这样,那么nfds是描述符的数量不就行了么,为什么要求是最大描述符加1呢? “最大描述符加1”一定不是描述符的数量吧?
作者: iw1210 时间: 2013-01-24 09:22
selfrun 发表于 2013-01-23 23:18
如8楼所说,linux下的fd_set是个maxfd长的位段,所以要第一个参数告诉select这个位段的长度;
而windows下 ...
fd_set仅是个位段? 那么加入集合的每个fd怎么和bit绑定?
作者: windoze 时间: 2013-01-24 11:18
回复 11# iw1210
fd是一个递增的数字,它和fd_set是靠数数绑定的,从低到高,第几个bit就代表第几号fd。
作者: lyush 时间: 2014-01-04 11:36
unp上是这样解释的:因为描述符是从0开始的,因此如果最大的描述符为n的话,那么其实是有n+1个描述符。
欢迎光临 ChinaUnix.net (http://bbs.chinaunix.net/) | Powered by Discuz! X2 |
相关文章推荐
- 为什么linux select函数的第一个参数总应该是fdmax + 1 ?
- TCP/IP的的最大描述符和参数设置问题
- 描述最大值的时候,算式中为什么要减去一个1?
- 一个字符串参数(s)由字母(a-z,A-Z)组成, 且最大字符位数为40,要求写一个函数, 返回该参数中连续相同字母的最大个数及该字母,如果最大位数有多个,则返回第一个。例:字符串“aaaddxxxxddddxxxx”,返回值为:“x,4”。
- 为什么Python类的方法需要加self作为第一个参数?
- 请各位帮忙看一下,第一个程序为什么不能输出和第二个程序一样的结果?这两个程序只有求最大公约束的代码不同
- 为什么select使用时第一个参数要加1
- C为什么要把数组类型的函数参数认为是指向数组第一个元素的指针
- ALV常用参数的详细描述
- 练习5: 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- 最大似然估计为什么要相乘和最小二乘法
- C++拷贝构造函数的参数为什么必须使用引用类型
- Python 类成员函数第一个参数self
- 为什么神经网络参数不能全部初始化为全0?
- 参数估计之最大似然估计法和贝叶斯估计法(点估计)
- 解决windows输入参数控制台程序输出参数是总是第一个字符问题
- js或css文件后面为什么有参数
- 为什么32位机器最大只能用到4GB内存
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 追本溯源——JAVA中为什么float型最大值大于long型?