IO复用之——poll


一. 关于poll 对于IO复用模型,其优点无疑是免去了对一个个IO事件就绪的等待,转而代之的是同时对多个IO数据的检测,当检测等待的事件中至少有一个就绪的时候,就会返回告诉用户进程“已经有数据准备好了,快看看是哪个赶紧处理”,而对于IO复用的实现,除了可以用select函数,另外一个函数仍然支持这种复用IO模型,就是poll函数;
二. poll函数的用法 虽然同样是对多个IO事件进行检测等待,但poll和select多少还是有些不同的:函数参数中,先来说nfds,这个是指当前需要关心的文件描述符的个数;timeout同样是设置超时时间,只是和select的timeout是一个结构体不一样,这里只是一个整型类型,且含义是毫秒;而fds是一个结构体指针,如下:免费云主机域名结构体中,
fd表示所要关心的文件描述符;events表示该文件描述符所关心的事件,这是一个输入型参数,要告诉操作系统这个文件描述符对应的事件所关心的操作事件是什么,比如读或写;revents是一个输出型参数,表示当poll返回时告诉用户什么操作事件是就绪的,比如如果POLLIN是就绪的,那么返回时revent的值就是POLLIN,告诉用户fd事件的POLLIN是就绪的;events和revents的值可以为如下:这里要说明选项其实不止这三个,只是这里的讨论中这三个选项是最常用的;events设置为POLLIN表示fd所需要读取数据,而revents若返回POLLIN则表示data已经ready可以读取了;同样,events设置为POLLOUT表示fd所关心数据的写入,而revents返回POLLOUT则表示写事件就绪可以进行数据的写入;至于POLLPRI,后面的解释是作为紧急选项来设置的,在TCP协议报文中有个URG的紧急指针是表示先从紧急数据的地方开始读取,这里也是这个意思;
三. 栗子时间 同样的,这里可以用poll来编写基于TCP协议的server端和client端的数据通信,和select一样,避免使用多进程和多线程的方式转而使用对多个IO接口的等待:
server服务器端:client客户端这里就不写了,和基于TCP协议的socket编程中的client是差不多的;
运行程序:
这里需要说明的是:和select不同,select是用一个fd_set数据类型来存放各个需要操作的IO文件描述符,这里的poll是用一个结构体来存放文件描述符和锁关心的事件类型,因此,poll并没有处理文件描述符的上限,但相同的是,每一次poll返回都仍然需要遍历来获取事件就绪的位置以此来进行相应的处理,还是一样有复制和系统遍历带来的额外开销,当处理事件比较多的时候仍然是低效的;在每一次循环到select之前都需要将对应事件的fd_set的集合调用FD_ZERO函数来进行重新的初始化清零,因为不是会有文件描述符的新建和关闭,需要进行初始化然后再将事件重新一一设置进相应的fd_set里面;而poll并不需要,因为使用一个结构体数组来管理相当于结合了select中的设置数组存放文件描述符和添加设置这两步,每一次进行poll的时候都会将发生就绪的事件对应的revents置位,当处理完毕就会被系统自动归为0,并不需要进行手动初始化清零;在结构体数组还未使用之前,和被刚定义的变量一样,结构体成员fd、events和revents都是随机值,虽然后来使用的时候都会被赋对应的有效值,但为了避免判断时的二义性问题最好还是在循环使用前都将其初始化为统一的可识别的无效值;

《完》

相关推荐: Juniper Netscreen常见

Netscreen常见问题汇总1.netscreen防火墙可不可以作HA?目前为止NetScreen-100以上的型号都可以做HA,NetScreen-50在新的OS版本中或许也能做HA。2.Netscreen是否支持负载均衡?在哪一端?是,Trust和DMZ…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/01 10:22
下一篇 02/01 10:22