select
select 模块提供了 I/O 多路复用机制,允许进程同时监视多个文件描述符的可读、可写及异常状态,并支持设置超时等待。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| select | 监视多个文件描述符的状态变化,等待其中一个或多个描述符变为可读、可写或异常 |
Functions
select
int select (int, fd_set *__restrict, fd_set *__restrict, fd_set *__restrict, struct timeval *__restrict)
头文件清单
功能说明
- 监视多个文件描述符,等待其中一个或多个描述符变为可读、可写或出现异常条件
- 用户需要保证待监测的文件描述符为小于FD_SETSIZE的正值,否则可能产生不确定的行为
- 支持设置超时时间,当指定时间内无就绪描述符时返回
前置条件
- 调用时序约束:待监测的文件描述符必须已通过open()等接口成功打开
- 依赖关系:依赖poll()接口实现内部逻辑
- 运行上下文限制:用户需要保证待监测的文件描述符为小于FD_SETSIZE的正值
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| nfds | int | 待监测的文件描述符集合中最大文件描述符编号加1 | >= 0 |
| readfds | fd_set *__restrict | 监测可读事件的文件描述符集合 | NULL或有效的fd_set指针 |
| writefds | fd_set *__restrict | 监测可写事件的文件描述符集合 | NULL或有效的fd_set指针 |
| exceptfds | fd_set *__restrict | 监测异常事件的文件描述符集合 | NULL或有效的fd_set指针 |
| timeout | struct timeval *__restrict | 超时时间,NULL表示无限等待 | NULL或有效的timeval指针 |
返回值
返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 超时返回 | 指定时间内无就绪描述符 |
| >0 | 就绪描述符数量 | 一个或多个描述符就绪 |
| -1 | 执行失败 | nfds为负值或其他错误 |
Structures
fd_set
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| fds_bits | unsigned long[] | 文件描述符位图数组,每一位对应一个文件描述符的状态 |
Macros
FD_SETSIZE
FD_ZERO
#define FD_ZERO(s) do { int __i; unsigned long *__b=(s)->fds_bits; for(__i=sizeof (fd_set)/sizeof (long); __i; __i--) *__b++=0; } while(0)