select函数位于头文件#include <sys/select.h> 。该函数用于监视文件描述符的变化情况——读写或是异常。可以理解为服务器端在内核通过select函数来处理客户端的需求。
为什么需要select函数那?
假如你的程序要和许多客户端进行通信,难道你会开启很多线程或者进程吗,这样只会大大降低CPU的利用率,所以select函数可以实现一个线程记录IO流的状态来同时管理多个IO。poll,epoll等也可实现此功能。

select函数的源码:


/* According to POSIX.1-2001 */
#include <sys/select.h>/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);void FD_CLR(int fd, fd_set *set);
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);

1 select参数分析
参数1 所监听的所有文件描述符中,最大的文件描述符加1

最大的文件描述符就是fd6+1
参数2:所监听的文件描述符可读事件
参数3 : 所监听的文件描述符可写事件
参数4: 所监听的文件描述符异常事件
参数五:一个指向timeval结构的指针,用于决定select等待I/o的最长时间。如果为空将一直等待。timeval结构的定义:struct timeval{
long tv_sec; // seconds
long tv_usec; // microseconds
}

2 附加函数分析
void FD_ZERO (fd_set *fdset); // 将set清空
void FD_SET (int fd,fd_set *fdset); // 将fd设置到set集合当中去
void FD_CLR (int fd,fd_set *fdset); // 将fd从set集合中清除出去
intFD_ISSET(int fd,fd_set *fdset); // 判断fd是否在集合当中
3 返回值
select函数的返回值是所监听集合中满足条件的总数
4 程序的流程
先fd_set readfds;
FD_ZERO(fd_set &readfds);
FD_SET(fd1,&readfds);
FD_SET(fd2,&readfds);
FD_SET(fd3,&readfds);
FD_SET(fd4,&readfds);
select();
for(){
FD_ISSET(fd1,&readfds);
FD_ISSET(fd2,&readfds);
FD_ISSET(fd3,&readfds);
FD_ISSET(fd4,&readfds);
}


1 代表满足条件 0 不满足条件
假如服务器接收客户端的5个请求,发现只有fd4满足条件,那就返回的是1 0 0 0 0
5 函数缺陷:
1 select最大监听文件的描述符最大为1024,这个可以改但是要改内核,对于普通用户来说就认为是最大的。
2 对于太多的文件描述符for()循环要遍历太多次,非常麻烦,要是用户自己定义一个数据结构数组,专门用来存放满足满足条件的文件描述符,难就难在自定义数据结构上
3 监听的集合是readfds 满足监听的集合也是readfds你需要对每次的readfds进行保存。这个容易出错并且麻烦

select函数的分析相关推荐

  1. select函数详解及实例分析

    Select函数在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞 ...

  2. select函数用法详解,及实例分析

    select函数是系统调用函数,用于多路监控.当没有一个文件满足要求时,select将阻塞调用进程.在有些情况下,采用select函数可以大大简化程序结构.比如一个系统有10个输入设备,如果想实时读取 ...

  3. 增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志

    摘要: 增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志 在我们平时分析业务时,一个最重要的指标就是,今天比昨天增长多少,本周比上周增长多少:或者同上一个周期相比增长最大的分类是哪个?这些问 ...

  4. 深入研究socket编程(3)——使用select函数编写客户端和服务器

    http://blog.csdn.net/chenxun_2010/article/details/50488394 首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代 ...

  5. linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

  6. 29.Linux网络编程熟练掌握 TCP 状态张换图熟练堂握端口复用的方法了解半关闭的概念和实现方式了解多路10 转接模型熟练掌握 select 函数的使用熟练使用 fdset 相关函数的使用能够编写

    把昨天的 第二天的内容说一下,复习一下,第二天 讲的东西不算多,但是有两个作业题来写一写, 大致浏览一下,三次握手 四次挥手的过程,大家有没有画一下? 能画出来吗?同学们,大家注意 这个写代码的时候其 ...

  7. R语言dplyr包使用select函数通过索引查询或者排除数据列实战(Select Columns by Index)

    R语言dplyr包使用select函数通过索引查询或者排除数据列实战(Select Columns by Index) 目录

  8. linux lock函数,Linux lock_kernel()函数的分析。

    这只是暂时的记录,以后会把它归类到start_kernel()函数的分析.在分析之前,我先要说说几个概念. 内核抢占:在2.6内核加入了抢占的能力,就是说调度程序有办法在一个内核级的任务正在执行的时候 ...

  9. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

最新文章

  1. 史上最大规模 DDoS 攻击,每秒 1720 万次 HTTP 请求
  2. CentOS7编译安装mysql-5.6.28和编译参数
  3. 云安全课程:云平台使用安全
  4. sscanf()的用法和例子
  5. qt icon如何显示gif_收集Qt支持的emoji表情-第五弹
  6. Convert(varchar(8),Getdate(),108) 什么意思
  7. 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
  8. 九宫格有规律高亮滚动效果
  9. Java == equal
  10. 人工智能将助力智能家居产业发展
  11. 又收获一位副总裁?传暴风TV CEO刘耀平已加盟小米电视
  12. 传统云纹祥云素材,稳妥传承中国味!
  13. NetCore 统一处理 webapi 返回null 转为“”
  14. VC++如何根据进程名获取进程ID
  15. 2020年能够实现强AI吗?GPT-3 是强AI吗?
  16. C语言基础选择题100道(附答案)01
  17. 网站服务器需不需要装杀毒软件,服务器要不要装杀毒软件
  18. 拒绝年费自己组建MarkdownNice转微信公众号格式神器
  19. Ubuntu Frp内网穿透+Samba 445端口
  20. 清空数据库所有表数据

热门文章

  1. 微信小程序(八)实战——加载图片images
  2. linux 函数中打印调用栈
  3. Android性能优化(一):APP启动优化
  4. user story的重要性
  5. 免费基金股票接口大全,macd,kdj,cci,威廉指标,神奇九转大全
  6. android 颜色color.xml文件及部分中英文对照
  7. 【Excel】之数据透视表及动态图表
  8. C语言/实现MD5加密
  9. SVAC1.0帧间预测技术分析
  10. Python 爬取迷你MP4电影网,电影名称保存到本地,Requests+lxml框架