[原]高级I_O复用技术:Epoll的使用及一个完整的C实例 - Moon_Bird - 博客园.pdfVIP

[原]高级I_O复用技术:Epoll的使用及一个完整的C实例 - Moon_Bird - 博客园.pdf

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[原]高级I_O复用技术:Epoll的使用及一个完整的C实例 - Moon_Bird - 博客园

13-7-1 [原]高级I/O复用技术:Epoll的使用及一个完整的C实例 - Moon_Bird - 博客园 /moonlove/archive/2012/03/17/2509150.html 1/14 Moon_Bird Just do it; 技术爱好:c/c++; python;linux 服务器编程 随笔- 20 文章- 0 评论- 4 [原]高级I/O复用技术:Epoll的使用及一个完整的C实例 高性能的网络服务器需要同时并发处理大量的客户端,而采用以前的那种对每个连接使用一个分开的线程或进程方法效率不高, 因为处理大量客户端的时候,资源的使用及进程上下文的切换将会影响服务器的性能。一个可替代的方法是在一个单一的线程中使用非 阻塞的I/O(non-blocking I/O)。 这篇文章主要介绍linux下的epoll(7)方法,其有着良好的就绪事件通知机制。我们将会使用C来展现一个完整的TCP服务器实现代 码。Epoll是被linux2.6开始引进的,但是不被其他的类UNIX系统支持,它提供了一种类似select或poll函数的机制: 1.Select(2)只能够同时管理FD_SETSIZE数目的文件描述符 2. poll(2)没有固定的描述符上限这一限制,但是每次必须遍历所有的描述符来检查就绪的描述符,这个过程的时间复杂度为 O(N)。 epoll没有select这样对文件描述符上限的限制,也不会像poll那样进行线性的遍历。因此epoll处理大并发连接有着更高的性能。 Epoll相关操作函数介绍: 1. epoll_create(2) or epoll_create1(2)(有着不同的参数值)用来创建epoll实例。 /usr/include/sys/epoll.h extern int epoll_create (int __size) ; RETURN:0, 成功;-1, 出错 函数描述: (1) epoll_create返回的是一个文件描述符,也就是说epoll是以特殊文件的方式体现给用户 (2) __size提示操作系统,用户可能要使用多少个文件描述符,该参数已经废弃,填写一个大于0的正整数 2. epoll_ctl(2)用来增加或移除被epoll所监听的文件描述符。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); RETURN:0,成功;-1,出错 函数描述: (1) epfd为epoll_create创建的epoll描述符 (2) epoll_ctl函数对epoll进行op类型的操作,op选项为 EPOLL_CTL_ADD,对fd描述符注册event事件 EPOLL_CTL_MOD,对fd描述符的event事件进行修改 EPOLL_CTL_DEL,删除已注册的event事件 3. epoll_wait(2)用来等待发生在监听描述符上的事件。它会一直阻塞直到事件发生。 #include sys/epoll.h int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); RETURN:0,发生事件个数;=0,时间到;-1,出错 函数描述: epoll_wait与select函数类似,同步地等待事件发生 (1) epfd,标识epoll的文件描述符 (2) events,指向传入操作系统的一个epoll_event数组 (3) maxevents,表示传入数组的大小,必须大于0 当有事件发生,Linux会填写events结构,返回给应用程序。由于epoll_wait同步等待,有可能被信号中断,返回EINTR错误 更多的函数介绍请参照man。 Epoll的两种模式: 1. 水平触发(LT):使用此种模式,当数据可读的时候,epoll_wait()将会一直返回就绪事件。如果你没有处理完全部数据,并且 再次在该epoll实例上调用epoll_wait()才监听描述符的时候,它将会再次返回就绪事件,因为有数据可读。ET只支持非阻塞socket。 2. 边缘触发(ET):使用此种模式,只能获取一次就绪通知,如果没有处理

文档评论(0)

l215322 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档