因为 select 和 poll 的返回值特性,所以想判断到底哪个文件描述符发生了事件,需要遍历文件描述符表,因此,在“高并发、少访问”情况下,比如 1000 个连接,就 3 个发了数据,select 和 poll 效率就很低。
理想状态:内核直接告诉我“哪个文件描述符”发生了“什么事件”:此功能对应于epoll 模型。
(1)头文件

#include <sys/epoll.h>

(2)函数
1)创建一个 epoll 句柄:

int epoll_create(int size)

参数: 监听文件描述符的数目(是一个建议值,内核可能会适时扩充)。
返回值:一个文件描述符,指向一个红黑树的树根(参数 size 其实就是反应了树的大小)。
使用:

int epfd = epoll_create(100);

2)控制某个 epoll 监控的文件描述符上的事件:注册、修改、删除。

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

参数 1:epoll 句柄,epoll_create 函数返回值。
参数 2: 用 3 个宏,表示执行动作 (控制树上结点),
EPOLL_CTL_ADD :注册新的 fd 到 epfd (上树:添加结点);
EPOLL_CTL_MOD :修改已经注册的 fd 的监听事件 (修改结点);
EPOLL_CTL_DEL :从 epfd 删除一个 fd (下树:删除结点)。
参数 3:f要监听的文件描述符(即 参数 2 中控制的结点)
参数 4: 告诉内核需要监听谁的什么事件 ,是传入参数。

struct epoll_event
{__uint32_t events; // 要监听的事件: EPOLLIN (读) / EPOLLOUT(写) / EPOLLERRepoll_data_t data; // 返回事件联合体:返回什么东西};

联合体

typedef union epoll_data
{ void *ptr; int fd; // 返回有事件的文件描述符,其实就是参数 3uint32_t u32;uint64_t u64;} epoll_data_t;

返回值:成功返回0; 失败返回-1,并设置 errno。
使用:

struct epoll_event evt;
evt. events = EPOLLIN; evt. data.fd = lfd; // 结构体赋值
epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, &evt); // 添加结点,监听 lfd

3)等待所监控文件描述符上有事件的产生,类似于 select 函数调用。

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

参数 1:epoll 句柄,epoll_create 函数返回值。
参数 2:struct epoll_event *events
注意:这里的参数2与 epoll_ctl 函数参数 4 的区别:
epoll_ctl 函数 参数 4:是我告诉内核,我想监听某个文件描述符的某个事件,因此,使用上是传入参数,先定义赋值,再传入结构体地址(本质);
epoll_wait 函数 参数 2:目的是让内核告诉我哪些文件描述符发生了哪些事件,使用上是传出参数,因为数量多个,因此本质是结构体数组首地址。
参数 3:结构体数组容量
参数 4: int 型 : -1代表永久阻塞,直到监控事件发生;0代表立即返回,不阻塞进程; > 0代表等待指定的毫秒数。
返回值:成功返回所监听的所有的满足条件的文件描述符总数量;失败返回 -1,设置 errno。
使用:

 struct epoll_event events[100];int ret = epoll_wait(epfd, events, 100, -1);if(ret > 0){for(int i = 0; i < ret; i++) //“高并发、少访问”情况下,也可以保证高效率
{if(events[i].data.fd == lfd)accept(events[i].data.fd, 获得客户端信息);
if(events[i].data.fd == cfd)read(events[i].data.fd, buf, sizeof(buf));
} }

