自学内容网 自学内容网

【Linux:epoll】

目录

epoll与select、poll的区别:

epoll操作函数:

int epoll_create(int size);

epoll_ctl: 

epoll_wait: 


epoll与select、poll的区别:

  • select,poll底层是一个线性表的结构,而epoll是一个红黑树结构。
  • epoll、poll不能跨平台
  • select和poll的检测是线性检测,而epoll使用的是回调机制
  • select和poll存在用户/内核之间频繁拷贝数据的问题,但epoll不存在,在epoll中,内核和用户共用一块共享内存
  • 使用epoll没有最大文件描述符的限制,仅受系统中进程能打开的最大文件数目限制
  • 程序员通过epoll能直接拿到已就绪的文件描述符集合,不需要再次检测,而select和poll返回的集合需要判断才能知道哪些文件描述符就绪

epoll操作函数:

int epoll_create(int size);

  • 函数参数:在linux2.6.8以后,该参数是忽略的,只需要指定一个>0的数即可
  • 函数返回值:
    • 失败:-1
    • 成功:返回一个有效的文件描述符,通过这个文件描述符就可以访问创建的epoll实例 

epoll_ctl: 

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  • 函数的作用是管理红黑树实例上的节点,可以进行添加、删除、修改操作。 
  • 参数:
    • epfd:epoll_create()函数的返回值,通过该参数找到epoll的实例
    • op:一个枚举值。控制通过该函数该执行的操作
      1. EPOLL_CTL_ADD:往epoll模型中添加新节点
      2. EPOLL_CTL_MOD:修改epoll模型中存在的节点
      3. EPOLL_CTL_DEL:删除epoll模型中指定的节点
    • fd:文件描述符,即要添加/修改/删除的文件描述符
    • event:epoll事件,用来修饰第三个参数对应的文件描述符,指定检测该文件描述符的什么事件
  • 返回值:
    • 成功:0
    • 失败:-1

详细解释参数event:

event是一个结构体,有两个成员:events和data。

  • events:是一个委托epoll检测的事件,可以指定的epoll事件(常用)
    • EPOLLIN:读事件, 接收数据, 检测读缓冲区,如果有数据该文件描述符就绪
    • EPOLLOUT:写事件,发送数据,检测写缓冲区,如果可写文件描述符就绪
    • EPOLLERR:异常事件
  • data:传入的指定数据(备注传入事件的一些信息,例如事件存储在哪一个文件描述符),添加文件描述符时,没有指定任何data信息,则传出时,data联合体中没有数据,data中含有四个成员,一般情况下指定fd 。

epoll_wait: 

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

  •  epfd:epoll_create()函数的返回值,通过该参数找到epoll的实例
  • events:传出参数,这是一个结构体数组的地址,里面存储了已就绪的文件名描述符信息
  • maxevents:修饰第二个参数,结构体数组的容量
  • tomeout:如果检测的epoll实例中没有就绪的文件描述符,该函数的阻塞时长
    • 0:函数不阻塞
    • >0:如果epoll中没有已就绪的文件描述符,函数阻塞的毫秒数再返回
    • -1:函数一直阻塞
  • 返回值:
    • 成功:=0:函数阻塞被强制解除,没有检测到满足条件的文件描述符。>0:返回检测到已就绪的文件描述符个数
    • 失败:-1

原文地址:https://blog.csdn.net/2201_75755162/article/details/143812134

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!