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:超时