IO多路复用之epoll
一、epoll函数族
1. 函数epoll_creat: 该函数生成一个epoll专用的文件描述符
#include <sys/epoll.h>
int epoll_creae(int size); //epoll上能关注的最大描述符数
2. epoll_ctl:用于控制某个epoll文件描述符事件,可以注册、修改、删除
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数:
- efd:epoll_create函数的返回值
- op:对该监听红黑树所做操作
- fd:待监听的fd
- event:struct epoll_event 结构体
typedef union epoll_data
{void* ptr;int fd; //对应监听的fduint32_t u32;uint64_t u64;
} epoll_data_t;struct epoll_event
{uint32_t events; /* epoll事件 */epoll_data_t data; /* 用户数据 */
};
3. 等待IO事件发生 - 可以设置阻塞的函数
#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
参数:
- efds:epoll_create函数的返回值
- events:传出参数【数组】满足监听条件的哪些fd结构体
- maxevents:数组元素的总个数(1024) struct epoll_events [1024]:
二、LT和ET模式
epoll对文件描述符的操作方式有两种工作模式:LT模式(Level Trigger,水平触发) 和ET模式(Edge Trigger,边缘触发)。
- LT模式:当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件,这样,当应用程序下一次调用epoll_wait时,epoll_wait还会向应用程序通告此事件,直到该事件被处理。((缓冲区剩余未读尽的数据会导致epoll_wait返回. )
- ET模式:当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序必须立即处理该事件,因为后续的epoll_wait调用将不在向应用程序通告此事件。
1. 水平触发
对于读操作
- 只要缓冲内容不为空,LT模式返回读就绪。
对于写操作
- 只要缓冲区还不满,LT模式会返回写就绪。
2. 边缘触发
对于读操作
- 当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
- 当有新数据到达时,即缓冲区中的待读数据变多的时候。
- 当缓冲区有数据可读,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLIN事件时。
对于写操作
- 当缓冲区由不可写变为可写时。
- 当有旧数据被发送走,即缓冲区中的内容变少的时候。
- 当缓冲区有空间可写,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLOUT事件时。
三、代码清单
1. 测试代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>#define MAXLINE 10int main(int argc, char *argv[])
{int efd, i;int pfd[2];pid_t pid;char buf[MAXLINE], ch = 'a';pipe(pfd);pid = fork();if (pid == 0) //子写{ close(pfd[0]);while (1) { for (i = 0; i < MAXLINE/2; i++) //aaaa\nbuf[i] = ch;buf[i-1] = '\n';ch++;for (; i < MAXLINE; i++) //bbbb\nbuf[i] = ch;buf[i-1] = '\n';ch++;write(pfd[1], buf, sizeof(buf)); //aaaa\nbbbb\nsleep(5);}close(pfd[1]);} else if (pid > 0) //父读{ struct epoll_event event;struct epoll_event resevent[10]; //epoll_wait就绪返回eventint res, len;close(pfd[1]);efd = epoll_create(10);event.events = EPOLLIN | EPOLLET; // ET 边沿触发//event.events = EPOLLIN; // LT 水平触发 (默认)event.data.fd = pfd[0];epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &event);while (1) {res = epoll_wait(efd, resevent, 10, -1);printf("res %d\n", res);if (resevent[0].data.fd == pfd[0]) {len = read(pfd[0], buf, MAXLINE/2);write(STDOUT_FILENO, buf, len);}}close(pfd[0]);close(efd);} else {perror("fork");exit(-1);}return 0;
}
IO多路复用之epoll相关推荐
- IO多路复用之epoll总结 http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
IO多路复用之epoll总结 http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
- linux IO多路复用 select epoll
概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程 通俗理解(摘自网上一大神) 这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前 ...
- IO多路复用之epoll总结
1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll使用一个文件描述符管理多个描述 ...
- Socket IO多路复用: epoll原理图解
目录 一.accept 创建新 socket 1.1 初始化 struct socket 对象 1.2 为新 socket 对象申请 file 1.3 接收连接 1.4 添加新文件到当前进程的打开文件 ...
- IO多路复用之epoll模型
一.IO多路复用:一个线程监测多个IO操作 基本思想:先构造一张有关描述符的表,然后调用一个函数,当这些文件描述符中的一个或多个已经准备好进行I/O函数时才返回.函数返回时告诉进程哪个描述符已经就绪, ...
- IO多路复用机制——epoll
高效地对海量用户提供服务,必须要让进程能同时处理很多个tcp连接.假设一个进程保持了10000条连接,如何发现哪条连接上有数据可读.可写? 实现:循环遍历来发现IO事件?效率太低了. 目录 IO模型 ...
- 【Linux系统编程】IO多路复用之epoll
00. 目录 文章目录 00. 目录 01. 概述 02. epoll函数 03. 程序示例 04. epoll优缺点 05. 附录 01. 概述 epoll是Linux下多路复用IO接口select ...
- python网络编程——IO多路复用之epoll
什么是epoll epoll是什么?在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll.当然,这不是2.6内核才有的,它 ...
- Linux IO多路复用之epoll网络编程(含源码)
前言 本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下: 客户端从标准输入读入一行,发送到服务端 服务端从网络读取一 ...
最新文章
- golang中的嵌套
- Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略
- vue element 表格使用fixed固定列后切换菜单时错位问题
- R语言实现描述性统计
- 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
- Linux vim使用心得--一些高级话题
- Python的小特别
- 计算机网络---网络层ARP协议
- 人群与网络:新事物在网络中的扩散
- Android Multimedia框架总结(十六)Camera2框架之openCamera及session过程
- CCS7.3 安装使用教程
- Unity修改编辑器
- 2022年,你还要做开源软件么?
- 开博第一篇~申请博客理由
- java专业大学生入伍_JAVA程序征兵系统(包含登录系统和征兵系统)
- java对接微信支付收不到支付通知问题(亲身实践)
- 【人工智能】3.谓词与机器推理
- 投影仪硬件边缘融合服务器,带你了解投影融合的边缘融合显示技术
- eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)
- MaxCompute_概念/使用
热门文章
- Forbidden You don't have permission to access / on this server PHP
- SYBASE灾难备份方案
- avalon.js 转义html,avalon模块的内建适配器
- java 一维数组_java基础 ---- 一维数组
- 计算机巧用剪纸做画册教案,大班绘画剪纸制作的教案总结
- java for循环遍历解释,三种for循环遍历
- 关联查询mysql_《MySQL数据库》关联查询
- 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件
- Win32ASM学习[23]:RadASM快捷键
- Opencv——查找并绘制凸包、凸包与轮廓的关系