使用epoll时需要将socket设为非阻塞吗?

tom555cat 2014-05-01 08:04:14
在APUE中介绍select和poll中说“一个描述阻塞与否并不影响select是否阻塞。也就是说,如果希望读一个非阻塞描述符,并且以超时值5s调用select,则select最多阻塞5s。”
我看到有些程序使用epoll时,使用fcntl将描述符置为非阻塞。这个和上面描述的有冲突没?
...全文
569 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
beginning1126 2015-10-29
  • 打赏
  • 举报
回复
水平触发,只要可读或可写,事件会一直触发 边缘触发,只有从不可读变为可读、从不可写变成可写,事件才会触发 基于此,水平触发,socket不需要设置为non-block,因为只要触发,就可以读或写。 而对于水平触发,事件一旦触发,需要用户一直读,直到缓冲区数据全部读完为止才可以,如果设置为block,在没有数据可读时,就block了,需要用eagain错误来告知用户,数据读完了,不用再读了。
hithu2008 2015-08-14
  • 打赏
  • 举报
回复
我理解,et的epoll需要循环,多次对fd进行读取,读取到无数据后,应该获取到一个错误,表示本次数据读取完成。 如果用非阻塞模式,则不会得到一个错误,而是将读取动作阻塞,这样造成epoll程序阻塞住。
ramboww 2014-09-23
  • 打赏
  • 举报
回复
引用 3 楼 wallwind 的回复:
边缘触发是要设置成非阻塞,成因为边缘触发本身不是一次性读完数据的。
能否再具体点,为什么不是一次性读完数据的 就需要nonblock?
tom555cat 2014-05-02
  • 打赏
  • 举报
回复
引用 3 楼 wallwind 的回复:
边缘触发是要设置成非阻塞,成因为边缘触发本身不是一次性读完数据的。
那是不是比水平触发写程序需要注意更多的东西,也就是要不断地读取直到缓冲空,而水平触发就不需要这么做?
mhtlee 2014-05-02
  • 打赏
  • 举报
回复
引用 3 楼 wallwind 的回复:
边缘触发是要设置成非阻塞,成因为边缘触发本身不是一次性读完数据的。
这个问题问的很不错,我最近也在疑惑问题,楼上的大牛是否可以讲的再详细一点 @wallwind
wintree 2014-05-01
  • 打赏
  • 举报
回复
边缘触发是要设置成非阻塞,成因为边缘触发本身不是一次性读完数据的。
Pump天天学习 2014-05-01
  • 打赏
  • 举报
回复
epoll有两种工作模式 其中ET要设置非阻塞
mujiok2003 2014-05-01
  • 打赏
  • 举报
回复
The epoll interface, when used with the EPOLLET flag ( Edge Triggered ) should use non-blocking file descriptors to avoid having a blocking read or write starve the task that is handling multiple file descriptors 具体你看看这个

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