I/O多路转接-epoll
By francis_hao Aug 5,2017
APUE讲多路转接的章节介绍了select、pselect和poll函数。而epoll是linux内核在2.5.44引入的。在glibc 2.3.2添加了支持。
epoll_create – 打开一个epoll文件描述符
epoll_ctl – 控制epoll文件描述符接口
epoll_wait – 在epoll文件描述符上等待一个I/O事件
概述
#include <sys/epoll.h> |
描述
epoll_create()
创建一个epoll(7)实例,返回指向这个实例的文件描述符,这个文件描述符会被之后的epoll函数使用,当该文件描述符不再需要的时候,应当使用close(2)关闭。当所有指向同一个epoll实例的文件描述符都被关闭后,内核会销毁该实例,释放分配的资源以复用。
参数size原本用来告诉内核要添加到epoll实例中文件描述符的数量,内核用这个参数作为一个大概的分配空间大小的指示,以存放描述事件的结构体数据。但是从内核2.6.8之后,这个参数就不再需要了,内核会动态的分配需要的空间大小。但是参数size必须依然是大于0的数,以确保新的epoll函数运行在旧的内核上时能向后兼容。
函数执行成功返回非负的文件描述符,若有错误则返回-1,而且errno被置为相应的值以指示该错误。
epoll_ctl()
这个系统调用对由文件描述符epfd指定的epoll实例执行控制操作,同时需要指定目标文件描述符fd,和对其的操作op。有效的op参数如下
op |
说明 |
EPOLL_CTL_ADD |
注册目标文件描述符fd到epoll实例,并关联事件event |
EPOLL_CTL_MOD |
改变关联到目标文件描述符fd的事件event |
EPOLL_CTL_DEL |
从epoll实例移除目标文件描述符,event被忽略,可以是NULL |
epoll_event结构的定义
typedef struct epoll_event{ |
成员events可以是以下常量的按位或集:
events |
说明 |
EPOLLIN |
关联的文件可以进行read(2)操作 |
EPOLLOUT |
关联的文件可以进行write(2)操作 |
EPOLLRDHUP (since Linux 2.6.17) |
对方关闭了流套接字连接,or shut down writing half of connection。 |
EPOLLPRI |
有紧急数据可以进行read(2)操作 |
EPOLLERR |
在关联的文件描述上发生了错误,epoll_wait(2)总会等待这一事件,因此无需对此位置位 |
EPOLLHUP |
关联的文件描述符挂起(Hang up)了,poll_wait(2)总会等待这一事件,因此无需对此位置位 |
EPOLLET |
为关联的文件描述符设置边沿触发,默认的行为是电平触发(Level Triggered) |
EPOLLONESHOT (since Linux 2.6.2) |
为关联的文件描述符设置单次行为,这意味着该文件描述符一旦由epoll_wait(2)返回一次事件,就会被内部失能,再不会有其他事件被报告,用户程序必须调用epoll_ctl()函数,使用EPOLL_CTL_MOD命令重新关联event |
函数执行成功返回0,错误返回-1,而且errno被置为相应的值。
epoll_wait()
该系统调用等待由文件描述符epfd指定的epoll实例上的事件,由events指向的内存区域包含了准备好的事件。至多有maxevents个事件由epoll_wait()返回,该值必须大于0。timeout参数指定epoll_wait()将最多阻塞多长时间(ms)。指定-1使epoll_wait()一直等待,直到有准备好的事件,而指定0使epoll_wait()立即返回,即使没有事件准备好。
函数执行成功返回准备好的文件描述符的数量,如果在timeout时间内仍然没有文件描述符准备好则返回0,错误返回-1,而且errno被置为相应的值。
两点要注意:
- epoll_ctl(int epfd, int op, int fd, struct epoll_event *event),fd和event的fd必须同时赋值
- close不能使文件描述符从epoll中移除,必须使用epoll_ctl的EPOLL_CTL_DEL(此情况是已经有数据在缓存里,还未调用epoll_wait,此时先close再调用epoll_wait的情况)
实例
一个简单的用法:
#include <sys/epoll.h> epoll_fd = epoll_create(2); #define TIMEOUT 20 |
执行结果:
程序源码在github上,可以直接clone编译测试:
epoll
本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/7291912.html
参考
【1】man 7 epoll
【2】man epoll_create
【3】man epoll_ctl
【4】man epoll_wait
I/O多路转接-epoll的更多相关文章
- Linux下I/O多路转接之epoll(绝对经典)
epoll 关于Linux下I/O多路转接之epoll函数,什么返回值,什么参数,我不想再多的解释,您不想移驾,我给你移来: http://blog.csdn.net/colder2008/artic ...
- 【Nginx】I/O多路转接之select、poll、epoll
当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或 ...
- 高级I/O之I/O多路转接——pool、select
当从一个描述符读,然后又写到另一个描述符时,可以在下列形式的循环中使用阻塞I/O: ) if (write(STDOUT_FILENO, buf, n) != n) err_sys("wri ...
- IO多路转接select和poll
select IO多路复用的设置方法与信号的屏蔽有点相似: 信号屏蔽需要先设定一个信号集, 初始化信号集, 添加需要屏蔽的信号, 然后用sigprocmask设置 IO多路转接需要先设定一个文件描述符 ...
- I/O多路转接 --- UNIX环境高级编程
I/O多路转接技术:先构造一张有关描述符的列表,然后调用一个函数,知道这些描述符中的一个已准备好进行I/O时,给函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.selec ...
- I/O多路转接模型
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Linux下I/O多路转接之select --fd_set
fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...
- UNIX环境高级编程——I/O多路转接(select、pselect和poll)
I/O多路转接:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.pselect ...
- select函数与I/O多路转接
select函数与I/O多路转接 相作大家都写过读写IO操作的代码,例如从socket中读取数据可以使用如下的代码: while( (n = read(socketfd, buf, BUFSIZE) ...
随机推荐
- Hadoop(13)-MapReduce框架原理--Job提交源码和切片源码解析
1.MapReduce的数据流 1) Input -> Mapper阶段 这一阶段的主要分工就是将文件切片和把文件转成K,V对 输入源是一个文件,经过InputFormat之后,到了Mapper ...
- java第二章 变量和运算符
Java 基础应用编程—— 变量和运算符 1.Java程序结构 数据类型:确定要存储在内存中的数据的类型. 变量:是存储数据的基本单元 2.变量的概念 变 ...
- Xshell入门教程介绍
免费软件 Xshell和 Xftp 都是 NetSarang 出品的优秀网络管理.安全传输工具.Xshell 是一个免费的安全终端仿真器,可以作为 SSH.TELNET 或 RLOGIN 的终端模拟, ...
- 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库
我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...
- javascript 自定义发布与订阅
//声明一个类,与普通的类的声明不一样, function Girl() { //将类的事件声明成一个私有的属性,里面是一个对象 this._events = {} } /* { "失恋&q ...
- hihoCoder 1175:拓扑排序二
题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头 ...
- 源码-集合:ArrayList
只是文章摘录,还未研究 JAVA ArrayList详细介绍(示例) http://www.jb51.net/article/42764.htm Jdk1.6 JUC源码解析汇总 - 永远保持敬畏之心 ...
- 「日常训练」「小专题·USACO」 Barn Repair(1-4)
题意 之后补. 分析 这题同样也很精巧.我们不妨思考一下,如果只允许用一块木板,那么要购买多少距离?是整个的距离吗?不是,是从第一个到最后一个(哈哈哈哈哈哈哈).但是,不包括第一个的"左边& ...
- 「日常训练」 Mike and Frog (CFR305D2C)
题意与分析 (Codeforces 548C) 我开始以为是一条数学题,死活不知道怎么做,无奈看题解,才知这是一条暴力,思维江化了- - 题意大概是这样的: 两个东西的初始高度分别为h1,h2&quo ...
- 怎样安装PyCharm
在地址栏输入http://www.jetbrains.com/pycharm/ 打开PyCharm官网 http://idea.lanyus.com/