文档章节

epoll使用详解

呼噜呼噜睡翻天
 呼噜呼噜睡翻天
发布于 2015/06/15 23:04
字数 664
阅读 620
收藏 13

码上生花,ECharts 作品展示赛正式启动!>>>

简介

 epoll是Linux内核中的一种可扩展IO事件处理机制,最早在Linux2.5.44内核中引入,可被用于代替POSIX select和poll系统调用,并且在具有大量应用程序请求时能够获得较好的性能(此时监控的文件描述符数目非常大,与旧的select和poll系统调用完成操作所需O(n)不同,epoll能在O(1)时间内完成操作,所以性能相当高),epoll与FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。

int epoll_create(int size);

  创建一个epoll的句柄,size用来告诉内核需要监听的数目一共有多大。当创建好epoll句柄后,它就是会占用一个fd的值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

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

  epoll的事件注册函数,第一个参数是epoll_create()的返回值,第二个参数表示动作,使用如下三个宏来表示:

EPOLL_CTL_ADD    注册新的fd到epfd中;
EPOLL_CTL_MOD    修改已经注册的fd的的监听事件;
EPOLL_CTL_DEL    从epoll中删除一个fd;

 第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事件,struct 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_data_t data;
}

  events可以是以下几个宏的集合:

EPOLLIN    可读事件
EPOLLOUT    可写事件
EPOLLPRI    表示文件描述符有紧急的数据可读(带外数据)
EPOLLERR    表示文件描述符发生错误
EPOLLHUP    表示文件描述符被挂断
EPOLLET    将EPOLL设为边缘触发模式,相对于水平触发来说
EPOLLONESHOT    只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

  当对方关闭连接(FIN),EPOLLERR,都可以认为是一种EPOLLIN事件,在read的时候分别有0,-1两个返回值。

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

  参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1永久阻塞)。该函数返回需要处理的事件数目,如返回0表示你已超时。

© 著作权归作者所有

呼噜呼噜睡翻天
粉丝 28
博文 74
码字总数 36560
作品 0
朝阳
程序员
私信 提问
加载中
请先登录后再评论。
《Linux高性能服务器编程》学习笔记(九)--I/O复用

学习更多,请点击:《Linux高性能服务器编程》学习笔记:目录索引 select函数 函数参数详解 函数用到的两个结构体fdset和fdarray(图解) 对fd_set类型结构体操作的函数 poll函数 函数参数详...

WangYe8613
03/31
0
0
NIO-EPollSelectorIpml源码分析

NIO-EPollSelectorIpml源码分析 目录 NIO-概览NIO-BufferNIO-ChannelNIO-Channel接口分析NIO-SocketChannel源码分析NIO-FileChannel源码分析NIO-Selector源码分析NIO-WindowsSelectorImpl源码......

osc_04fmvbv4
04/16
11
0
Epoll模型详解

Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。Linux 2.6内核中有提高网络I/O性能的新方法,即epoll 。 1、为什么select落后 首先,在Linux内核中,sel...

sharep
2013/07/23
0
0
glusterfs 4.0.1 event模块 分析笔记1

前言 在C语言i中,存储变量的结构体加上一组函数指针,大概就可以算是一个对象模型了;如果将一组函数指针捆绑为结构体, 后期根据配置或者环境需要绑定到不同实现模块中的一组函数,可以认为...

osc_at2qbd5n
2018/04/17
1
0
基于epoll实现的一个简单的web服务器

本文使用epoll建立一个简单的web服务器。通过epoll实现对过个端口的管理,非阻塞的数据发送。 使用到数据结构 typedef union epoll_data { 详解1 EPOLLIN:文件描述符可以读 所用到的函数: ...

Reage-
2013/03/20
2.5K
4

没有更多内容

加载失败,请刷新页面

加载更多

超简单集成华为HMS Scankit扫码SDK实现扫一扫二维码

前言 查看华为开发者联盟网站的机器学习服务业务介绍(https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-introduction-4) 官网的Demo和Sample代码体验 官网有Demo可...

HMS-Core
5分钟前
7
0
JavaScript学习笔记-01基础

弹出框 alert('我是编程语言,来控制电脑网页弹出你好'); JS三种: (1) 行内式,直接写到直接写到元素的内部 <input type="button" value="submit" onclick="alert('sure?')"> (2) 内嵌式的j......

黑黑的豆
15分钟前
12
0
PowerShell说“此系统上的脚本执行被禁用。” - PowerShell says “execution of scripts is disabled on this system.”

问题: I am trying to run a cmd file that calls a powershell script from cmd.exe , and I am getting the below error: 我正在尝试运行一个从cmd.exe调用powershell脚本的cmd文件,并且......

javail
25分钟前
11
0
LayUi的动态表格table中设置下拉框Select编辑器

相关阅读: X-admin2.2打开页面(添加弹窗),执行成功后如何关闭弹出窗口和刷新table表格内容? 基于X-admin2.2的后台管理系统登录实现 Spring Boot+JPA微服务中数据更新问题(update) Spri...

十点数据
28分钟前
19
0
UltraEdit for Mac 20.00.0.32 文本编辑器

MacOS上最受欢迎的文本编辑器是哪款?UltraEdit Mac版支HTML、PHP、Perl、Java 和 JavaScript 等众多流行计算机高级语言的程序编辑器,Ultraedit与Notepad ++相比。你可以直接用它来修改exe...

麦克W
35分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部