IO复用--Epoll

介绍

epoll 是linux特有的I/O 复用函数。它在实现和使用上select、poll有很大差异,首先,epoll使用一组函数来完成任务,而不是单个函数。其次,epoll吧用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无须象select和poll那样每次调用都要重复传入文件描述集合或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。这个文件描述符使用如下epoll_create()函数类创建:

#include <sys/epoll.h>
int epoll_create(int size) 
  • size: 给内核一个提示,告诉它事件表需要多大
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd,struct epoll_event *event)
  • epfd: epoll_create() 的返回值

  • fd: 要操作的描述符

  • op: 指定操作类型
    EPOLL_CTL_ADD: 往事件表中注册fd上的事件
    EPOLL_CTL_MOD: 修改fd上的注册事件
    EPOLL_CTL_DEL: 删除fd上的注册事件

  • event: 指定事件

    struct epoll_event{
    __uint32_t events; // epoll 事件
    epoll_data_t data; //用户数据
    };

    events 成员描述事件类型。epoll支持的事件类型和poll基本相同。表示epoll的事件类型的宏是在poll对应的宏前加上“E”。

    typedef union epoll_data
    {
    void * ptr;
    int fd;
    uint32_t u32;
    uint64_t u64;
    }epoll_data_t;

    epoll_data_t 是个联合体,fd用的最多,它指定事件所从属的文件描述符。ptr成员可用来指定与fd相关的用户数据。因为是个联合体,所以可以将fd放入ptr中传递更多内容。

  • epoll_ctl返回值: 成功返回0, 失败返回-1并设置errno

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)
  • 返回值: 成功返回就绪描述符个数,失败返回-1并设置errno
  • maxevents 参数指定最多可以监听多少个事件,他必须大于0
    epoll_wait函数如果检测到事件,就将所有就绪的事件从内核事件表中复制到它的第二个参数events指向的数组中。这个数组只用来输出epoll就绪事件

工作模式

LT: 电平模式
默认工作模式。当epoll_wait 检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理。这样当应用程序下次再调用epoll_wait时,epoll_wait还会再次向应用程序通知此事件,直到事件被处理。

ET: 边缘模式
当epoll_wait 检测到其上有事件发生并将此事件通知应用程序后,应用程序必须即处理。因为后续epoll_wait不会再向应用程序通知此事件。ET模式很大程度降低同一个epoll事件被重复触发的次数,因此效率比LT模式高。

注意:EPOLLONESHOT, 尽管使用ET模式,一个socket上的某个事件还是可能被多次触发,为了预防一个socket被多个线程同时操作,所以需要在监听事件中增加EPOLLONESHOT,防止竞争状态,一个线程处理完毕后需要重新设置监听事件,允许其他线程访问。

void reset_oneshot(int epfd, int fd)
{
	struct epoll_event event;
	event.data.fd = fd;
	event.events = EPOLLIN | EPOLLET | EPOLLONESHOT
	epoll_ctl(epfd, EPOLL_CTL_MOD,fd, &event);
}

select 、poll、epoll对比

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值