select 模型

本文介绍了Linux中的select模型,也称为多路复用输入/输出模型。通过select函数,可以同时监控多个文件描述符(如socket)的可读、可写和异常事件。在讲解中提到了参数的含义,如nfds、readfds、writefds、exceptfds和timeout,并解释了阻塞和非阻塞模式。文章还强调了在循环读取时,需要在每次迭代前清空并重新设置fd_set集合的重要性。
摘要由CSDN通过智能技术生成

select 模型

具体的模型名称是:多路复用输入/输出模型

直白的解释:比如说你的设备同时接收来自网络的两路数据,这时你可以建两个socket来接收,用select函数就可以同时监控两个socket的情况,完成两个socket的接收,这就是所谓“多路复用接收”。参考:这里

这里边的FD指的是file descriptor(文件描述符)


系统调用:

#include<sys/select.h> // select

#include<sys/time.h> // struct timeval 

int select (int nfds , fd_set* readfds , fd_set * writefds , fd_set * exceptfds , struct timeval * timeout );

select监听文件描述符(也就是文件的句柄)的属性事件,属性包括:可读、可写、和异常。它可以是阻塞也可以是非阻塞的,监听的时候,一般使用while(1)循环。对于结构体fd_set 稍后了解。监听的文件描述符,不局限于网络编程里边的套接字文件描述符,Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。

参数介绍:

nfds:

是需要监视的最大的文件描述符值+1,在使用select之前,要记得找到那几个监听的句柄的最大值。

可读:

比如A、B两端通信,A向B发送套接字消息,但是B不知道A何时发,那么就用select监听可读事件,因为可读也就意味着有数据来了。

可写:

而对于可写情况,多数网络编程的时候,不需要使用,因为网络缓冲区一般都很大。例子

异常:

指的是异常条件出现的文件描述符,错误并不包括在里边。

阻塞和非阻塞:

用第五个参数来控制:

1.    timeout=NULL                                   (阻塞:直到有一个fd位被置为1函数才返回)
2.    timeout所指向的结构设为非零时间(等待固定时间:有一个fd位被置为1或者时间耗尽,函数均返回)
3.    timeout所指向的结构,时间设为0  (非阻塞:函数检查完每个fd后立即返回)

返回值:

小于0(-1):表示select函数出现错误,或者因为停止信号而停止,想要得到真正原因,可以通过errno得到,具体参考:这里

等于0:超时

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值