I/O多路转接之select

一、基础概念

1、select

使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况–读写或是异常。
函数原型:
这里写图片描述
参数解释:
(1)参数nfds是需要监视的最大的文件描述符值+1;
(2)rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合;
(3)参数timeout为结构timeval,用来设置select()的等待时间
返回值:
(1) 负值:select错误
(2)正值:某些文件可读写或出错
(3)0:等待超时,没有可读写或错误的文件
timeout的取值:
(1) NULL:则表示select()没有timeout,select将一直被阻塞,直到某个文件描述符上发生了事件;
(2)0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。
(3)特定的时间值:如果在指定的时间段里没有事件发生,select将超时返回

2、fd_set 结构

我们在select函数的参数中可以发现,第二、三、四个参数都是一个关于fd_set的结构体指针。
fd_set结构体:
这里写图片描述

fd_set 其实就是一个整形数组,更严格地说,是一个“位图”,使用位图中对应的位来表示要监视的文件描述符。
系统中也提供了一些操作fd_set的函数接口:

void FD_CLR(int fd, fd_set *set); // ⽤用来清除描述词组set中相关fd 的位 int FD_ISSET(int fd, fd_set *set); // ⽤用来测试描述词组set中相关fd 的位是否为真 void FD_SET(int fd, fd_set *set); // ⽤用来设置描述词组set中相关fd的位 void FD_ZERO(fd_set *set); // ⽤用来清除描述词组set的全部位
timeval结构:
select的第五个参数timeout的类型是timeval,timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的文件描述符没有事件发生则函数返回,返回值为0。
struct timeval{
_time_t tv_sec;
_suseconds_t tv_usec;

函数返回值:
(1)执行成功则返回文件描述词状态已改变的个数
(2)如果返回0代表在描述词状态改变前已超过tim

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值