函数epoll

1. 函数epoll_creat: 该函数生成一个epoll专用的文件描述符

  1. int epoll_creae(int size);

分析:

  • size:epoll上能关注的最大描述符数

2. epoll_ctl:用于控制某个epoll文件描述符事件,可以注册、修改、删除

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

参数:

1. efd:epoll_create函数的返回值

2. op:对该监听红黑树所做的操作

  • EPOLL_CTL_ADD:添加新的fd到epfd中
  • EPOLL_CTL_MOD:修改fd在监听红黑树的监听事件
  • EPOLL_CTL_DE:将一个fd从监听红黑树摘下

3. fd:待监听的fd

4. event:本质struct epoll_event 结构体地址

  1. typedef union epoll_data
  2. {
  3. void* ptr;
  4. int fd; //对应监听的fd
  5. uint32_t u32;
  6. uint64_t u64;
  7. } epoll_data_t;
  8.  
  9. struct epoll_event
  10. {
  11. uint32_t events; /* epoll事件 */
  12. epoll_data_t data; /* 用户数据 */
  13. };

3. 等待IO事件发生 - 可以设置阻塞的函数

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

参数:

  • efds:epoll_create函数的返回值
  • events:传出参数【数组】满足监听条件的哪些fd结构体
  • maxevents:数组元素的总个数(1024) struct epoll_events [1024]:
  • timeout:
  • ET:边缘触发只有数据到来才触发,不管缓冲区是否还有数据(缓冲区剩余未读尽的数据的数据不会导致epoll_wait返回。新的时间满足,才会触发)
  • LT:水平触发 ---默认采用模式(缓冲区剩余未读尽的数据会导致epoll_wait返回。)

1. 测试代码:

  1. #include <errno.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5.  
  6. #define MAXLINE 10
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. int efd, i;
  11. int pfd[];
  12. pid_t pid;
  13. char buf[MAXLINE],ch = 'a';
  14. pipe(pfd);
  15. pid = fork();
  16.  
  17. if (pid == ) //子写
  18. {
  19. close(pfd[]); //关闭读
  20. while ()
  21. {
  22. for (i = ; i < MAXLINE / ; i++) //aaaa\n
  23. buf[i] = ch;
  24. buf[i - ] = '\n';
  25. ch++;
  26.  
  27. for (; i < MACLINE; i++) //bbbb\n
  28. buf[i] = ch;
  29. buf[i - ] = '\n';
  30. ch++;
  31.  
  32. write(pdf[], buf, sizeof(buf)); //aaaa\nbbbb\n
  33. sleep();
  34. }
  35. close(pfd[]);
  36. }
  37. else if (pid < ) //父进程读
  38. {
  39. struct epoll_event;
  40. struct epoll_event resevent[];
  41. int res, len;
  42.  
  43. close(pfd[]); //关闭写
  44. efd = epoll_create();
  45.  
  46. //event.events = EPOLLIN | EPOLLET // ET边沿触发
  47. even.events = EPOLLIN; // LT水平触发(默认)
  48. event.data.fd = pfd[];
  49. epoll_ctl(efd, EPOLL_CTL_ADD, pfd[], &event);
  50.  
  51. while ()
  52. {
  53. res = epoll_wait(efd, resevent, , -);
  54. printf("res %d\n", res);
  55. if (resevent[].data.fd == pfd[])
  56. {
  57. len = read(pfd[], buf, MACLINE/);
  58. write(STDOUT_FILENO, buf, len);
  59. }
  60. }
  61. close(pfd[pfd[]);
  62. close(efd);
  63. }
  64. else
  65. {
  66. perror("fork");
  67. exit(-);
  68. }
  69. return ;
  70. }
  1. #include <errno.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5.  
  6. #define MAXLINE 10
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. int efd, i;
  11. int pfd[];
  12. pid_t pid;
  13. char buf[MAXLINE],ch = 'a';
  14. pipe(pfd);
  15. pid = fork();
  16.  
  17. if (pid == ) //子写
  18. {
  19. close(pfd[]); //关闭读
  20. while ()
  21. {
  22. for (i = ; i < MAXLINE / ; i++) //aaaa\n
  23. buf[i] = ch;
  24. buf[i - ] = '\n';
  25. ch++;
  26.  
  27. for (; i < MACLINE; i++) //bbbb\n
  28. buf[i] = ch;
  29. buf[i - ] = '\n';
  30. ch++;
  31.  
  32. write(pdf[], buf, sizeof(buf)); //aaaa\nbbbb\n
  33. sleep();
  34. }
  35. close(pfd[]);
  36. }
  37. else if (pid < ) //父进程读
  38. {
  39. struct epoll_event;
  40. struct epoll_event resevent[];
  41. int res, len;
  42.  
  43. close(pfd[]); //关闭写
  44. efd = epoll_create();
  45.  
  46. //event.events = EPOLLIN | EPOLLET // ET边沿触发
  47. even.events = EPOLLIN; // LT水平触发(默认)
  48. event.data.fd = pfd[];
  49. epoll_ctl(efd, EPOLL_CTL_ADD, pfd[], &event);
  50.  
  51. while ()
  52. {
  53. res = epoll_wait(efd, resevent, , -);
  54. printf("res %d\n", res);
  55. if (resevent[].data.fd == pfd[])
  56. {
  57. len = read(pfd[], buf, MACLINE/);
  58. write(STDOUT_FILENO, buf, len);
  59. }
  60. }
  61. close(pfd[pfd[]);
  62. close(efd);
  63. }
  64. else
  65. {
  66. perror("fork");
  67. exit(-);
  68. }
  69. return ;
  70. }

