select 机制

举报
糖果罐子 发表于 2023/07/21 20:00:29 2023/07/21
【摘要】 APP 访问硬件的 4 种方式:查询,休眠-唤醒,poll方式,异步通知。这篇文章会详细为大家讲解 select机制的使用。@TOC 一、POLL/SELECT 方式的功能:SELECT 机制、POLL 机制是完全一样的,只是 APP 接口函数不一样。在调用 poll , select 函数时可以 传入“超时时间” ,相当于“定个闹钟”。在这段时间内,如果又数据可读,有空间可写等,就会立即返...

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 变量的所有位初始化为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 机制比较巧妙的功能,我们下次再为大家分享。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。