select 机制

简介: SELECT 机制、POLL 机制是完全一样的,只是 APP 接口函数不一样。在调用 poll , select 函数时可以 传入“超时时间” ,相当于“定个闹钟”。在这段时间内,如果又数据可读,有空间可写等,就会立即返回,否则等到“超时时间”结束时就会返回错误。poll, select 函数可以检测 多个文件,多种事件。

一、POLL/SELECT 方式的功能:


SELECT 机制、POLL 机制是完全一样的,只是 APP 接口函数不一样。


在调用 poll , select 函数时可以 传入“超时时间” ,相当于“定个闹钟”。在这段时间内,如果又数据可读,有空间可写等,就会立即返回,否则等到“超时时间”结束时就会返回错误。


poll, select 函数可以检测 多个文件,多种事件。


二、select 机制:


1. select 函数原型:

头文件 :#include <sys/select.h>


函数原型

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

2. select 有三种返回值:

① 返回 -1 ,表明出错了,出现异常。

② 返回 0, 最大时间已超时。

③ 返回 正数,有文件可以提供数据了。


3. fd_set:

fd_set 是一组文件描述符 ( fd ) 的集合,实际上是一个 long 类型的数组,它用一位表示一个 fd 。


现在,UNIX系统中通常会定义常量 FD_SETSIZE 来表示 fd_set 的描述符数量。其值通常是1024,这样就能表示1024个fd。


fd_set FDs;
1
typedef __kernel_fd_set  fd_set;
1
#define __FD_SETSIZE  1024
typedef struct {
  unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
} __kernel_fd_set;


我们可以使用以下四个宏来操作 fd_set :

FD_ZERO(fd_set* fdset): 对其进行初始化, 将指定的文件描述符集清空, fd_set 变量的所有位初始化为0。
FD_SET(int fd, fd_set* fdset):在文件描述符集合 fdset 中增加一个新的文件描述符 fd , 注册文件描述符 fd 的信息。
FD_CLR(int fd, fd_set* fdset):在文件描述符集合 fdset 中删除一个文件描述符 fd。
FD_ISSET(int fd, fd_set* fdset):测试指定的文件描述符 fd 是否在该集合 fdset 中,包含文件描述符 fd 的信息,则返回真。


4. select 各参数含义:

① nfds :所有文件描述符中的最大值 +1.

② readfds :需要检测的 可读 文件描述符的集合。

③ writefds :需要检测的 可写 文件描述符的集合。

④ exceptfds :需要检测的 异常 文件描述符的集合。

⑤ timeout :最大 超时时间 。


5.struct timeval:

struct timeval 结构体用于指定更精确的时间值,秒,微妙。


struct timeval {
  __kernel_time_t  tv_sec;  /* seconds */
  __kernel_suseconds_t  tv_usec;  /* microseconds */
};


总结

一般 POLL 机制的使用较多,但是 SELECT 机制也是比较重要的,还有一些SELECT 机制比较巧妙的功能,我们下次再为大家分享。


相关文章
|
安全 虚拟化
GIC规格学习(一)
GIC规格学习(一)
469 0
|
移动开发 JavaScript 安全
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
701 0
|
网络安全 数据安全/隐私保护 XML
2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP
2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP
2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
|
运维 网络协议 Shell
第十七章 Python网络编程
第十七章 Python网络编程
|
存储 缓存 分布式计算
Spring-retry 使用指南
该项目为Spring应用程序提供声明式重试支持,它用于Spring Batch、Spring Integration、Apache Hadoop的Spring(以及其他),命令式重试也支持显式使用。
2159 0
Spring-retry 使用指南
|
JavaScript 前端开发 数据安全/隐私保护
JavaScript 实现的base64加密、md5加密、sha1加密及AES加密
1. Base64加密 1). js-base64 2). 安装 npm install --save js-base64 3). 使用 // 加密 var str = Base64.
2760 0
|
XML PHP 数据安全/隐私保护
phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
转:http://www.cnblogs.com/huangcong/p/3687665.html   首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.
2091 0
|
Python
Python 文件读写操作区别案例(r、r+、rb、w、w+、wb、a、a+、ab)
Python 文件读写操作区别案例(r、r+、rb、w、w+、wb、a、a+、ab)
642 0
|
算法 C++
买卖股票的最佳时机(C++)
买卖股票的最佳时机(C++)
123 0