epoll详解【epoll_create】【epoll_ctl】【epoll_wait】
文章目录
- 0 - 前言
- 1 - epoll接口
- epoll_create
- epoll_ctl
- epoll_wait
0 - 前言
参考:epoll机制:epoll_create、epoll_ctl、epoll_wait、close
1 - epoll接口
epoll_create
#include <sys / epoll.h>nfd = epoll_creat(max_size);
创建一个内核事件表 (也叫epoll句柄),nfd为epoll句柄(不了解句柄看下一段),参数max_size标识这个监听的数目最大有多大,从Linux 2.6.8开始,max_size参数将被忽略,但必须大于零。每个内核事件表占据一个fd。这个函数其实是在内核申请一块空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。max_size就是你在这个epoll fd上能关注的最大socket fd数。
返回值:成功时,这些系统调用将返回非负文件描述符。如果出错,则返回-1,并且将errno设置为指示错误。
句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个
参考:epoll_create详解
epoll_ctl
#include <sys / epoll.h>int epoll_ctl(int epfd,int op,int fd,struct epoll_event * event);
该系统调用对文件描述符epfd引用的epoll实例执行控制操作。它要求操作op对目标文件描述符fd执行。
函数参数:
- epfd:由epoll_create产生的epoll句柄
- op:要进行的的操作,比如EPOLL_CTL_ADD(注册新的fd到epfd中)、EPOLL_CTL_MOD( 修改已经注册的fd的监听事件)、EPOLL_CTL_DEL(从epfd中删除一个fd)
- fd:需要监听的fd
- event:指向epoll_event的指针,告诉内核需要监听什么事件
epoll_event是一个结构体,定义如下:
typedef union epoll_data {void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;struct epoll_event {__uint32_t events; /* Epoll events(也就是事件) */
epoll_data_t data; /* User data variable */
epoll_event中的成员events可以是:
- EPOLLIN:表示对应的文件描述符上有可读数据
- EPOLLOUT:表示对应的文件描述符上可以写数据
- EPOLLPRI:表示对应的文件描述符有紧急的数据可读
- EPOLLERR:表示对应的文件描述符发生错误
- EPOLLHUP:表示对应的文件描述符被挂断
- EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的
- EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到epoll队列里
返回值:成功时,epoll_ctl()返回零。发生错误时,epoll_ctl()返回-1并正确设置了errno
参考:epoll_ctl详解
epoll_wait
#include <sys / epoll.h>int epoll_wait(int epfd,struct epoll_event * events, int maxevents,int timeout);
等待文件描述符epfd引用的epoll实例上的I/O事件
函数参数:
- epfd:由epoll_create产生的epoll句柄
- events:从内核得到事件的集合
- maxevents:内核这个events有多大(数组成员的个数),这个maxevents的值不能大于创建epoll_create()时的size
- timeout:超时时间(毫秒,0会立即返回,-1将永久阻塞),当超过timeout还没有事件触发时,就超时
返回值:需要处理的事件数目,若返回0表示已超时。
epoll_wait运行的原理:等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中。并且,将注册在epfd上的socket fd的事件类型给清空。所以如果下一个循环你还要关注这个socket fd的话,则需要用epoll_ctl(epfd,EPOLL_CTL_MOD,listenfd,&ev)来重新设置socket fd的事件类型。这时不用EPOLL_CTL_ADD,因为socket fd并未清空,只是事件类型清空。这一步非常重要。
参考:epoll_wait详解
epoll详解【epoll_create】【epoll_ctl】【epoll_wait】相关推荐
- Python中的select、epoll详解
Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- Linux IO模式及 select、poll、epoll详解
https://segmentfault.com/a/1190000003063859 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的. ...
- Linux IO复用区别与epoll详解
转载:http://blog.csdn.net/hacker00011000/article/details/52160590 一.select.poll.epoll之间的区别总结[整理] sele ...
- IO多路复用--epoll详解
epoll 或者 kqueue 的原理是什么? [转自知乎] Epoll 引入简介 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是 ...
- 聊聊IO多路复用之select、poll、epoll详解
聊聊IO多路复用之select.poll.epoll详解 2016/04/22 · IT技术 · 1 评论 · epoll, IO多路复用, poll, select 分享到:0 本文作者: 伯乐在线 ...
- c if 判断select已经选择的值_「Linux」——select和epoll详解
select和epoll详解 select和epoll的区别(面试常考) select 一.什么是select 1.select函数原型 2.参数解释 3.参数timeout取值 4.返回值 5.监控 ...
- 【Linux学习】epoll详解
什么是epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll.当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new A ...
- Epoll详解及源码分析
文章来源:http://blog.csdn.net/chen19870707/article/details/42525887 Author:Echo Chen(陈斌) Email:chenb1987 ...
最新文章
- 征文 | “‘互联网+’背景下大数据与税收征管的深度融合研究” 专题征文启事...
- java 反射 new区别_JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)...
- 若依微服务版在Windows上通过jar包运行业务模块时提示:Failed to determine s suitable driver class
- Scala Case类和对象
- Docker 安装创建
- 哥尼斯堡的“七桥问题” (欧拉回路,并查集)
- .NET 6 Preview 1发布!
- ios 打印 详细错误日志_iOS打印Debug日志的方式
- 模块化,组件化,插件化简析
- 飞凌小课堂-RK3399开发板 linux双千兆网口方案-RTL8153
- php支付宝查询对账单下载地址,通过调用支付宝查询对账单接口返回bill_download_url下载zip,解压缩...
- 电子线路与电磁干扰/电磁兼容设计分析
- hadoop 起动是的时候报错 localhost: Could not create the Java virtual machine._far beyond me,thks~~_百度空间...
- 训练一个图像分类器demo in PyTorch【学习笔记】
- 计算机组成原理唐朔飞第二版答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...
- unexpected char: '\' @ line 3, column 133. s\react-native-gestu
- mysql5.7.25安装包,Mysql5.7.25在windows下安装
- 使用ps优化图片,减少图片内存大小
- jenkins docker 编译verify出现crash的问题
- Altium Designer(四)排针类元件模型的创建