目录
1:select
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
select 函数是 POSIX 标准定义的一个系统调用,用于监视多个文件描述符(file descriptors),以确定它们是否具有可读、可写或异常条件。
1. 参数解释
1: int nfds:这是监视的文件描述符集合中最大的文件描述符加一。也就是说,如果你监视的文件描述符最大是 fd_max,那么你应该将 nfds 设置为 fd_max + 1。
2: fd_set *readfds:这是一个指向 fd_set 结构的指针,该结构包含了你想要监视以检查是否有数据可读的文件描述符集合。如果 NULL,则表示不监视任何读文件描述符。
3: fd_set *writefds:这是一个指向 fd_set 结构的指针,包含了你想要监视以检查是否可写的文件描述符集合。如果 NULL,则表示不监视任何写文件描述符。
4: fd_set *exceptfds:这是一个指向 fd_set 结构的指针,包含了你想要监视以检查是否有异常条件的文件描述符集合。在大多数情况下,这用于检查 OOB(out-of-band,紧急)数据。如果 NULL,则表示不监视任何异常文件描述符。
5: struct timeval *timeout:这是一个指向 timeval 结构的指针,它指定了 select 调用等待文件描述符状态改变的最大时间。
参数 timeout 取值:
• NULL: 则表示 select() 没有 timeout, select 将一直被阻塞, 直到某个文件描述符上发生了事件;
• 0: 仅检测描述符集合的状态, 然后立即返回, 并不等待外部事件的发生。
• 特定的时间值: 如果在指定的时间段里没有事件发生, select 将超时返回。
2. 函数返回值
1: 如果有文件描述符准备好了,select 返回准备好的文件描述符的数量。
2: 如果返回 0 代表在描述词状态改变前已超过 timeout 时间, 没有返回。
3: 当有错误发生时则返回-1, 错误原因存于 errno, 此时参数 readfds, writefds,exceptfds 和 timeout 的值变成不可预测。
错误值可能为:
• EBADF 文件描述词为无效的或该文件已关闭。
• EINTR 此调用被信号所中断。
• EINVAL 参数 n 为负值。
• ENOMEM 核心内存不足。
3. fd_set
其实这个结构就是一个整数数组, 更严格的说, 是一个 "位图"。使用位图中对应的位来表示要监视的文件描述符。
4. fd_set 相关接口
void FD_CLR(int fd, fd_set *set); // 用来清除描述词组 set 中相关fd 的位
int FD_ISSET(int fd, fd_set *set); // 用来测试描述词组 set 中相关fd 的位是否为真
void FD_SET(int fd, fd_set *set); // 用来设置描述词组 set 中相关fd 的位
void FD_ZERO(fd_set *set); // 用来清除描述词组 set 的全部位
5. timeval
5. 常见使用
fd_set readset;
FD_SET(fd,&readset);
select(fd+1,&readset,NULL,NULL,NULL);
if(FD_ISSET(fd,readset)){……}