- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第七章、高级I/O复用技术 高级polling技术 epoll相关函数 epoll客户端 epoll服务器 测试用例 1. 高级polling技术 select、poll、pselect函数存在的问题 高级polling技术没有标准,各个操纵系统的实现不一样 Solaris的/dev/poll FreeBSD的kqueue Linux的epoll技术 本章以epoll为例介绍高级polling技术 epoll的特点 epoll是对poll的改进 增量的事件添加与删除 支持边沿触发(edge trigger、ET)和水平触发(level trigger、LT) 同步的事件处理 基于文件描述操作 ET与LT 在ET模式下,事件只在epoll返回时通知应用程序。即是说,如果一次不干净地处理完通知事件,以后该事件再也不会通知应用程序 而在LT模式下,应用程序可以只处理一部分事件,剩下的事件,在下次epoll返回后,仍然还会通知用户 例子 一个pipe,writer向其中写入4KB reader只读取1KB 在ET模式下,剩下的3KB将不再通知 而在LT模式下,该事件仍然会通知应用程序 ET的效能更高,但是对程序员的要求也更高。在ET模式下,我们必须一次干净而彻底地处理完所有事件 2. epoll相关函数 epoll的创建 /usr/include/sys/epoll.h extern int epoll_create (int __size) __THROW; RETURN:0, 成功;-1, 出错 epoll_create返回的是一个文件描述符,也就是说epoll是以特殊文件的方式体现给用户 __size提示操作系统,用户可能要使用多少个文件描述符,该参数已经废弃,填写一个大于0的正整数 epoll的关闭 close,就像关闭一个文件一样 epoll添加事件 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); RETURN:0,成功;-1,出错 epfd为epoll_create创建的epoll描述符 epoll_ctl函数对epoll进行op类型的操作,op选项为 EPOLL_CTL_ADD,对fd描述符注册event事件 EPOLL_CTL_MOD,对fd描述符的event事件进行修改 EPOLL_CTL_DEL,删除已注册的event事件 epoll_event结构 struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ } __attribute__ ((__packed__)); /* 12bytes */ typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; /* 64bit */ epoll的事件类型 enum EPOLL_EVENTS { EPOLLIN = 0x001, #define EPOLLIN EPOLLIN EPOLLPRI = 0x002, #define EPOLLPRI EPOLLPRI EPOLLOUT = 0x004, #define EPOLLOUT EPOLLOUT EPOLLRDNORM = 0x040, #define EPOLLRDNORM EPOLLRDNORM EPOLLRDBAND = 0x080, #define EPOLLRDBAND EPOLLRDBAND EPOLLWRNORM = 0x100, #define EPOLLWRNORM EPOLLWRNORM EPOLLWRBAND = 0x200, #define EPOLLWRBAND EPOLLWRBAND EPOLLMSG = 0x400, #define EPOLLMSG EPOLLMSG EPOLLERR = 0x008, #define EPOLLERR EPOLLERR EPOLLHUP = 0x010, #define EPOLLHUP EPOLLHUP EPOLLRDHUP = 0x2000, #define EPOLLRDHUP EPOLLRDHUP EPOLLONESHOT = (1 30), #define EPOLLONESHOT EPOLLONESHOT EPOLLET = (1 31)
文档评论(0)