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

44 篇文章 0 订阅

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

  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值