Linux 软件编程多路复用tcp

1.select的缺点:

1.select监听的文件描述符集合是一个数组,有上限(1024个)

2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销

3.select需要用户手动查找产生事件的文件描述符

4.select只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)

2.poll

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

功能:

监听文件描述符集合,工作方式类似于select

参数:

fds:文件描述符集合首地址

nfds:文件描述符集合的数组的长度

timeout:超时时间,单位毫秒,-1表示永久等待

返回值:

成功返回产生事件文件描述符个数

失败返回-1

超时仍然没有产生的事件返回0

struct pollfd {

int fd; /* file descriptor */

short events; /* requested events */

short revents; /* returned events */

};

1.poll的缺点:

1.poll监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销

2.poll需要用户手动查找产生事件的文件描述符

3.poll只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)

3.epoll

1.epoll_create

int epoll_create(int size);

功能:

在内核层创建一张epoll监听的事件表

参数:

size:监听的事件表大小

返回值:

成功返回新的文件描述符

失败返回-1

2.epoll_ctl

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

功能:

管理内核中epoll事件表

参数:

epfd:文件描述符

op: EPOLL_CTL_ADD 添加客户端

EPOLL_CTL_MOD 修改客户端

EPOLL_CTL_DEL 删除客户端

fd:文件描述符

event:事件结构体

返回值:

成功返回0

失败返回-1

typedef union epoll_data {

void *ptr;

int fd;

uint32_t u32;

uint64_t u64;

} epoll_data_t;

struct epoll_event {

uint32_t events; /* Epoll events */

epoll_data_t data; /* User data variable */

};

events:EPOLLIN EPOLLOUT EPOLLET

3.epoll_wait

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

功能:

监听epfd对应的事件表中是否有事件发生

参数:

epfd:文件描述符

events:存放产生事件的数组空间首地址

maxevents:最多存放数组元素个数

timeout:超时时间,单位毫秒,-1表示永久等待

返回值:

成功返回实际发生事件的个数

失败返回-1

超时仍然没有产生事件返回0

epoll的优点:

1.epoll没有文件描述符上限限制

2.epoll监听的事件表在内核层,内核监听事件不需要操作用户层空间提高效率

3.epoll会获得产生事件的文件描述符,不需要用户查找

4.epoll可以工作在边沿触发模式(高速模式),提高效率

相关推荐
呆呆的小鳄鱼36 分钟前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展
墨染点香37 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
沧澜sincerely38 分钟前
排序【各种题型+对应LeetCode习题练习】
算法·leetcode·排序算法
CQ_071238 分钟前
自学力扣:最长连续序列
数据结构·算法·leetcode
弥彦_1 小时前
cf1925B&C
数据结构·算法
guts°1 小时前
10-ACL技术
网络·网络协议
群联云防护小杜1 小时前
深度隐匿源IP:高防+群联AI云防护防绕过实战
运维·服务器·前端·网络·人工智能·网络协议·tcp/ip
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
YuTaoShao1 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
退役小学生呀1 小时前
十五、K8s可观测能力:日志收集
linux·云原生·容器·kubernetes·k8s