用途
相比与普通的阻塞IO模型
select相当于是一名监管员
把多个要处理的文件描述符纳入自己的监管
在设定的时间内阻塞查询 看哪些套接字是就绪的
如果是就绪的则对这些套接字进行IO处理
用法
看一下下面这段简单的代码
实现的功能就是把标准输入(即文件描述符为0)
那入select的监管
然后select在5s内阻塞的轮询
看是否有读就绪事件
如果有的话就返回 然后对其进行处理
如果超时或者出错的或也返回
#include
#include
#include
#include
#include
#include
#include
#include
#include
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 : "<endl;
}
}
}
使用方法总结如下
接口
上面的使用涉及到了下面几个接口
fd_set
1.fd_set是一种位数组类型,
也就是说数组中的数组元素值只能是0或1