用途
相比与普通的阻塞IO模型
select相当于是一名监管员
把多个要处理的文件描述符纳入自己的监管
在设定的时间内阻塞查询 看哪些套接字是就绪的
如果是就绪的则对这些套接字进行IO处理
用法
看一下下面这段简单的代码
实现的功能就是把标准输入(即文件描述符为0)
那入select的监管
然后select在5s内阻塞的轮询
看是否有读就绪事件
如果有的话就返回 然后对其进行处理
如果超时或者出错的或也返回
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include<strings.h>
#include<sys/socket.h>
#include<iostream>
#include<arpa/inet.h>
using namespace std;
int main(void) {
/**step1 : select工作之前,需要知道要监管哪些套接字**/
int listen_fd=0;
fd_set read_set;
FD_ZERO(&read_set);
FD_SET(listen_fd,&read_set);
/*step2 : select开始工作,设定时间内阻塞轮询套接字是否就绪*/
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
int ret=select(listen_fd+1,&read_set,NULL,NULL,&tv);
/*step3 : select完成工作,即如果出现就绪或者超时 ,则返回*/
if(ret==-1){
cout<<"errno!"<<endl;
}
else if(ret==0){
cout<<"time out"<<endl;
}
else if(ret>0){
if(FD_ISSET(listen_fd,&read_set));
{
char *buffer=new char[10];
read(listen_fd,buffer,sizeof(buffer));
cout<<"Input String : "<<buffer<<endl;
}
}
}
使用方法总结如下
接口
上面的使用涉及到了下面几个接口
fd_set
1.fd_set是一种位数组类型,
也就是说数组中的数组元素值只能是0或1
2.因为由上面小实例
可以看出 select要监听三种就绪事件(可读 可写 出错)
是通过先建立三个事件对应的位数组
然后三个位数组初始化
然后把要监听的套接字
在该套接字数组中置为1进行的
FD_SET
FD_SET(int fd, fd_set *set)
把文件描述符fd加入到
对应的监听列表( fd_set类型的位数组),
就是把数组中该文件描述符位的元素置1,
FD_CLR
FD_CLRint fd, fd_set *set)
把文件描述符fd踢出
出对应的监听列表