免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: langwan1314
打印 上一主题 下一主题

[C] Linux Epoll介绍和程序实例 [复制链接]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
11 [报告]
发表于 2010-07-08 12:46 |只看该作者
请问,epoll的可移植性如何?比如,UNIX,AIX,Solaris,win,HP-UX?
yulihua49 发表于 2010-07-08 11:20



    只有linux支持,还得是2.6之后的

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
12 [报告]
发表于 2010-07-08 12:47 |只看该作者
回复  langwan1314


    timeout: 等待 I/O 事件发生的超时值; 是按秒计的吗?
另外,需要连接什么库 ...
yulihua49 发表于 2010-07-08 11:42



    毫秒。不需要特别的库

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
13 [报告]
发表于 2010-07-08 13:07 |只看该作者
只有linux支持,还得是2.6之后的
hellioncu 发表于 2010-07-08 12:46



       好像solaris支持。但不知windows是否支持。
想写一个服务器,在linux和windows上都能运行的。

论坛徽章:
0
14 [报告]
发表于 2010-07-08 23:01 |只看该作者
1、如果fd被注册到两个epoll中时,如果有时间发生则两个epoll都会触发事件。
2、如果注册到epoll中的fd被关闭,则其会自动被清除出epoll监听列表。
3、如果多个事件同时触发epoll,则多个事件会被联合在一起返回。
4、epoll_wait会一直监听epollhup事件发生,所以其不需要添加到events中。
5、为了避免大数据量io时,et模式下只处理一个fd,其他fd被饿死的情况发生。linux建议可以在fd联系到的结构中增加ready位,然后epoll_wait触发事件之后仅将其置位为ready模式,然后在下边轮询ready fd列表。

6、epoll_ctl epoll的事件注册函数,其events参数可以是以下宏的集合:
EPOLLIN:    表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:   表示对应的文件描述符可以写;
EPOLLPRI:   表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:   表示对应的文件描述符发生错误;写已关闭socket pipe broken
EPOLLHUP:   表示对应的文件描述符被挂断;譬如收到RST包。在注册事件的时候这个事件是默认添加。
EPOLLRDHUP: 表示对应的文件描述符对端socket关闭事件,主要应用于ET模式下。
在水平触发模式下,如果对端socket关闭,则会一直触发epollin事件,驱动去处理client socket。
在边沿触发模式下,如果client首先发送协议然后shutdown写端。则会触发epollin事件。但是如果处理程序只进行一次recv操作时,根据recv收取到得数据长度来判读后边是否还有需要处理的协议时,将丢失客户端关闭事件。

EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
15 [报告]
发表于 2010-07-09 10:56 |只看该作者
1、如果fd被注册到两个epoll中时,如果有时间发生则两个epoll都会触发事件。
2、如果注册到epoll中的fd被关 ...
langwan1314 发表于 2010-07-08 23:01



    好!!
再问:epoll_ctl 与  epoll_wait不在一个线程行吗?,如果epoll_ctl加入了一个事件,epoll_wait能立即知道吗?还是需要退出来重新开始?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
16 [报告]
发表于 2010-08-07 09:56 |只看该作者
本帖最后由 yulihua49 于 2010-08-07 09:58 编辑
好!!
再问:epoll_ctl 与  epoll_wait不在一个线程行吗?,如果epoll_ctl加入了一个事件,epo ...
yulihua49 发表于 2010-07-09 10:56



    自己解答:可以,很好用,事件立即得到响应。
再问:如何处理个别fd的超时(如果每个fd的超时值不同),setsocketopt不起作用。

HP-UX果然不支持epoll。

论坛徽章:
0
17 [报告]
发表于 2010-08-07 16:12 |只看该作者
貌似A线程epoll_wait,
B线程epoll_ctl同一个epoll描述符,
也是安全的?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
18 [报告]
发表于 2010-08-07 22:12 |只看该作者
本帖最后由 yulihua49 于 2010-08-07 22:29 编辑
貌似A线程epoll_wait,
B线程epoll_ctl同一个epoll描述符,
也是安全的?
okocha-jay 发表于 2010-08-07 16:12



    是的。我原来也担心。
现在,一个主线层,accept,收到连接后,epoll_ctl ADD
一个调度线程,epoll_wait,收到活动事件,推到ready队列
若干工作线程,在ready队列等待,收到事件分发给用户函数,完成后做epoll_ctl,回到epoll队列等待。
工作的很好。
最郁闷的是很多系统没有epoll,想把IOCP,poll包装成epoll。

论坛徽章:
0
19 [报告]
发表于 2010-08-10 18:03 |只看该作者
收藏了

论坛徽章:
0
20 [报告]
发表于 2010-08-10 18:16 |只看该作者
先回后看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP