select poll 原理记录

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 一次监听55秒过后就返回
            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、请求和返回分离

猜你喜欢

转载自blog.csdn.net/u014749668/article/details/81564871