1select
select 的工作原理
- 1添加文件描述符到集合中去
- 2将文件描述符表给内核监听
- 3监听到变化的文件描述符表返回回去替换原来的文件描述符表
- 4返回值为变化的文件描述个数
- 5遍历文件描述符表查找变化的文件描述符
select函数(int nfds,fd_set *readfds,fd_set*writefds,
fd_set*exceptfds,struct timeval*timeout);
参数:nfds:最大可以监听的文件描述符的个数,最大文件描述符加1
参数:readfds:监听可读文件描述符的集合地址
参数:writefds:监听可写文件描述符的集合地址
参数:exceptfds:监听错误文件描述符的集合地址
参数:timeout:设置时间
NULL 永久等待
5 一次监听5秒 5秒过后就返回
0 不阻塞 自己返回
返回值:监听到文件描述符变化的个数
缺点:监听文件有限
传入传出参数
2、poll
请求和返回分离
文件描述符没有1024上限
poll的函数
int poll(struct pollfd* fds,nfds_t nfds,int timeout)
参数:struct pollfd*fds 结构体数组的首元素地址
struct pollfd
{
int fd; 监听的文件描述符
short events; 监听的事件
short revents; 返回的事件
}
参数:nfds 最大文件描述+1 文件描述符的个数
参数:timeout
-1 永远等待
0不等待
大于0 限时等待
返回值:变化文件描述符的个数
3、poll工作原理
- 1、将文件描述符,事件,返回值进行封装在结构体中
- 2、先将结构体初始,文件描述符,事件初始化,加入到结构体数组中,如果文件描述符 初始化为-1 内核将不会去监听
- 3、把结构体数组传给内核进行监听,事件变化,如果有事件发送,返回,返回值为事件发生的个数,传出结构体数组,里面记录了发生事件的对应结构体,通过遍历,可以读取相应的事件
4、poll编写并发服务器流程
1、创建socket
2、绑定
3、监听
4、轮询监听是否有事件发生
5、判断处理事件
6、关闭
注意:如果结构体中的fd小于0,poll就不去监听
poll和select 的优势
1、没有1024 最大文件描述符限制
ulimit -a 查看本机文件打开个数和其他
2、请求和返回分离