select函数

使用select函数时,可以将多个文件描述符集中到一起统一监视,项目如下:

  • 是否存在套接字接收数据?
  • 无需阻塞传输数据的套接字有哪些?
  • 哪些套接字发生了异常?

使用步骤:

  • 步骤1:
    • 设置文件描述符
    • 指定监视范围
    • 设置超时
  • 步骤2:
    • 调用select函数
  • 步骤3:
    • 查看结果

设置文件描述符

FD_ZERO(fd_set *fdset);             // 从`fdset`所有位初始化为0
FD_SET(int fd, fd_set *fdset);      // 从`fdset`指向的变量中注册文件描述符`fd`的信息
FD_CLR(int fd, fd_set *fdset);      // 从`fdset`指向的变量中清除文件描述符`fd`的信息
FD_ISSET(int fd, fd_set *fdset);    // 若`fdset`指向的变量中包含文件描述符`fd`的信息,则返回“真”

上述函数中,FD_ISSET用于验证select函数的调用结果。

设置检查(监视)范围及超时

#include <sys/select.h>
#include <sys/time.h>

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exeption, const struct timeval *timeout);
/**
 * maxfd:       监视对象文件描述符数量
 * readset:     将所有关注“是否存在带读取数据”的文件描述符注册到`fd_set`
 * writeset:    将所有关注“是否可传输无阻塞数据”的文件描述符注册到`fd_set`
 * exception:   将所有关注“是否发生异常”的文件描述符注册到`fd_set`
 * timeout:     调用`select`后,为防止陷入无限阻塞的状态,传递超时(time-out)信息
*/

成功返回大于0的值,失败则返回-1,超时返回0

select函数用来验证3种监视项的变化情况

struct timeval
{
    long tv_sec;    // second
    long tv_usec;   // microsecond
}