c中select的理解

解决的问题:

传统用法,若一个handle不可读,则阻塞;设想若有一个不可读被阻塞了,这个时候还有一个handle可读呢,这时就要用select来解决

Select的函数格式:

int select(int maxfdp,  fd_set *readfds,  fd_set *writefds,  fd_set *errorfds,  struct timeval*timeout);
对于fd_set类型的操作:(fd_set相当于一个handle数组)

              fd0  fd1  fd2

readfd   0       0     0  ;;;;;; ;

writefd   0      0     0  ;;;;;;;

FD_ZERO(fd_set *),将fd_set所有位都清零

FD_SET(int ,fd_set*),开启fd_set的 一位

FD_CLR(int,fd_set*),清除一位

FD_ISSET(int ,fd_set* )检查集合中指定的handle是否开启


从select返回时,可以用FD_ISSET 来测试fdset中一个给定位是否仍然开启

select的返回值是已经置位的描述符个数,,若一个描述符可以读也可以写,将会记数两次。

 FD_ZERO(&allset);     /* 清空文件描述符集合 */
 FD_SET(lfd, &allset);    /* 将监听接字设置在集合内 */
 /* 开始服务器程序的死循环 */
 while(1){
  printf("hello\n");
  rset = allset;
  ret_n = FD_ISSET(lfd, &rset);   //返回1,因为已经开启
  
  /* 得到当前可以读的文件描述符数 */
  rdy = select(maxfd + 1, &rset, NULL, NULL, NULL);
  if (FD_ISSET(lfd, &rset)){         //rdy表示rset集合中 有几个可以读的hand开启,

//FD_ISSET来测试rset中的lfd是否依然可以读,因为select会重新对集合中的位检测并置位,虽然上边那个FD_ISSET返回1,但是经过了select不一定
   addr_len = sizeof(cin);

;;

;;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值