多路 IO 转接 :epoll 函数相关推荐

  1. epoll实现多路io转接

    epoll实现多路IO转接思路: lfd = socket(); 监听连接事件lfd bind(); listen(); int epfd = epoll_create(1024); epfd, 监听 ...

  2. 多路IO转接——前导

    文章目录 IO的概念 但是操作系统是怎么知道当前网卡当中是有数据: 中断.中断向量 中断向量表 底层数据到达时操作系统做了啥: 硬中断 软中断 软中断 硬中断 中断 高级IO为何高效 高级IO的本质 ...

  3. 多路 IO 转接 :select 函数

    (1)头文件: #include <sys/select.h> (2)函数原型: int select( int nfds, fd_set *readfds, fd_set *writef ...

  4. 多路IO转接服务器 epoll

    创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,跟内存大小有关. #include <sys/epoll.h> int epoll_create(int size) ...

  5. 多路 IO 转接 :poll 函数

    (1)头文件 #include <poll.h> (2)函数原型 int poll (struct pollfd *fds, nfds_t nfds, int timeout); (3)参 ...

  6. 3高并发服务器:多路IO之epoll

     1 epoll epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并.发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传 ...

  7. Linux中的多路IO转接,转载

    linux系统对于多路i/o转接提供了几个强大的函数,但是这些函数各有优缺点,参照网上的资料以及自己的测试,总结如下: 首先看一个程序的例子: #include        <time.h&g ...

  8. 29.Linux网络编程熟练掌握 TCP 状态张换图熟练堂握端口复用的方法了解半关闭的概念和实现方式了解多路10 转接模型熟练掌握 select 函数的使用熟练使用 fdset 相关函数的使用能够编写

    把昨天的 第二天的内容说一下,复习一下,第二天 讲的东西不算多,但是有两个作业题来写一写, 大致浏览一下,三次握手 四次挥手的过程,大家有没有画一下? 能画出来吗?同学们,大家注意 这个写代码的时候其 ...

  9. select 实现类似多线程_linux进程通信--socket套接字(四)--多路IO转实现一个server对应多个client...

    先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题 一 why 在前 ...

最新文章

  1. 屏幕为什么要正负压供电_负压变换器的设计
  2. 与女儿谈商业模式 (3):沃尔玛的成功模式
  3. JBoss关闭时报Failed to authenticate principal=null,...
  4. ExecutorService框架
  5. 【学术相关】中国霸榜AI顶会,但引用量最低!最新斯坦福AI指数出炉!
  6. python nose测试框架全面介绍十---用例的跳过
  7. 推荐:全网最全的Java并发面试题及答案。
  8. Web框架——Flask系列之json、jsonify模块的使用(十四)
  9. linux cpu核数和线程数,cpu个数、核数和线程的理解
  10. Eclipse导出APK文件报错 android lint problem
  11. TensorFlow相关的一些技巧
  12. java从以文件复制到另一文件_java将一个文件复制到另一个文件夹
  13. 斯嘉丽约翰逊60张pdf什么时间的?_巩俐入围威尼斯电影节的作品叫什么?巩俐为什么被称为女皇?...
  14. 【转载】Linux摄像头驱动1——vivid
  15. 免费开源好用还佛系的国产PDF软件:pdf补丁丁下载 | 含pdf补丁丁使用手册
  16. Bootstrap基本结构
  17. 书籍记录了我技术的成长历程
  18. 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
  19. Linux 查看quota状态,Linux命令之quota详解
  20. mac上截图的快捷键以及一些快捷键使用

热门文章

  1. 七牛云 php sdk 安装,linux下Composer安装,通过Composer安装七牛云SDK
  2. CVPR 2022 | 华为诺亚北大提出量子启发MLP,性能超越Swin Transfomer
  3. 杭州/北京/新加坡 | 蚂蚁集团数字身份团队招聘计算机视觉算法实习生
  4. SIGIR 2021 | 基于不确定性正则化与迭代网络剪枝的终身情感分类方法
  5. 半监督学习技术在金融文本分类上的实践
  6. ACL 2019开源论文 | 句对匹配任务中的样本选择偏差与去偏方法
  7. OpenCV-Python图像拼接方法
  8. RocketMQ 错误:The broker does not support consumer to filter message by SQL92
  9. springmvc jsp页面提交表单乱码
  10. linux查看ibmmq进程,ibm-mq – 如何检查IBM MQ for Linux中是否存在队列名称?