一、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相关推荐

  1. 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

  2. linux IO多路复用 select epoll

    概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程 通俗理解(摘自网上一大神) 这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前 ...

  3. IO多路复用之epoll总结

    1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll使用一个文件描述符管理多个描述 ...

  4. Socket IO多路复用: epoll原理图解

    目录 一.accept 创建新 socket 1.1 初始化 struct socket 对象 1.2 为新 socket 对象申请 file 1.3 接收连接 1.4 添加新文件到当前进程的打开文件 ...

  5. IO多路复用之epoll模型

    一.IO多路复用:一个线程监测多个IO操作 基本思想:先构造一张有关描述符的表,然后调用一个函数,当这些文件描述符中的一个或多个已经准备好进行I/O函数时才返回.函数返回时告诉进程哪个描述符已经就绪, ...

  6. IO多路复用机制——epoll

    高效地对海量用户提供服务,必须要让进程能同时处理很多个tcp连接.假设一个进程保持了10000条连接,如何发现哪条连接上有数据可读.可写? 实现:循环遍历来发现IO事件?效率太低了. 目录 IO模型 ...

  7. 【Linux系统编程】IO多路复用之epoll

    00. 目录 文章目录 00. 目录 01. 概述 02. epoll函数 03. 程序示例 04. epoll优缺点 05. 附录 01. 概述 epoll是Linux下多路复用IO接口select ...

  8. python网络编程——IO多路复用之epoll

    什么是epoll epoll是什么?在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll.当然,这不是2.6内核才有的,它 ...

  9. Linux IO多路复用之epoll网络编程(含源码)

    前言 本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下: 客户端从标准输入读入一行,发送到服务端 服务端从网络读取一 ...

最新文章

  1. golang中的嵌套
  2. Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略
  3. vue element 表格使用fixed固定列后切换菜单时错位问题
  4. R语言实现描述性统计
  5. 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
  6. Linux vim使用心得--一些高级话题
  7. Python的小特别
  8. 计算机网络---网络层ARP协议
  9. 人群与网络:新事物在网络中的扩散
  10. Android Multimedia框架总结(十六)Camera2框架之openCamera及session过程
  11. CCS7.3 安装使用教程
  12. Unity修改编辑器
  13. 2022年,你还要做开源软件么?
  14. 开博第一篇~申请博客理由
  15. java专业大学生入伍_JAVA程序征兵系统(包含登录系统和征兵系统)
  16. java对接微信支付收不到支付通知问题(亲身实践)
  17. 【人工智能】3.谓词与机器推理
  18. 投影仪硬件边缘融合服务器,带你了解投影融合的边缘融合显示技术
  19. eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)
  20. MaxCompute_概念/使用

热门文章

  1. Forbidden You don't have permission to access / on this server PHP
  2. SYBASE灾难备份方案
  3. avalon.js 转义html,avalon模块的内建适配器
  4. java 一维数组_java基础 ---- 一维数组
  5. 计算机巧用剪纸做画册教案,大班绘画剪纸制作的教案总结
  6. java for循环遍历解释,三种for循环遍历
  7. 关联查询mysql_《MySQL数据库》关联查询
  8. 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件
  9. Win32ASM学习[23]:RadASM快捷键
  10. Opencv——查找并绘制凸包、凸包与轮廓的关系