跳转至

select

select 模块提供了 I/O 多路复用机制,允许进程同时监视多个文件描述符的可读、可写及异常状态,并支持设置超时等待。

头文件清单

#include "open_source/musl/include/sys/select.h"

接口清单

接口名称 功能简述
select 监视多个文件描述符的状态变化,等待其中一个或多个描述符变为可读、可写或异常

Functions

select

int select (int, fd_set *__restrict, fd_set *__restrict, fd_set *__restrict, struct timeval *__restrict)

头文件清单

#include "open_source/musl/include/sys/select.h"

功能说明

  • 监视多个文件描述符,等待其中一个或多个描述符变为可读、可写或出现异常条件
  • 用户需要保证待监测的文件描述符为小于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

typedef struct {
    unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)];
} fd_set;

成员说明

成员名称 数据类型 描述
fds_bits unsigned long[] 文件描述符位图数组,每一位对应一个文件描述符的状态

Macros

FD_SETSIZE

#define FD_SETSIZE 1024

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)

FD_SET

#define FD_SET(d, s)   ((s)->fds_bits[(d)/(8*sizeof(long))] |= (1UL<<((d)%(8*sizeof(long)))))

FD_CLR

#define FD_CLR(d, s)   ((s)->fds_bits[(d)/(8*sizeof(long))] &= ~(1UL<<((d)%(8*sizeof(long)))))

FD_ISSET

#define FD_ISSET(d, s) !!((s)->fds_bits[(d)/(8*sizeof(long))] & (1UL<<((d)%(8*sizeof(long)))))