对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 条评论
登录 后参与评论

相关文章

来自专栏码洞

求不更学不动之Redis5.0新特性Stream尝鲜

Redis5.0最近被作者突然放出来了,增加了很多新的特色功能。而Redis5.0最大的新特性就是多出了一个数据结构Stream,它是一个新的强大的支持多播的可...

972
来自专栏Golang语言社区

棋牌游戏服务器架构: 详细设计(一) 内核设计

内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: ? 图1 IService接口 Start方法用来启动服务。 ...

3134
来自专栏PingCAP的专栏

使用 TiKV 构建分布式类 Redis 服务

Redis 是一个开源的,高性能的,支持多种数据结构的内存数据库,已经被广泛用于数据库,缓存,消息队列等领域。它有着丰富的数据结构支持,譬如 String,Ha...

290
来自专栏Java成神之路

【转】JAVA之网络编程

网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习。

1067
来自专栏架构说

tcp粘包问题补充

上篇文章 提到阻塞(block)一下如何read数据 这里针对是非阻塞如何read数据 并且纠正前面出现几个错误 (1) 非阻塞 遇到errno=EAGAIN必...

2666
来自专栏PhpZendo

深入浅出 Laravel 的 Facade 外观系统

本文将从以下几个方面出发,全面讲解 Laravel 中 Facade 的运行原理,为了便于理解后续中所有 Facade 译作「外观」:

810
来自专栏码洞

求不更学不动之Redis5.0新特性Stream尝鲜

Redis5.0最近被作者突然放出来了,增加了很多新的特色功能。而Redis5.0最大的新特性就是多出了一个数据结构Stream,它是一个新的强大的支持多播的可...

1086
来自专栏博客园迁移

工作中的一些经验小结

控制层   返回值统一 AOP 也方便前台 AOP 统计执行时间记录日志   参数不要出现Request, Response   返回码定义 不...

552
来自专栏猿天地

Spring Cloud中如何保证各个微服务之间调用的安全性

不是说你想调用就可以调用,一定要有认证机制,是我们内部服务发出的请求,才可以调用我们的接口。

1192
来自专栏V站

SEO丨PHP外链跳转防止权重转移

当我们的网站分享出某些比较出名,有用的网站时,除了加Nofollow标签,还能使用什么方法来避免权重转移呢?

1807

扫码关注云+社区