select函数的第一个参数为什么是最大描述符加1呢

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扫盲)