博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高性能编程之IO复用之epoll
阅读量:6592 次
发布时间:2019-06-24

本文共 1052 字,大约阅读时间需要 3 分钟。

hot3.png

epoll是linux特有的IO复用函数。

把用户关心的文件描述符上的事件放在内核里的一个事件表里,从而无须像select和poll

那样每次调用都要重复传入文件描述符或事件集。

#include<sys/epoll.h>

int epoll_create(int size).

size参数现在并不起作用,只是给内核一个提示:告诉它事件表需要多大。

该函数返回的文件描述符将用作其他所有epoll系统调用的第一个参数

以指定要访问的内核事件表。

#include<sys/epoll.h>

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

 

epoll支持的事件类型和poll基本相同,表示epoll的事件类型的宏是在poll对应的宏前加上E, 

但是epoll有两个额外的事件类型EPOLLET和EPOLLONESHOT, 

这个函数成功时返回0.失败时返回-1并且设置errno 

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

这个函数成功时返回就绪的文件描述符的个数,失败则返回-1并且设置errno 

maxevents指定最多监听多少个事件,必须大于0 

timeout参数同poll参数的timeout参数 

epoll_wait函数如果检测到事件,就将所有就绪的事件从内核表中复制到第二个参数指向的数组中,

 epoll对文件描述符有两种模式LT电平触发和ET边沿触发 默认是LT模式 ,

当往epoll内核事件表中注册EPOLLET事件时会以ET模式来操作该文件描述符。

 即使我们使用边沿触发,仍然可能多次触发事件,

在某些特定情况下,可能会需要用到EPOLLONESHOT 这个事件。

对于注册了这个事件的文件描述符,操作系统最多触发其上注册的一个可读,可写,或者异常事件,

且只触发一次,所以在不需要继续使用这个socket的情况下,需要重置这个socket,否则永远不会再接收

到这个socket的有关事件。

~~~epoll的工作原理

内核监测到就绪的文件描述符时,将触发回调函数,回调函数就将该文件描述符上对应的事件插入内核就绪事件队列,内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间。

转载于:https://my.oschina.net/qiangzigege/blog/194685

你可能感兴趣的文章
解救小哈——bfs广搜
查看>>
js数组去重的4个方法
查看>>
图片在线生成
查看>>
JAVA面试题解惑系列(四)——final、finally和finalize的区别
查看>>
gitlab 优化
查看>>
会话控制和cookie|session的详细介绍
查看>>
20155229 《信息安全系统设计基础》 week10 课上测试ch06
查看>>
【设计模式】概述
查看>>
hdu1025 dp+二分查找 nlogn最长上升子序列
查看>>
让div水平垂直居中的几种方法
查看>>
渐进增强 优雅降级
查看>>
批量删除、多条件查询、分页思路
查看>>
Json.Net系列教程 1.Json.Net介绍及实例
查看>>
C/C++ 编程有哪些值得推荐的辅助工具
查看>>
鱼王的儿子
查看>>
LOJ 6277:数列分块入门 1(分块入门)
查看>>
Sql server 0x80131904
查看>>
git
查看>>
ZeroMQ指南-第1章-基础-修复这个世界 ...
查看>>
JDK9版本以上Java独有的一个轻量级小工具,你知道吗?jshell
查看>>