epoll函数的更多相关文章

  1. UNIX网络编程学习指南--epoll函数

    epoll是select/poll的强化版,都是多路复用的函数,epoll有了很大的改进. epoll的功能 1.支持监听大数目的socket描述符 一个进程内,select能打开的fd是有限制的,有 ...

  2. I/O多路复用——epoll函数

    1 select的低效率 select/poll函数效率比较低,主要有以下两个原因: (1)调用select函数后需要对所有文件描述符进行循环查找 (2)每次调用select函数时都需要向该函数传递监 ...

  3. epoll函数及三种I/O复用函数的对比

    epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd ...

  4. 详解网络编程必会的poll和epoll函数

    前言 之前已经介绍过select函数,请参考这篇博客:https://www.cnblogs.com/liudw-0215/p/9661583.html,原理都是类似的,有时间先阅读下那篇博客,以便于 ...

  5. (转)浅析epoll – epoll函数深入讲解

    原文地址:http://www.cppfans.org/1418.html 浅析epoll – epoll函数深入讲解 前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要 ...

  6. epoll函数与参数总结学习 & errno的线程安全

    select/poll被监视的文件描述符数目非常大时要O(n)效率很低:epoll与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以 ...

  7. UNIX环境高级编程——epoll函数使用详解

    epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是 ...

  8. Linux-C网络编程之epoll函数

    上文中说到假设从100的不同的地方取外卖,那么epoll相当于一部手机,当外卖到达后,送货员能够通知你.从而达到每去必得,少走非常多路. 它是怎样实现这些作用的呢? epoll的功能 epoll是se ...

  9. epoll 函数解析

    本文参考社长的 TinyWebServer 庖丁解牛 epoll 常用API epoll_create 函数 #include <sys/epoll.h> int epoll_create ...

随机推荐

  1. [转] Understanding-LSTMs 理解LSTM

    图文并茂,讲得极清晰. 原文:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ colah's blog Blog About Con ...

  2. [Docker]CentOS7下Docker安装教程

    想要倒腾Kubernetes的话,第一步就是要会安装Docker,这篇文章讲一讲过程 安装步骤 检查内核版本,必须是3.10以上 uname -r 安装Docker yum -y install do ...

  3. JavaScript-简介、ECMAScript5.0

    Javascript简介 web前端有三层: HTML:从语义的角度,描述页面的结构 CSS:从审美的角度,描述样式(美化页面) Javascript:从交互的角度,描述行为(提升用户体验) Java ...

  4. 用ARX自定义实体

      本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h",&quo ...

  5. vc++基础班[27]---实现一个简单的任务管理器

      因为任务管理器中涉及到进程的枚举操作,所以把两节课的知识点合并到一起来讲!   ①.设计界面.以及列表控件变量的绑定: ②.列表控件样式的指定: m_TaskList.SetExtendedSty ...

  6. 数据库的OLE字段写入长二进制文件

    //'*************************************************************************************** //'函数:将数据 ...

  7. 题解-Codeforces710F String Set Queries

    咕了好久没更博客,最近得知可以去冬眠营玩耍,还可以搭顺风车回广州过年 (最近做到的比较有意思的题目:bzoj3958.hihocoder1419) Problem Codeforces-710F--洛 ...

  8. git与eclipse集成之添加.gitignore文件

    1.1. 添加.gitignore文件 .gitignore 配置文件用于配置不需要加入版本管理的文件 1.以斜杠/开头表示目录: 2.以星号*通配多个字符: 3.以问号?通配单个字符 4.以方括号[ ...

  9. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  10. Openssl源代码整理学习---含P7/P10/P12说明

    声明:建议结合Openssl源代码学习: 一.基础知识 1.Openssl 简史 OpenSSL项目是加拿大人Eric A.Yang 和Tim J.Hudson开发,现在有Openssl项目小组负责改 ...