zoukankan      html  css  js  c++  java
  • 对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提供了事件通知的两种方式,文件描述符作为事件附着的抽象标识.

  • 相关阅读:
    bzoj4849: [Neerc2016]Mole Tunnels
    bzoj 4069~4071 APIO2015
    bzoj 4885: [Lydsy2017年5月月赛]长方体
    bzoj4891: [Tjoi2017]龙舟
    bzoj4892: [Tjoi2017]dna
    bzoj 3159: 决战
    bzoj3672: [Noi2014]购票
    bzoj4738: 汽水
    bzoj 4737: 组合数问题
    bzoj 4872: [Shoi2017]分手是祝愿
  • 原文地址:https://www.cnblogs.com/burningTheStar/p/7459466.html
Copyright © 2011-2022 走看看