基于select的I/O复用机制

在系统存在多个输入或输出流但不希望其中任一个流被阻塞的场合,经常使用复用I/O的方法解决。uClinux中,用户程序多使用select机制实现I/O复用控制,select函数允许进程对一个或多个设备文件进行非阻塞的读或写操作。

    select的函数定义于中,原型如下:

 

   

    intselect(intn,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);

    该函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程。该函数的第1个参数n表示文件描述符集合中最大值再加1;第2个参数readfds,表示可读的文件描述符集合,用于查看是否有可读取数据;第3个参数writefds表示可写的文件描述符集合,用于查看是否能写入数据;第4个参数exceptfds用于异常控制;最后一个参数timeout决定了select将会阻塞多久才把控制权移交给调用它的进程。调用select之前,必须对此参数进行初始化。若timeout值为0,则select直接返回0。此时I/O操作没有等待就立即返回,相当于一种非阻塞I/O的调用。

    在应用中,通常先调用select查看哪个I/O设备可读/写。如果没有可读/写的设备,并且没有设置超时返回功能,那么进程将阻塞在select调用上;如果有,则select函数返回,紧接着可通过测试参数readfds和writefds来确定哪个I/O设备可读或能写,而后以非阻塞方式操作该I/O设备,从而实现期望功能。


在实现select应用的过程中,还会使用到这些select相关接口:

    voidFD_ZERO(fd_set*fdset);

    voidFD_SET(intfd,fd_set*fdset);

    voidFD_CLR(intfd,fd_set*fdset);

    intFD_ISSET(intfd,fd_set*fdset);

    其中,fd_set表示设备文件描述符集合,fd表示设备文件描述符。FD_ZERO函数用于清除设备文件描述符集合所有元素;FD_SET函数用于把某个文件描述符添加至文件描述符集合;FD_CLR函数用于从文件描述符集合中删除某个文件描述符;而FD_ISSET用于检测设备文件描述符集合的某个文件描述符是否有效,有效则表示该位对应的设备有数据可读或可写。

    4轮询检测方法与select方法的比较



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值