UNIX中select的实现和以及字节数组来实现位操作

来源:互联网 发布:hexdump windows 编辑:程序博客网 时间:2024/06/05 09:36

from:http://blog.csdn.net/baijd_ss/article/details/6860315

[cpp] view plaincopyprint?
  1. define FD_SETSIZE      1024  
  2.   
  3. typedef unsigned long   fd_mask;  
  4.   
  5. #define NBBY    8               /* number of bits in a byte */  
  6. #define NFDBITS (sizeof(fd_mask) * NBBY)        /* bits per mask */  
  7.   
  8.   
  9. #define howmany(x, y)   (((x) + ((y) - 1)) / (y))  
  10.   
  11. typedef struct fd_set {  
  12.         fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];  
  13. } fd_set;  
  14.   
  15. #define _fdset_mask(n)  ((fd_mask)1 << ((n) % NFDBITS))  
  16. #define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= _fdset_mask(n))  
  17. #define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~_fdset_mask(n))  
  18. #define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & _fdset_mask(n))  
  19. #define FD_COPY(f, t)   bcopy(f, t, sizeof(*(f)))  
  20. #define FD_ZERO(p)      bzero(p, sizeof(*(p)))   
  21.   
  22. fd_set master_set_read;  
  23.   
  24. FD_SET(600,master_set_read);  
  25.   
  26. =>  master_set_read->fds_bits[(600)/32] |= (1<<(600%32));   
  27. 以上转自: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第一个参数--最大描述字:是提高效率查找或匹配最好的诠释~~~!


0 0
原创粉丝点击