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 编辑
明白了,非常感谢!
开多进程可以解决这个限制么?让服务器达到高并发的要求,下面是此问题的贴子:
http://bbs.chinaunix.net/thread-4065287-1-1.html
作者: windoze 时间: 2013-01-23 19:06
参见之前的答案,你觉得可以还是不可以?
作者: iw1210 时间: 2013-01-23 19:09
就是确认一下,那我就回答:可以!
作者: 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
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 |