select是在指定时间内(最后一个参数指定的时间)轮询指定fd集合的接口

1. 需要包含的头文件

#include <sys/time.h>  //select是在指定时间内轮询,所以有时间相关的参数
#include <sys/types.h>
#include <unistd.h>

2. 函数原型以及参数说明

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);//参数1: int nfds: 最大的文件描述符 + 1 (1)由此可见,select轮询的是int的文件描述符,而非FILE*的
//参数2: 待检测  是否有数据可读取的  fd集合fd_set实际上是long类型数组,每个数组元素都与一打开的文件句柄建立联系,相关的API如下(1) FD_ZERO(fd_set*) //将fd_set清空不含任何描述符(2)FD_SET(fd fd_set*)  //将fd(int)加入 fd_set集合 (3)FD_CLR(fd, fd_set*) //将fd(int)从fd_set中删除(4)FD_ISSET(fd,fd_set*)//select结束后调用,用于判断fd是否在set集合中,fd在集合中则返回真,不在集合中返回假
//参数3:待检测  是否有数据可写的  fd集合 【目前我所见过的大部分填NULL】
//参数4: 待检测  是否有数据可执行的 fd集合【目前我所见过的大部分填NULL】
//参数5:timeval: 检测的时间 

3. 函数返回值

>0:  就绪描述符的数量
=-1: 出错
0:  超时(无就绪的描述符)

使用注意:

1. 第二到四个参数分别是待检测可读fd集合,  待检测可写fd集合,待检测可执行fd集合,我们可以只填写部分集合,如果三个集合都不填写的话,就得到了一个比sleep更精准的定时器(timeval中精确到微秒,sleep精确到秒)

2. 第二到四个参数是类似的,只是监视文件的动作不同,以第二个readset为例,会在time参数指定的时间内监视该fd_set集合中是否有可读的文件,如果有,则返回可读的描述符的个数>0,如果在time指定的时间内没有可读的描述符,则返回0. 只有在select发生错误的时候才返回-1

3. timeval的三种使用方法:

1)timeval = NULL: 表示时间无限长,一直到描述符集合中某个描述符变化为止。如果描述符集合中没有发生变化的描述符,则一直阻塞。

2) timeval = 0:  只轮询描述符集合一次,如果没有发生变化的,返回0; 如果有,则返回变化的描述符的数量。

3) timeval > 0: 在该时间内阻塞轮询描述符集合,如果没有发生变化的,则返回0,如果有,则返回发生变化的描述符的数量,

void main()
{int sock; int fd;fd_set fds;struct timeval timeout={0,3}; //select等待3微秒,3微秒轮询,要非阻塞就置0while(1){FD_ZERO(&fds);     //每次循环都要清空集合,否则不能检测描述符变化FD_SET(sock,&fds); //添加描述符 sock FD_SET(fd,&fds);   //添加描述符fdtimeout.tv_sec=0;timeout.tv_usec=3; //select函数会不断修改timeout的值,所以每次循环都应该重新赋值maxfdp=sock>fd?sock+1:fd+1;                    //描述符最大值加1switch(select(maxfdp,&fds,&fds,&fds,&timeout)) {case -1: exit (-1);break;         //select错误,直接exit退出case 0:break;         //0代表超时,没有发生变化的fddefault:if(FD_ISSET(sock,&fds))    //测试sock是否可读{if(FD_ISSET(fd,&fds))           //测试文件是否可写} }     }
}

使用注意:

1. select 多数情况下是连续调用的,要么是select被包在一个循环里面,要么是软件逻辑保证不停的select 。

2. select内部会对后面的四个参数进行修改,所以每一次select之前后面的四个参数需要重新设置。

3. 第二三四个参数(描述符集合)可以是重复的。

4. select轮询后,会把没有发生变化的描述符从集合中删除,集合中剩余的描述符即发生变化的描述符。所以只需要select后用FD_ISSET检测某个描述符是否还在集合中,即可判断该描述符是否发生了变化。

扩展:select与 驱动层的关系:

应用层的selcet调用后,会调用到驱动层的  file_operations->poll  接口,在这个函数里应该调用poll_wait(),将current加到某个等待队列(这里调用poll_wait()),并检查是否有效,如果无效就调用schedule_timeout();去睡眠。事件发生后,schedule_timeout()回来,调用fop->poll(),检查到可以运行,就调用poll_freewait(&table);从而完成select系统调用。重要的是fop->poll()里面要检查是否就绪,如果是,要返回相应标志。

