c语言多路复用技术

c语言多路复用技术

ID:8802505

大小:32.19 KB

页数:12页

时间:2018-04-08

c语言多路复用技术_第1页
c语言多路复用技术_第2页
c语言多路复用技术_第3页
c语言多路复用技术_第4页
c语言多路复用技术_第5页
资源描述:

《c语言多路复用技术》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、linux下的常见多路复用技术[C语言]postby陈俊生/2012-1-49:25Wednesday要实现I/O多路复用有很多的方式,其中可以用进程或者是线程等来实现,也可以用select/poll/epoll/port等来实现。在相比两者之间,利用select/poll/epoll/port等来实现复用效率更快,实现更容易,在底层的需要的资源更少,效率更快。下面就介绍一下select/poll/epoll/port等的具体用法。Select的用法。select原型:intselect(intn,fd_set*readfds,fd_set*writefds,fd_set*ex

2、ceptfds,structtimeval*timeout);其中参数n表示监控的所有fd中最大值+1。和select模型紧密结合的四个宏,含义不解释了:FD_CLR(intfd,fd_set*set);FD_ISSET(intfd,fd_set*set);FD_SET(intfd,fd_set*set);FD_ZERO(fd_set*set);理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。(1)执行fd_setset;FD_ZERO(&

3、set);则set用位表示是0000,0000。(2)若fd=5,执行FD_SET(fd,&set);后set变为0001,0000(第5位置为1)(3)若再加入fd=2,fd=1,则set变为0001,0011(4)执行select(6,&set,0,0,0)阻塞等待(5)若fd=1,fd=2上都发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。基于上面的讨论,可以轻松得出select模型的特点:(1)可监控的文件描述符个数取决与sizeof(fd_set)的值。我这边服务器上sizeof(fd_set)=512,每bit

4、表示一个文件描述符,则我服务器上支持的最大文件描述符是512*8=4096。据说可调,另有说虽然可调,但调整上限受于编译内核时的变量值。(2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,一是用于再select返回后,array作为源数据和fd_set进行FD_ISSET判断。二是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始select前都要重新从array取得fd逐一加入(FD_ZERO最先),扫描array的同时取得fd最大值maxfd,用于select的第一个参数。(3)可见select模型

5、必须在select前循环array(加fd,取maxfd),select返回后循环array(FD_ISSET判断是否有时间发生)。下面给一个伪码说明基本select模型的服务器模型:array[slect_len];nSock=0;array[nSock++]=listen_fd;(之前listenport已绑定并listen)maxfd=listen_fd;while{FD_ZERO(&set);foreach(fdinarray){fd大于maxfd,则maxfd=fdFD_SET(fd,&set)}res=select(maxfd+1,&set,0,0,0);if(FD

6、_ISSET(listen_fd,&set)){newfd=accept(listen_fd);array[nsock++]=newfd;if(--res<=0)continue}foreach下标1开始(fdinarray){if(FD_ISSET(fd,&set))执行读等相关操作如果错误或者关闭,则要删除该fd,将array中相应位置和最后一个元素互换就好,nsock减一if(--res<=0)continue}}poll模型poll()系统调用是SystemV的多元I/O解决方案。它解决了select()的几个不足,尽管select()仍然经常使用(多数还是出于习惯,或

7、者打着可移植的名义):poll的原型#includeintpoll(structpollfd*fds,unsignedintnfds,inttimeout);和select()不一样,poll()没有使用低效的三个基于位的文件描述符set,而是采用了一个单独的结构体pollfd数组,由fds指针指向这个组。pollfd结构体定义如下:#includestructpollfd{intfd;shortevents;shortrevents;};每一

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

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

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