智游推送:IO多路复用详解—select

智游推送:IO多路复用详解—select

ID:40846221

大小:22.88 KB

页数:4页

时间:2019-08-08

智游推送:IO多路复用详解—select_第1页
智游推送:IO多路复用详解—select_第2页
智游推送:IO多路复用详解—select_第3页
智游推送:IO多路复用详解—select_第4页
资源描述:

《智游推送:IO多路复用详解—select》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、I/O多路复用详解—支持I/O复用的系统调用select智游推送继上次讲解I/O多路复用详解—支持I/O复用的系统调用poll这次讲解的是I/O多路复用详解—支持I/O复用的系统调用select。1、select函数select系统调用是用来让我们的程序监视多个文件句柄(filedescrīptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。文件在句柄在Linux里很多,如果你man某个函数,在函数返回值部分说到成功后有一个文件句柄被创建的都是的,如mansocket可以看到“Onsuccess,a

2、filedescrīptorforthenewsocketisreturned.”而man2open可以看到“open()andcreat()returnthenewfiledescrīptor”,其实文件句柄就是一个整数,看socket函数的声明就明白了:intsocket(intdomain,inttype,intprotocol);当然,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE*结构的表示就是stdin、stdout、stderr,0就是stdin,1就是stdout,

3、2就是stderr。比如下面这两段代码都是从标准输入读入9个字节字符:#include#include#includeintmain(intargc,char**argv){charbuf[10]=“”;read(0,buf,9);/*从标准输入0读入字符*/fprintf(stdout,“%s”,buf);/*向标准输出stdout写字符*/return0;}/***上面和下面的代码都可以用来从标准输入读用户输入的9个字符***/#include#include#includeintmain(intargc,char**argv){charbuf

4、[10]=“”;fread(buf,9,1,stdin);/*从标准输入stdin读入字符*/write(1,buf,strlen(buf));return0;}继续上面说的select,就是用来监视某个或某些句柄的状态变化的。select函数原型如下:intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);函数的最后一个参数timeout显然是一个超时时间值,其类型是structtimeval*,即一个structtimeval结

5、构的变量的指针,所以我们在程序里要申明一个structtimevaltv;然后把变量tv的地址&tv传递给select函数。structtimeval结构如下:structtimeval{long   tv_sec;        /*seconds*/long   tv_usec;       /*microseconds*/};第2、3、4三个参数是一样的类型:fd_set*,即我们在程序里要申明几个fd_set类型的变量,比如rdfds,wtfds,exfds,然后把这个变量的地址&rdfds,&wtfds,&exfds传递给select函数。这

6、三个参数都是一个句柄的集合,第一个rdfds是用来保存这样的句柄的:当句柄的状态变成可读的时系统就会告诉select函数返回,同理第二个wtfds是指有句柄状态变成可写的时系统就会告诉select函数返回,同理第三个参数exfds是特殊情况,即句柄上有特殊情况发生时系统会告诉select函数返回。特殊情况比如对方通过一个socket句柄发来了紧急数据。如果我们程序里只想检测某个socket是否有数据可读,我们可以这样:fd_setrdfds;/*先申明一个fd_set集合来保存我们要检测的socket句柄*/structtimevaltv;/*申明一个

7、时间变量来保存时间*/intret;/*保存返回值*/FD_ZERO(&rdfds);/*用select函数之前先把集合清零*/FD_SET(socket,&rdfds);/*把要检测的句柄socket加入到集合里*/tv.tv_sec=1;tv.tv_usec=500;/*设置select等待的最大时间为1秒加500毫秒*/ret=select(socket+1,&rdfds,NULL,NULL,&tv);/*检测我们上面设置到集合rdfds里的句柄是否有可读信息*/if(ret<0)perror(“select”);/*这说明select函数出错*

8、/elseif(ret==0)printf(“超时”);/*说明在我们设定的时间值1秒加5

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。