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可以工作在边沿触发模式(高速模式),提高效率

相关推荐
獭.獭.7 分钟前
Linux -- 文件【下】
linux·服务器·文件系统·软硬链接·inode·ext2
花开富贵ii1 小时前
代码随想录算法训练营四十三天|图论part01
java·数据结构·算法·深度优先·图论
weixin_307779131 小时前
AWS Lambda解压缩S3 ZIP文件流程
python·算法·云计算·aws
破刺不会编程2 小时前
socket编程UDP
linux·运维·服务器·网络·c++·网络协议·udp
code小毛孩2 小时前
leetcode hot100数组:缺失的第一个正数
数据结构·算法·leetcode
Warren985 小时前
Lua 脚本在 Redis 中的应用
java·前端·网络·vue.js·redis·junit·lua
HalvmånEver6 小时前
在 C++ :x86(32 位)和 x64(64 位)的不同
开发语言·c++·学习
NEXU58 小时前
Linux:套接字
linux·服务器·网络
legendary_bruce8 小时前
【22-决策树】
算法·决策树·机器学习
morliz子轩9 小时前
基于WSL搭建Ubuntu 22.04.x LTS开发环境
linux·运维·ubuntu