epoll基础用法
2018-02-07 14:01
190 查看
epoll用作处理大量文字描述符,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发外,还提供了边缘触发,这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
头文件:sys/epoll.h
用法:
1:创建epoll相关类
struct epoll_event ev;
2:创建用于读取文件描述符的epoll数组
struct epoll_event events[500]; //能一次读取500个需要处理的文件描述符
3:创建epoll池
int _epoll = epoll_create(500); //创建一个能存放500个文件描述符的epoll池
4:添加需要监听的文件描述符和需要监听的事件
ev.data.fd = listenfd; //listenfd为文件描述符,将它加到ev类中
ev.events = EPOLLIN | EPOLLET; //选择监听事件,这里选择的是可读与边缘触发
5:将添加好的epoll放到epoll池中
epoll_ctl(_epoll, EPOLL_CTL_ADD, listenfd, &ev);
//EPOLL_CTL_ADD表示添加,该参数除了添加还有删除和修改
6:监听epoll池
int epoll_event_count; //用来读取 需要操作文件描述符的个数
epoll_event_count = epoll_wait(_epoll, events, 500, 1000);
//开始监听,参数1是需要监听的epoll池,参数2是将需要操作的文件描述符导出到该数组
中,参数3是最大监听个数,参数4是每次监听间隔时间,单位是毫秒,1000毫秒就是一
秒。
如果读到有文件描述符需要操作,会将该操作符所在的epoll拷贝到events中。
操作文件描述符时可以直接用events[i]去遍历需要操作的文件描述符,如果描述符类型不同,需要用if判断,哪些描述符是用于监听,哪些是用于读写。
头文件:sys/epoll.h
用法:
1:创建epoll相关类
struct epoll_event ev;
2:创建用于读取文件描述符的epoll数组
struct epoll_event events[500]; //能一次读取500个需要处理的文件描述符
3:创建epoll池
int _epoll = epoll_create(500); //创建一个能存放500个文件描述符的epoll池
4:添加需要监听的文件描述符和需要监听的事件
ev.data.fd = listenfd; //listenfd为文件描述符,将它加到ev类中
ev.events = EPOLLIN | EPOLLET; //选择监听事件,这里选择的是可读与边缘触发
5:将添加好的epoll放到epoll池中
epoll_ctl(_epoll, EPOLL_CTL_ADD, listenfd, &ev);
//EPOLL_CTL_ADD表示添加,该参数除了添加还有删除和修改
6:监听epoll池
int epoll_event_count; //用来读取 需要操作文件描述符的个数
epoll_event_count = epoll_wait(_epoll, events, 500, 1000);
//开始监听,参数1是需要监听的epoll池,参数2是将需要操作的文件描述符导出到该数组
中,参数3是最大监听个数,参数4是每次监听间隔时间,单位是毫秒,1000毫秒就是一
秒。
如果读到有文件描述符需要操作,会将该操作符所在的epoll拷贝到events中。
操作文件描述符时可以直接用events[i]去遍历需要操作的文件描述符,如果描述符类型不同,需要用if判断,哪些描述符是用于监听,哪些是用于读写。
相关文章推荐
- JSPatch基础用法总结
- C#基础学习之获取ip与readonly用法小例
- jsp基础语法,用法
- Android.mk的用法和基础 && m、mm、mmm编译命令
- JavaSE 基础 第17节 流程控制之break、continue、return的用法
- C基础--关于typedef的用法总结
- NOSQL原理,基础用法,NOSQL入门
- epoll用法注意的问题
- epoll模型中struct epoll_event中data联合体的用法
- android 基础 getTag,setTag的用法
- Split()用法 isNaN MVC ...基础知识
- Java中的this和super的用法-Java基础-Java-编程开发
- sed的基础用法简介
- Java 基础之 DecimalFormat 用法
- Android中okhttp的基本用法1的基础上进行封装
- Vim基础用法_初学篇
- MBProgressHUD基础用法
- UtilBox(ub)基础组件 -- epoll_server网络事件模型
- Android 服务(service)的基础用法
- Linux基础:shell中正则表达式grep,egrep的基础用法