免费注册 查看新帖 |

Chinaunix

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

[函数] epoll学习笔记 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-15 11:51 |只看该作者
原帖由 cugb_cat 于 2008-4-29 20:15 发表
在使用非阻塞模式时,ET模式下要一直循环直到EAGAIN错误。
还有楼主说的那个相应的buffer,就是内核缓冲区,这个缓冲区与文件IO中文件系统中的缓冲区概念是差不多的。



前一句话我的理解与你不同,我的理解是:
在ET模式下,不需要循环读到EAGAIN.只要你read返回的数据小于你请求的数据时,则认为已读尽缓冲区了.

请看这个:

       Q9     Do I need to continuously read/write an fd until EAGAIN when using the EPOLLET  flag  (  Edge  Triggered
              behaviour ) ?

       A9     No  you  don't. Receiving an event from epoll_wait(2) should suggest to you that such file descriptor is
              ready for the requested I/O operation. You have simply to consider it ready until you will  receive  the
              next  EAGAIN.  When and how you will use such file descriptor is entirely up to you. Also, the condition
              that the read/write I/O space is exhausted can be detected by checking the  amount  of  data  read/write
              from/to  the target file descriptor. For example, if you call read(2) by asking to read a certain amount
              of data and read(2) returns a lower number of bytes, you can be sure to  have  exhausted  the  read  I/O
              space for such file descriptor. Same is valid when writing using the write(2) function.

论坛徽章:
0
12 [报告]
发表于 2008-05-16 14:17 |只看该作者

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2008-05-16 21:20 |只看该作者

回复 #11 yulc 的帖子

的确

论坛徽章:
0
14 [报告]
发表于 2008-05-22 14:04 |只看该作者
楼主幸苦了,支持楼主

论坛徽章:
0
15 [报告]
发表于 2008-05-22 14:11 |只看该作者
原帖由 yulc 于 2008-5-15 11:51 发表



前一句话我的理解与你不同,我的理解是:
在ET模式下,不需要循环读到EAGAIN.只要你read返回的数据小于你请求的数据时,则认为已读尽缓冲区了.

请看这个:

       Q9     Do I need to continuously re ...

UDP中是,TCP就不一定了吧?可能内核只收到了一部分,剩下的还没到达,这时read就可能返回小于请求的数据长度。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2008-05-22 15:00 |只看该作者

回复 #15 cugb_cat 的帖子

个人认为epoll 提到的状态改变只是针对I/O缓冲区的状态改变. 跟内核接收没什么关系吧.

这个应该是一个生产者与消费者的关系. 内核只管接收..收到后放到缓冲区. epoll 或 select 会检查
缓冲区是否有数据. 有就触发可读事件.


再有: recv 返回值小于请求的长度. 说明缓冲区已经没有可读数据. 当你再读肯定会触发EAGAIN.
当然你可以再读一次.判断 errno ==  EAGAIN 然后再退出.. 我觉得这两个判断条件最终都是归
结到EAGAIN..依据应该都是一样的.

我想应该是这样的.

[ 本帖最后由 cookis 于 2008-5-22 15:06 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-05-22 15:03 |只看该作者
原帖由 cookis 于 2008-5-22 15:00 发表
个人认为epoll 提到的状态改变只是针对I/O缓冲区的状态改变. 跟内核接收没什么关系吧.

这个应该是一个生产者与消费者的关系. 内核只管接收..收到后放到缓冲区. epoll 或 select 会检查
缓冲区是否有数据. 有 ...

是啊,但是当缓冲区中的数据不够read的请求数据长度呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2008-05-22 15:06 |只看该作者
你回得好快..

论坛徽章:
0
19 [报告]
发表于 2008-05-22 15:38 |只看该作者
原帖由 cookis 于 2008-5-22 15:06 发表
你回得好快..

我觉得这样还是不保险的。

论坛徽章:
0
20 [报告]
发表于 2008-05-22 21:42 |只看该作者
原帖由 cookis 于 2008-5-22 15:00 发表
个人认为epoll 提到的状态改变只是针对I/O缓冲区的状态改变. 跟内核接收没什么关系吧.

这个应该是一个生产者与消费者的关系. 内核只管接收..收到后放到缓冲区. epoll 或 select 会检查
缓冲区是否有数据. 有 ...


recv 返回值小于请求的长度时说明缓冲区已经没有可读数据. 但再读不一定会触发EAGAIN.有可能返回0表示TCP连接已被关闭。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP