多路转接<select>和<poll>使用手册

select

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

参数说明

返回值

  • 返回值>0        表示成功返回可访问的文件描述符个数,
  • 返回值==0      表示标识等待时间到期
  • 返回值<0        表示出现错误

int nfds

        当前最大文件描述符值+1:(2,3,5,6,10)那么nfds=10+1,这个是在select系统函数内需要遍历的最大值。

fd_set *readfds,fd_set *writefds,fd_set *exceptfds

读文件描述符集,写文件描述符集,异常文件描述符集

  • fd_set类型本质是一个位图,位图的位置 表示 相对应的文件描述符,内容表示该文件描述符是否有效,1代表该位置的文件描述符有效,0则表示该位置的文件描述符无效。
  • 如果将文件描述符2,3设置位图当中,则位图表示的是为1100。
  • fd_set的上限是1024个文件描述符。

设置函数有:

FD_SET(fd,fdset);  //设置一个fd到fdset中进行等待
FD_ZERO(fdset);    //取消一个fd到fdset中的等待
FD_CLR(fd,fdset);  //清除该fdset中的所有fd
FD_ISSET(fd,fdset) //判定该文件描述符是否存在于fdset集

但是在这个select函数中,这3个参数包括后面的timeout都属于,输入输出型参数。在select类型的服务器中,我们必须要每次在执行select函数前需要从头开始设置每个fdset类型,因为每次函数返回后都会修改传入的fdset参数。

struct timeval *timeout

  • NULL/nullptr:select调用后进行阻塞等待,直到被监视的某个文件描述符上的某个事件就绪。
  • 0(这个0可不是NULL而是 timeval{0,0}):selec调用后进行非阻塞等待,无论被监视的文件描述符上的事件是否就绪,select执行后都会立即返回,不会阻塞等待。
  • 特定的时间值:select调用后在指定的时间内进行阻塞等待,如果被监视的文件描述符上一直没有事件就绪,则在该时间后select进行超时返回。

struct timeval
{__time_t tv_sec;		/* Seconds.  */ 秒__suseconds_t tv_usec;	/* Microseconds.  */微秒
};
#define __time_t long
#define __suseconds_t long

函数说明

调用函数,他会管理设置在3个fds中的所有文件描述符,只要其中文件描述符中允许写入或者有数据可读取,返回并且设置这3个fds,以输出型参数方式返回给上层。在函数返回后,拿着这3个参数使用FD_ISSET判定那些fd允许访问。

select的优点与缺陷

优点:

  1. 效率高    一个执行流同时等待多个fd等待。
  2. 应用场景:存在大量的链接,但是只有少量的是活跃的!节省资源    如果是多线程/进程需要pcb等内存资源

缺点:

  1. 为了维护第三方数组,select服务器会充满大量的遍历,OS底层帮我们关心fd的时候,也要遍历
  2. 每一次都要对select输出参数进行重新设定
  3. 能够同时管理的fd的个数是有上 限
  4. 因为几乎每一个参数都是输入输出型的,select一定会频繁的进行用户到内核,内核到用户的参数数据拷贝
  5. 编码比较复杂

poll

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

参数说明

返回值

  • 返回值小于0, 表示出错;
  • 返回值等于0, 表示poll函数等待超时;
  • 返回值大于0, 表示fds数组有多少事件可以访问;

struct pollfd *fds

fds是一个结构体数组

struct pollfd
{int fd;			   //需要观察的文件描述符short int events;  //输入时的参数	short int revents; //输出时的参数
};

注意,这里的指针并不意味是只有一个pollfd,这里的指针是可以看成pollfd[NUM]的一个数组的,这个数组大小并不受约束,并且我们在堆创建,允许扩容realloc,每一个元素都是对应着一个文件描述符,管理着一个文件描述符。

int nfds

标识*fds指向的数组有多少个元素,用于poll函数轮询使用

int timeout

最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待的时间。

  • timeout > 0 : 等待timeout毫秒
  • timeout==0 :不会阻塞
  • timeout  < 0 :阻塞等待

函数说明

poll与select相比,poll的编写较为简单。因为poll它有一个结构体,去管理关心事件,不需要像select还得自己去写第三方数组。其次poll它没有数量限制,select是数量限制的,但是数量大了必然会影响效率,poll和select在底层都是采用轮询检测的方式去查看要关心的fd的事件是否就绪。

poll的优缺点

优点

  1. 效率高
  2. 有大量的连接,但是只有少量的是活跃的。节省资源
  3. 输入输出参数分离的,不需要进行大量的重置
  4. poll参数级别,没有可以管理的fd的上限

