tcp网络编程4—并发的io多路复用实现(select)

发布时间 2023-03-22 21:17:26作者: 踏浪而来的人

原型:

  int select(int max fdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

功能:

  委托内核检查描述符集是否准备好(即可以使用)

参数:

  fdp1:最大的fd加1,在三个描述符集(readfds、writefds、wxceptfds)中找出最大的描述符,然后再加1

  readfds、writefds、wxceptfds:指向描述符集的指针。这三个描述符集说明了我们关心的可读、可写、或处于异常条件的各个描述符。

  timeout:指定等待时间

      NULL:永远等待,直到捕捉到信号或文件描述符已经准备好

      具体值:具体等待的时间,若等到超时且描述符集中的文件描述符还没有准备好,就立即返回。

      0:不等待,测试所有指定的描述符并立即返回(不能等到其准备好)

返回值:

  > 0:准备好的文件描述符

  =0:超时了

  < 0(-1):出错

 

传入select的参数是告诉内核:

  我们所关心的描述符;

  对于每个描述符我们所关心的条件(是否可读/可写一个给定的描述符、是否关心一个描述符的异常条件);

  希望等待的时间。

从select返回时内核告诉我们:

  已准备好的描述符数量;

  哪一个文件描述符已准备好读、写或异常条件;

  select函数确定的可用的文件描述符是非阻塞的读写。

 

对文件描述符处理的宏:

  FD_ZERO(fd_set * set);  清除一个文件描述符集

  FD_SET(int fd, fd_set * set);  将一个文件描述符加入到文件描述符集中

  FD_CLR(int fd, fd_set * set);  将一个文件描述符从文件描述符集中清除

  FD_LSSET(int fd, fd_set *set);  测试fd这个文件描述符在文件描述符集中是否可用  

在使用select函数前,先使用FD_SERO和FD_SET来初始化文件描述符集;

在使用select函数时,可循环使用FD_LSSET测试准备好的文件描述符中的某个文件描述符是否可用。

执行完对相关的文件描述符的操作后,用FD_CLR来清除文件描述符