TCP/IP,Linux多路IO模型epoll,select和poll的升级版,有更多的API,消耗更多句柄换来监听的清晰度,select,poll,epoll比较

本文介绍了Linux下TCP/IP多路IO模型中的epoll,作为select和poll的升级版,epoll提供了更高的效率和更清晰的监听管理。epoll的特点包括在事件发生后直接返回描述符,支持更多的API,并通过平衡二叉树结构优化性能。文章对比了epoll、select和poll在处理大量连接套接字时的效率和操作方式,并给出了epoll的API使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP/IP,Linux多路IO模型epoll,select和poll的升级版,有更多的API,消耗更多句柄换来监听的清晰度,select,poll,epoll比较

O、在服务端拥有较多的连接套接字的情况下,只想监听部分套接字,需要用到epoll,
1、和select和poll相比,epoll可以在发生了事件后直接返回发生了事件的描述符,而不用一个个判断。
2、epoll是目前非常常见的多路io转接模型,效率上大于等于select,在多连接和多监听的情况下,二者效率差不多。
3、epoll拥有比select和poll较多的API:

一、epollAPI,创建epoll句柄
创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,和内存大小有关

#include <sys/epoll.h>
int epoll_create(int size);

1、参数size就是监听的数目,但是这是个建议值,后续如果传入10但想要监听50个,也是可以的。
2、epoll句柄指向操作系统中的一个平衡二叉树,每一个受到监听的描述符都是这个二叉树的一个节点。

二、epollAPI,设定监听事件
控制某个epoll监控的文件描述符上的事件:注册、修改、删除

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

1、第一个参数epfd是epoll句柄
2、第二个参数op表示动作,

EPOLL_CTL_ADD:添加描述符节点
EPOLL_CTL_MOD:修改描述符节点
EPOLL_CTL_DEL:删除描述符节点
3、第三个参数fd是进行动作的描述符
4、第四个参数event是事件,

struct epoll_event {
   
               uint32_t     events;      /* Epoll events */
               epoll_data_t data;        /* User data variable */
           };
typedef union epoll_data {
   
               void        *ptr;//泛型指针,可以接受任何类型
               int          fd;
               uint32_t     u32;
               uint64_t     u64;
           } epoll_data_t;

//注意这里的这个结构是个联合体,只传一个值,就是文件描述符,这也是epoll能返回直接发生事件的描述符的原因。

三、epollAPI,阻塞监听
使用epoll阻塞监听套接字,

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events,
	int maxevents, int timeout);

1、第一个参数是epoll句柄
2、第二个参数是epoll_event结构体的数组
3、第三个参数是events的大小,不能大于创建events时的大小,是结构体数组的最大文件描述符+1,和select传的数值没有区别
4、指定超时时间,-1时阻塞,0时立即返回,>0是指定毫秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值