首页 > 其他分享 >select 机制

select 机制

时间:2023-09-11 21:34:09浏览次数:51  
标签:文件 set 描述符 fdset fd 机制 select

select 机制 9/100 发布文章 wuyiyu_ 未选择文件

APP 访问硬件的 4 种方式:查询休眠-唤醒poll方式异步通知。 这篇文章会详细为大家讲解 select 机制的使用。

@TOC


一、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;
typedef __kernel_fd_set		fd_set;
#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 变量的所有位初始化为0FD_SET(int fd, fd_set* fdset):在文件描述符集合 fdset增加一个新的文件描述符 fd , 注册文件描述符 fd 的信息。 FD_CLR(int fd, fd_set* fdset):在文件描述符集合 fdset删除一个文件描述符 fdFD_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 机制比较巧妙的功能,我们下次再为大家分享。 APP 访问硬件的 4 种方式:查询,休眠-唤醒,poll方式,异步通知。 这篇文章会详细为大家讲解 select 机制的使用。

文章目录 一、POLL/SELECT 方式的功能: 二、select 机制:

  1. select 函数原型:
  2. select 有三种返回值:
  3. fd_set:
  4. select 各参数含义: 5.struct timeval: 总结 一、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 ) ;

  1. select 有三种返回值: ① 返回 -1 ,表明出错了,出现异常。 ② 返回 0, 最大时间已超时。 ③ 返回 正数,有文件可以提供数据了。
  2. fd_set: fd_set 是一组文件描述符 ( fd ) 的集合,实际上是一个 long 类型的数组,它用一位表示一个 fd 。

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

fd_set FDs; typedef __kernel_fd_set fd_set; #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 的信息,则返回真。

  1. 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 机制比较巧妙的功能,我们下次再为大家分享。

Markdown 1552 字数 86 行数 当前行 1, 当前列 0HTML 1415 字数 44 段落

标签:文件,set,描述符,fdset,fd,机制,select
From: https://blog.51cto.com/u_16159289/7438556

相关文章

  • java异常处理的三种机制
    一、try-catch-finally语句(推荐)try{//可能出现异常的代码}catch(Exceptione){//处理异常的代码}finally{//无论是否出现异常都会执行的代码}try-catch-finally语句是Java中最基本也是最常用的异常处理方法。它包含三个部分:try、catch和fin......
  • TTL机制实现延迟消息
              ......
  • Linux多线程同步机制(下)
    @TOC前言一、读写锁多线程同步机制中的读写锁(Read-WriteLock)是一种特殊的锁机制,用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源,但在写操作时需要独占访问。读写锁的基本原则是:多个线程可以同时获取读锁,但只有一个线程可以获取写锁。当有线程持有写锁时,其他线......
  • 七、Nginx缓存机制
    对于性能优化而言,缓存是一种能够大幅度提升性能的方案,因此几乎可以在各处都能看见缓存,如客户端缓存、代理缓存、服务器缓存等等,Nginx的缓存则属于代理缓存的一种。对于整个系统而言,加入缓存带来的优势额外明显:减少了再次向后端或文件服务器请求资源的带宽消耗。降低了下游服务器的......
  • select远程搜索
    <template><el-selectv-model="value"multiplefilterableremotereserve-keywordplaceholder="请输入关键词":remote-method="remoteMethod":loading="loading"><el-option......
  • select创建条目
    <template><el-selectv-model="value"multiplefilterableallow-createdefault-first-optionplaceholder="请选择文章标签"><el-optionv-for="iteminoptions":key="item.va......
  • select可搜索下拉框
    <template><el-selectv-model="value"filterableplaceholder="请选择"><el-optionv-for="iteminoptions":key="item.value":label="item.label":value="item.v......
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!
    0前言注册中心不应仅提供服务注册和发现功能,还应保证对服务可用性监测,对不健康的服务和过期的进行标识或剔除,维护实例的生命周期,以保证客户端尽可能的查询到可用的服务列表。因此本文介绍Nacos注册中心的健康检查机制。1注册中心的健康检查机制知道⼀个服务是否还健康的方式:客户......
  • JavaSE--反射机制
    一、反射机制  java.lang.reflect.*;1、反射机制的作用  通过java语言中的反射机制可以操作字节码文件,可以读和修改字节码文件。  通过反射机制可以操作代码片段(class文件)2、反射机制相关的类  java.lang.Class:代表整个字节码,代表一个类型,代表整个类  java.lang.......
  • Python中的异常处理机制
    finally语句是Python中异常处理机制的一部分,它总是会被执行,无论是否发生异常。finally语句通常用于释放资源或执行清理操作。下面是一个简单的例子:try:#代码段1passexceptExceptionType:#代码段2passelse:#代码段3passfinally:#代码段4......