IO复用——epoll系列系统调用
1、内核事件表
epoll是Linux特有的I/O复用函数。epoll把用户关心的文件描述上的事件放在内核里的一个事件表中,并用一个额外的文件描述符来标识该内核事件表。这个额外文件描述符使用函数epoll_create函数来创建。
#include<sys/epoll.h>
int epoll_create(int size)
size参数给内核提示事件表需要多大。该函数返回的文件描述符用作其他epoll函数的第一个参数,标识要访问的内核事件表。
2、epoll_ctl函数
此函数用来操作内核事件表,操作类型有三种:
- EPOLL_CTL_ADD 往事件表中注册事件
- EPOLL_CTL_MOD 修改注册事件
- EPOLL_CTL_DEL 删除注册事件
#include<sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event) //成功返回0,失败返回-1并置errno
fd参数是要操作的文件描述符,op参数指定操作类型,event参数指定事件,epoll_event定义如下:
struct epoll_event
{
_uint32_t events; //epoll事件
epoll_data_t data; //用户数据
};
其中events成员描述事件类型,data成员用于存储用户数据,epoll_data_t定义如下:
typedef union epoll_data
{
void* ptr;
int fd;
uint32_t u32;
uint64_t u64;
}epoll_data_t;
此为一个共用体,使用最多的是fd,它标识事件所从属的目标文件描述符。ptr成员可用来指定与fd相关的用户数据。
3、epoll_wait函数
此函数为epoll系列主要系统调用函数,它在一段超时时间内等待一组文件描述符上的事件。
#include<sys/epoll.h>
int epoll_wait(int epfd, stuct epoll_event* events, int maxevents,int timeout)
此函数成功返回时返回就绪文件描述符的个数,失败返回-1并置errno。
timeout参数指定超时时间,maxevents参数指定最多监听多少个事件,必须大于0。epfd指定内核事件表,函数成功返回时,events参数指向一个数组,数组用于输出就绪事件,数组的大小就是函数返回的就绪文件描述符个数。
//索引epoll返回的就绪文件描述符
int ret = epll_wait(epllfd, events, MAX_EVENT_NUMBER, -1);
for(int i = 0; i < ret; i++)
{
int sockfd = events[i].data.fd;
/*sockfd是已经就绪的文件描述符,直接处理*/
}
4、LT和ET模式
epoll对文件描述符的操作有两种模式:LT模式和ET模式。LT为默认模式,当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将按照ET模式来操作该文件描述符。
LT模式和ET模式区别:对于LT模式,epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件,当应用程序下次调用epoll_wait时,该就绪事件还会被通告到应用程序,直到事件被处理。而对于ET工作模式,当epoll_wait检测到事件发生时通知应用程序,应用程序必须立即处理,因为后面epoll_wait不会再通告此事件发生。这样ET模式比LT模式减少了同一个epoll事件被重复触发的次数,效率较高。
IO复用——epoll系列系统调用的更多相关文章
- select、poll、epoll三组IO复用
int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- IO复用: select 和poll 到epoll
linux 提供了select.poll和epoll三种接口来实现多路IO复用.下面总结下这三种接口. select 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经 ...
- Select、Poll、Epoll IO复用技术
简介 目前多进程方式实现的服务器端,一次创建多个工作子进程来给客户端提供服务, 但是创建进程会耗费大量资源,导致系统资源不足 IO复用技术就是让一个进程同时为多个客户端端提供服务 IO复用技术 之 S ...
- IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力
上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度. IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作 ...
- IO复用的三种方法(select,poll,epoll)深入理解
(一)IO复用是Linux中的IO模型之一,IO复用就是进程告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程处理,从而不会在单个IO上阻塞了,Linux中,提供 ...
- Linux C++ 网络编程学习系列(5)——多路IO之epoll边沿触发
多路IO之epoll边沿触发+非阻塞 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_ET_LT_NOBLOCK_example 源码说 ...
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...
随机推荐
- monkey使用
一.Monkey测试原理:Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...
- p2psearcher绿色版使用方法
P2pSearcher大家应该很了解,p2p是一款基于P2P技术的资源搜索软件,基于先进的P2P搜索技术,可在瞬间搜遍全球ED2k网络资源,简单便捷的搜索到ED2K网络上共享的海量影音娱乐,学习资料等 ...
- JS interview loop code
//九九乘法表 document.write("<table width='600' border=0'>"); for(var i=1; i<=9; i++){ ...
- MATLAB/Excel-如何将Excel数据导入MATLAB中
在使用MATLAB对矩阵进行数据处理时,为了方便编辑与修改,常常需要先将数据录入到Excel中,然后再将其导入到MATLAB中参与矩阵运算.本文在MATLAB 2013a和Office 2013环境下 ...
- hdu-1452 Happy 2004---因子和+逆元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意: 求2004^x次方的因子和mod29的值 解题思路: 首先2004 = 2 * 2 ...
- Flexbox 布局的最简单表单
作者: 阮一峰 日期: 2018年10月18日 弹性布局(Flexbox)逐渐流行,越来越多人使用,因为它写 CSS 布局真是太方便了. 三年前,我写过 Flexbox 的介绍(上,下),但是有些地方 ...
- 【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)
点此看题面 大致题意: 给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...
- fastJson简单实用
public class FastJsonText { @Test public void text(){ User user1 = new User(); user1.setName("健 ...
- python+requests实现接口测试 - get与post请求使用
简介:Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 ...
- 优雅的QSignleton (一) Singleton单例实现
接下来笔者来介绍如何用QSingleton实现一个简单的单例. 代码如下. Singleton.cs namespace QFramework.Example { using UnityEngine; ...