epoll使用详解

一、epoll的工作原理

epoll相比select和poll的优势:

1. 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;而epoll保证了每个fd在整个过程中只会拷贝一次。

2. 每次调用select都需要在内核遍历传递进来的所有fd;而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了。

3.  内核仅会将有 IO 事件的文件描述符返回给用户,用户也无需遍历整个文件描述符集合。

4.  没有文件描述符1024的限制(poll和epoll都是)

二、epoll的API

1、创建EPOLL句柄

2、向EPOLL对象中添加、修改或者删除感兴趣的事件

举例:将cfd文件描述符上树

int epfd = epoll_create(1);// 创建EPOLL句柄

// 结点的结构体
struct epoll_event ev;
ev.data.fd = cfd;
ev.events = EPOLLIN;

/****************************************
* events取值:
*           EPOLLIN   表示有数据可以读出(接受连接、关闭连接)
*           EPOLLOUT  表示连接可以写入数据发送(向服务器发起连接,连接成功事件)
*           EPOLLERR  表示对应的连接发生错误
*	        EPOLLHUP  表示对应的连接被挂起
*****************************************/

// 结点上树
epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ev);

3.收集在EPOLL监控的事件中已经发生的事件

三、epoll的工作方式

Level_triggered(水平触发) :只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作;

Edge_triggered(边缘触发):它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。

边沿触发设置方式:ev.events = EPOLLIN | EPOLLET

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyt涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值