C 编程/POSIX 参考/unistd.h/select
外观
select 是一个 系统调用 和 应用程序编程接口 (API) 用于 类 Unix 和 POSIX 兼容的操作系统,用于检查 文件描述符 的状态,即打开的输入/输出通道。select 系统调用类似于 UNIX System V 及其后来的操作系统中引入的 poll 功能。
在 C 编程语言 源代码中,select 系统调用在头文件 sys/select.h 或 unistd.h 中声明,语法如下
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout);
参数 | 描述 |
---|---|
nfds | 所有集合中最大文件描述符加 1 |
readfds | fd_set 类型,包含要检查是否可读的文件描述符,并在输出中指示哪些文件描述符可读。可以为 NULL。 |
writefds | fd_set 类型,包含要检查是否可写文件描述符,并在输出中指示哪些文件描述符可写。可以为 NULL。 |
errorfds | fd_set 类型,包含要检查是否有待处理的错误条件的文件描述符,并在输出中指示哪些文件描述符有待处理的错误条件。可以为 NULL。 |
timeout | struct timeval 类型结构,指定选择完成的最大等待时间间隔。如果 timeout 参数指向一个成员为 0 的 struct timeval 类型对象,select() 不会阻塞。如果 timeout 参数为 NULL,select() 将阻塞,直到事件导致其中一个掩码返回一个有效(非零)值。 |
fd_set 类型
参数可以使用四个实用程序宏进行操作:FD_SET()、FD_CLR()、FD_ZERO() 和 FD_ISSET()。
Select 返回 readfds、writefds 和 errorfds 中设置的位总数,如果超时则返回 0,如果出错则返回 -1。
select 中使用的文件描述符集的大小是有限的,具体取决于操作系统。更新的系统调用 poll 提供了更灵活的解决方案。