select 的使用相关推荐

  1. jeee的基础知识(转载)

    Servlet: 1)servlet : servlet是一个特殊的java程序,需要在web服务器上运行,并接收和响应客户端的请求,遵循http协议. 2)Servlet;作用: 主要用于控制层. ...

  2. ORACLE-SQL较全面笔记

    -- 首先,以超级管理员的身份登录oracle        sqlplus sys/bjsxt as sysdba        --然后,解除对scott用户的锁        alter use ...

  3. 设置select下拉框不可修改的→“四”←种方法

    设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...

  4. Go 知识点(09)— for select 作用于 channel

    1. for select 作用于未关闭的通道 1.1 没有 default 分之场景 先看下面代码 func main() {ch := make(chan int, 3)go func() {ti ...

  5. 【Sql Server】DateBase-简单的Select查询

    Select语句查询 小技巧:select 12*13 as 计算结果 Distinct:消除重复列 Where [and/or][多个条件](like '河南%') Where 字句运算符 Betw ...

  6. 根据JSON自动生成select联动

    公用js var CreateSelect = function (obj) {this.__ID__ = 0;this.$dom = $(obj.dom);this.selectList = obj ...

  7. 合肥工业大学—SQL Server数据库实验八:使用聚集函数的SELECT语句

    在数据库EDUC中用SQL语句实现如下查询: 1) 查询学生的总人数 -- 查询学生的总人数 select count(*) from student select count(1) from stu ...

  8. MySQL基础之select基本查询

    DQL语言基本查询 一.基本的select语句 1.查询常量 2.从表中查数据 3.使用列的别名查询 4.去重 5.空值NULL参与运算 6.过滤数据 二. 运算符 1.算术运算符 2.比较运算符 3 ...

  9. select 和 order by

    select 的优先级要高于order by,相当于是select先创建了一个临时表,再通过临时表去排序.所以,对于一些sum()的汇总,在进行排序,实际是排序的select后的字段,而不是表里的那个 ...

  10. js 动态加载select触发事件

    动态加载select后,手动调用一下 subjectChange函数,模拟触发change事件 function hallidChange(value) {$.ajax({type: "po ...

最新文章

  1. EEPlat vs saleforce 配置 Knowledge Article 演示样例
  2. 61种常用JavaScript
  3. Enterprise Library Step By Step系列(一):配置应用程序块——入门篇
  4. 计算机为何如此普遍英语论文,计算机英语论文
  5. java面向字符的输入流_详细解读Java编程中面向字符的输入流
  6. 数据结构思维 第十章 哈希
  7. Python组合数据类型:字典dictionary
  8. android中xmlns的作用
  9. VSCode解决设置默认浏览器方法(open with live server)
  10. 手机语音混响软件_手机混响软件 如何把微信里的语音转发出去 有什么好用的变声软件 安卓微信语音转发插件...
  11. 文章编辑数据结构课程设计
  12. 第一个blog--常用在线网站
  13. nacos启动后CPU使用率过高
  14. 关于网络安全域隔离问题 你真的了解吗?
  15. Java 与 区块链技术_java区块链技术有哪些主要的特点和应用
  16. 月过春枝似带烟的情境里
  17. VOT数据集报错问题
  18. kubectl logs和docker logs输出日志不同的问题
  19. javaweb课程设计网上书店
  20. 服务器价格和性能,戴尔PowerEdge R715 性能与价格的平衡

热门文章

  1. android ios通用OTG,通杀iOS与Android 闪迪两款U盘直插手机实战
  2. DFS与深免在海口观澜湖免税城开设大型高端商场;上海第二家Moxy酒店正式开业 | 美通社头条...
  3. HTML超级链接标记
  4. 关于C#对AutoCad2007二次开发插件工作总结
  5. 获取当前时间戳减去昨天的时间戳
  6. 【转载】深度学习和缠论应用,JQData应用
  7. Unity程序窗口最大化、最小化
  8. C语言三子棋游戏进阶版详解(包括多子棋)
  9. java毕业设计西安财经大学校园一卡通管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  10. C语言实现3des加解密