from:http://blog.csdn.net/baijd_ss/article/details/6860315
- define FD_SETSIZE 1024
- typedef unsigned long fd_mask;
- #define NBBY 8 /* number of bits in a byte */
- #define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
- #define howmany(x, y) (((x) + ((y) - 1)) / (y))
- typedef struct fd_set {
- fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
- } fd_set;
- #define _fdset_mask(n) ((fd_mask)1 << ((n) % NFDBITS))
- #define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= _fdset_mask(n))
- #define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~_fdset_mask(n))
- #define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & _fdset_mask(n))
- #define FD_COPY(f, t) bcopy(f, t, sizeof(*(f)))
- #define FD_ZERO(p) bzero(p, sizeof(*(p)))
- fd_set master_set_read;
- FD_SET(600,master_set_read);
- => master_set_read->fds_bits[(600)/32] |= (1<<(600%32));
- 以上转自:http://blog.csdn.net/linuxchen/archive/2006/09/06/1137990.aspx
联系到《UNIX网络编程第一卷》 第六章 I/O 复用select和poll函数 第129页
是不是可以这样理解:
在调用select之前需要调FD_ZERO和FD_SET,完成初始化和相应的套接字在数组某个位被置为1;这是必须的--让select知道我们关心哪些套接字~!!!
如果select函数正常返回,如果某个套接字集合中没有准备好,可能会select内存用FD_CLR清该位为0;
如果select函数正常返回,如果调用FD_ISSET为真,既该位在数组中标志位为1,表示准备好~~~
所以,在select之前调用FD_SET------------:标志位设置为1,是为了让select知道哪些套接字是select需要关心的。
select返回后,没有准备好的描述字对应的位被清成0,准备好的套接字对应的位是1,这个时候标志位代表套接字准备好!!
还有就像上面那样:字节数组来实现位操作,是不是可以用来查找呢?尤其select第一个参数--最大描述字:是提高效率查找或匹配最好的诠释~~~!