缺点

  1. poll依旧需要不少的遍历,在用户层检测时间就绪,与内核检测fd就绪,都是一样->epoll出现
  2. poll需要内核到用户的拷贝
  3. poll的代码也比较复杂 -- 比select容易

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/235849.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见智力题汇总

常见智力题汇总 扔瓶子问题扑克牌问题出队问题烧绳子问题赛马问题求出前三名求出前五名 接水问题种树问题硬币问题宝石问题核酸检测问题 笔者最近面试遇到了好几道智力题&#xff0c;这些题目特点就是如果没有见过&#xff0c;很难第一时间思考得到答案&#xff0c;因此笔者面试…

从setText处理来学习绘制流程

Android中TextView调用setText是会进行text文字的更新&#xff0c;是一个比较简单的画面变化&#xff0c;这可以作为一个出发点来查看绘制处理流程。这里来问问chatGPT&#xff0c;来查看大致流程 请讲讲Android中textView的setText处理流程 ChatGPT Poe 当你调用 textView.s…

docker 安装oracle 11,配置客户端远程连接

最近由于工作需要&#xff0c;oracle11数据库的导入导出&#xff0c;所以自己在电脑上模拟个数据库环境&#xff0c; 1.docker的安装&#xff0c;可以参考之前文档&#xff0c;也可以直接yum install 包名字安装 2.下载镜像 docker pull registry.cn-hangzhou.aliyuncs…

cmake和vscode 下的cmake的使用详解(一)。

本文的内容 参考如下内容。 1.【基于VSCode和CMake实现C/C开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source0ddb24a02523448baa69b0b871ab50f7 2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 3.关于如何利用…

微信小程序自定义tabber凸起

一、实现效果 二、下载地址 下载地址 源码有错自己修改一下就行

麒麟操作系统进入单用户模式

Kylin V4 桌面版&#xff1a; 启动系统后&#xff0c;在启动菜单界面选择 Kylin 4.0.2 高级选项后回车。 在高级模式选项下选择第二行 recovery mode 模式后&#xff0c;按 e 编辑。 按 e 后如下图&#xff0c;找到 linux 开头的一行&#xff0c;修改 ro 为 rw 后&#xff0c…

万宾科技监测设备,可燃气体监测仪特点一览

万宾科技的监测设备种类繁多&#xff0c;包括可燃气体监测仪、管网水位监测仪、内涝积水监测仪等。其中可燃气体监测仪是万宾科技的核心产品之一&#xff0c;用于监测环境中可燃气体的浓度&#xff0c;适用于对甲烷气体浓度进行实时监测&#xff0c;应用于燃气管网、排水管网、…

基于OpenCV的手势识别系统设计与开发

摘要 随着计算机技术与信息处理技术迅速发展&#xff0c;智能化电子设备逐渐进入到日常的生产和生活中&#xff0c;与此同时&#xff0c;人们对电子设备操作过程的便捷化也提出了新的要求&#xff0c;这也促使计算机进行图像处理的技术也得到了发展。近些年兴起的模式识别技术…

使用easyExcel框架报错:服务器缺少字体

后台服务使用easyExcel框架生成表格&#xff0c;但是生成的时候报如下的错误&#xff1a; 这种报错其实就是部署服务的服务器缺少字体&#xff0c;正确的方法是安装字体。需要注意的是&#xff0c;测试环境服务器与生产环境服务器的在配置版本上可能存在差异&#xff0c;因此需…

OLED双面显示广告机的应用场景

OLED双面显示广告机是一种创新的广告设备&#xff0c;它具有双面显示屏幕&#xff0c;可以同时向两个方向展示广告或信息。这种设备被广泛应用于各种场景&#xff0c;例如&#xff1a; 商业展示&#xff1a;在大型商业场所&#xff0c;如购物中心、百货商场等&#xff0c;OLED双…

【Linux基础开发工具】yum生态vim的配置与使用

目录 前言 1. Linux 软件包管理器 yum 1.1 什么是yum 1.2 快速上手yum 1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置 3.2 用户sudo权限配置 总结 前言 Linux基础指令与权限之后&#xff0c;Linux系统开发工具的使用…

2023年亚太杯数学建模C题新能源汽车(思路模型代码)

一、翻译 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料(非常规车用燃料是指汽油和柴油以外的燃料&#xff09;&#xff0c;并集成了汽车动力控制和驱动等先进技术的汽车。新能源汽车包括…