epoll 基本知识与使用
https://blog.csdn.net/qq_35721743/article/details/86742508
epoll 最大的好处在于它不会随着监听 fd 数目的增长而降低效率。
epoll 的接口,一共有三个函数, 都在头文件 #include <sys/epoll.h> 里。
1. 创建 epoll 句柄
int epfd = epoll_create(intsize);
创建一个 epoll 句柄,size 用来告诉内核这个监听的数目一共有多大。当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看 /proc/进程id/fd/, 是能够看到这个fd的,所以在使用完epoll后,必须调用 close() 关闭。 否则可能导致 fd 被耗尽。
函数声明: int epoll_create(int size)
该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd 上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket fd 数, 由用户确定, 只要内存空间够用。
2. 将被监听的描述符添加到epoll句柄或从epoll句柄中删除或者对监听事件进行修改
函数声明:int epoll_ctl( int epfd, int op, int fd, struct epoll_event* event )
返回值:如果调用成功返回0,不成功返回-1.
该函数用于控制某个 epoll 文件描述符上的事件,可以注册事件、修改事件、删除事件。
参数:
epfd : 由 epoll_create 生成的 epoll 专用的文件描述符;
op : 要进行的操作,例如注册事件。可能的取值有:
EPOLL_CTL_ADD : 注册新的 fd 到 epfd 中
EPOLL_CTL_MOD : 修改已经注册的 fd 的监听事件
EPOLL_CTL_DEL : 从 epfd 中删除一个 fd
fd : 关联的文件描述符,需要监听的 fd .
event : 指向 epoll_event 的指针, 告诉内核需要监听什么事件 , struct epoll event 结构如下:
struct epoll_event{
__uint32_t events; // Epoll events: EPOLLIN,EPOLLOUT,EPOLLPRI,EPOLLERR,EPOLLHUP,EPOLLET,EPOLLONESHOT
epoll_data_t data; // User data variable
};
typedef union epoll_data{
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
events 可以是一下几个宏的集合:
EPOLLIN : 触发该事件,表示对应的文件描述符上有可读数据。 (包括对端 SOCKET 正常关闭)
EPOLLOUT : 触发该事件,表示对应的文件描述符上可以写数据;
EPOLLPRI : 表示对应的文件描述符上有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR : 表示对应的文件描述符发生错误;
EPOLLHUP : 表示对应的文件描述符被挂断;
EPOLLET : 将 EPOLL 设为 边缘触发 (Edge Triggered) 模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT : 只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。
如:
struct epoll_event ev;
ev.data.fd = listenfd; // 设置与要处理的事件相关的文件描述符
ev.events = EPOLLIN | EPOLLOUT; // 设置要处理的事件类型
epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev); // 注册 epoll 事件
3. 等待事件触发, 当超过 timeout 还没有事件触发时,就超时
int epoll_wait( int epfd, struct epoll_event * events, int maxevents, int timeout );
返回:该函数返回需要处理的事件数目,返回的事件集合在events数组中,数组中实际存放的成员个数是函数的返回值。如返回0表示已超时。
参数:
epfd : 由 epoll_create 生成的epoll专用的文件描述符;
events : 用于回传待处理的事件的数组,从内核得到事件的集合
maxevents : 每次能处理的事件数, 告知内核这个events有多大(数组成员的个数),这个maxevents 的值不能大于创建epoll_create()时候的size。
timeout : 等待 IO 事件发生的超时值; -1相当于阻塞, 0相当于非阻塞
epoll_wait 运行的原理是: 等待注册在 epfd 上的 socket fd 的 事件发生,如果发生,则将发生的fd 和事件保存在 events里,并将epfd上该fd的事件清空。如果需要继续监听该fd,则需要使用EPOLL_CTL_MOD 添加需要监听的事件。因为没有清空epfd上的fd,所以不需要使用EPOLL_CTL_ADD.
最后,水平触发(LT)是默认的工作模式,适合与阻塞和非阻塞socket, 错误率小。边缘出发(ET)是高速工作模式,只适用于非阻塞socket。
epoll 基本知识与使用的更多相关文章
- select poll epoll相关知识速记
缘起 面试的时候经常被问的一个很蛋疼的问题,经常被问,但是知识很零散,难记忆,看完就忘 select 作用 可以监视文件描述符是否可以读写,要求监视的文件描述符是非阻塞的 诞生背景 产生与上个世纪80 ...
- Linux Epoll相关知识
其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及 ...
- I/O复用及epoll基础知识
IO multiplexing IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了.有些地方也称这种IO方式为event driven IO.我们 ...
- Liunx下Tomcat+MYSQL+Nginx配置
环境:centos6.4 min #安装编译库及依赖模块 yum -y install gcc gcc-c++ autoconf automake make yum -y install zlib z ...
- 《深入理解Android 卷III》第二章 深入理解Java Binder和MessageQueue
<深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...
- Python菜鸟之路:Python基础-Socket编程-2
在上节socket编程中,我们介绍了一些TCP/IP方面的必备知识,以及如何通过Python实现一个简单的socket服务端和客户端,并用它来解决“粘包”的问题.本章介绍网络编程中的几个概念:多线程. ...
- epoll 知识总结
poll/select/epoll 对比 http://www.cnblogs.com/apprentice89/p/3234677.html ---有待继续学习 http://blog.chi ...
- Python框架之Tornado(二)预备知识epoll最好的讲解
问:epoll 或者 kqueue 的原理是什么?为什么 epoll 和 kqueue 可以用基于事件的方式,单线程的实现并发?我没看过 linux 内核,对这方面一直有疑问…… 必须从很多基础的概念 ...
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式
为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平. I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题.它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数, ...
随机推荐
- Django初识(一)
一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的设计模式,即模型M,视图V和模版T 1.框架介绍 具体介绍Django之前,必须先介绍Web框架的 ...
- Eclipse 获取maven项目出现问题汇总
1.errors occurred during the build,可以试试加上下图的配置,路径根据自己jak安装路径去修改
- 使用ADB拷贝Android设备的文件夹
在当前目录下执行,拷贝到当前目录. 拷贝照片 adb pull sdcard/DCIM 删除照片 adb shell rm -rvf sdcard/DCIM 拷贝图片 adb pull s ...
- uniapp-时间组件
可以选择年月日时分秒 示例文件 my-datetime.zip 文档:https://ext.dcloud.net.cn/plugin?id=5603
- 网线接口调试,Android ADB网络调试!
ADB网络调试,网线接口调试 没有USB接口,照样可以调试,可通过网线接口调试步骤! 一.第一步连接WIFI 查看wifi 的IP win+R 键 打开运行 ,输入cmd 二.输入ipc ...
- 小程序使用webview嵌套H5两边如何传参.
需求:项目里面需要进行人脸核身.需要调起小程序的人脸核身功能.需要h5跳转到小程序页面.验证完后回退 1.h5页面先引入一个js文件 2.当用微信小程序的web-view内嵌H5页面的时候,H5页面的 ...
- linux check folder files how many files
https://linuxhandbook.com/count-number-files/ tree -a
- c++游戏编程(1)开发环境与工具函数
c++游戏编程(1)开发环境与工具函数 文章目录 c++游戏编程(1)开发环境与工具函数 前言 1.开发工具 2.工具函数 2.1 windows.h 2.1.1 _mkdir() 2.1.2 _rm ...
- sudo apt update 没有 Release 文件
注: 不同环境出错原因可能不同,本文仅供参考. 今天在Ubuntu 19.04 系统运行指令 sudo apt update 时,忽然提示错误,报错如下: 404 Not Found [IP: 101 ...
- 关于git基本操作备忘
1.将远程分支拉取到本地分支 git pull origin 分支名 2.将本地分支代码提交到远程分支 git push origin HEAD:Ft_6.8