对linux下文件描述符和epoll工作模式的理解

1.文件描述符


linux下的文件描述符是一个用于表述指向文件的引用的抽象化概念(在windows下是HANDLE句柄).

文件描述符在形式上是一个非负整数值.但实际上,他是一个索引值,指向系统内核为每个进程维护的一张记录表.

在这张记录表上记录每个进程打开的文件对应的文件结构体信息. 

那么也就是说,文件描述符不存在事件这一说法,文件描述符本身不会产生事件,但文件描述符对应的文件可能会因为modify而产生事件.

这些事件是怎么产生的,由谁产生的,怎样让epoll捕捉到此事件.都是系统在对事件进行维护和通知

这是理解epoll的一个重要因素.

2.epoll工作模式


epoll不产生事件,但它监听并报告事件.

报告的事件类型有:

EPOLLIN

EPOLLOUT

EPOLLPRI

EPOLLERR

EPOLLHUP

EPOLLET

EPOLLONESHOT

如果监听的文件描述符对应的文件出现了以上七种事件,就可以被epoll正确的捕捉到.

epoll可以在两种模式下来捕捉监听的文件描述符产生的事件.

第一种是:ET模式,也就是Edge Triggered模式,只有文件发生变化的时候才会报告事件,意思是在一段时间内,连续的同样事件只报告一次,之后即便有相同的事件,也不再向上提交.

第二种是:LT模式,也就是Level Triggered模式,在这种模式下,epoll如实将文件上的事件向上一一传达,文件上什么时候有事件,有什么事件,epoll就向上传达什么,直到该事件被操作系统消除.

3.应用方式


目前接触过的应用中如果使用ET模式,文件描述符必须设为非阻塞模式以避免由于一个文件的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死,比如在对socket链接进行事件监听时,如果收到epoll的通知,那么就代表网络上有数据到来,然后循环recv,直到返回值小于指定的读取数据长度,错误码为EAGAIN时,表示链接上的数据已经读取完毕,应该去等待下一次的通知;又比如,在socket的accpet上,一旦收到通知,就不断地进行accept直到返回值为-1,把accept队列的所有已经完成建立连接的socket fd拿出来向上递交.

总结:事件由系统产生,epoll提供了事件通知的两种方式,文件描述符作为事件附着的抽象标识.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互扯程序

Java 9 逆天的十大新特性

KS Knowledge Sharing 知识分享 现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。 在介绍...

1996
来自专栏拂晓风起

node.js WebService异常处理(domain)以及利用domain实现request生命周期的全局变量

1343
来自专栏喵了个咪的博客空间

phalapi-进阶篇1(Api,Domain,和Model)

#phalapi-进阶篇1(Api,Domain,和Model)# ? ##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个...

3387
来自专栏张善友的专栏

Microsoft Sync Framework 1.0 RTM发布了

Microsoft Sync Framework 是一个功能完善的同步平台,实现了应用程序、服务和设备的协作和脱机访问。它提供了一些可支持在脱机状态下漫游、共享...

1756
来自专栏前端大白专栏

使用dva脚手架中使用redux-sage感受

1244
来自专栏jessetalks

异步编程 In .NET

概述   在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的...

2886
来自专栏微信终端开发团队的专栏

微信移动端数据库组件 WCDB 系列:iOS 基础篇(一)

WCDB 是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案。

9312
来自专栏程序员的SOD蜜

ORM查询语言(OQL)简介--概念篇

相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查...

23210
来自专栏智能大石头

NetCore版RPC框架NewLife.ApiServer

1274
来自专栏更流畅、简洁的软件开发方式

【自然框架 NatureFW】里的两种“映射”方式

自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的“CCM ” (我自己想的,呵呵)。 先说一下ORM。ORM是O和R的映射关系。也看到很多人写...

1635

扫描关注云+社区