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 变量的所有位初始化为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 机制比较巧妙的功能,我们下次再为大家分享。 APP 访问硬件的 4 种方式:查询,休眠-唤醒,poll方式,异步通知。 这篇文章会详细为大家讲解 select 机制的使用。
文章目录 一、POLL/SELECT 方式的功能: 二、select 机制:
- select 函数原型:
- select 有三种返回值:
- fd_set:
- select 各参数含义: 5.struct timeval: 总结 一、POLL/SELECT 方式的功能: SELECT 机制、POLL 机制是完全一样的,只是 APP 接口函数不一样。
在调用 poll , select 函数时可以 传入“超时时间” ,相当于“定个闹钟”。在这段时间内,如果又数据可读,有空间可写等,就会立即返回,否则等到“超时时间”结束时就会返回错误。
poll, select 函数可以检测 多个文件,多种事件。
二、select 机制:
- select 函数原型: 头文件 :#include <sys/select.h>
函数原型 int select ( int nfds , fd_set * readfds , fd_set * writefds , fd_set * exceptfds , struct timeval * timeout ) ;
- select 有三种返回值: ① 返回 -1 ,表明出错了,出现异常。 ② 返回 0, 最大时间已超时。 ③ 返回 正数,有文件可以提供数据了。
- 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 的信息,则返回真。
- 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