【Linux】多路转接select

一、select介绍

1.1 初始select

系统提供的select函数来实现多路复用输入/输出模型。

  • select系统调用是用来让我们的程序监视多个文件描述符的状态变化的
  • 程序会停止在select这里等待,直到被监视的文件描述符有一个或者多个发生了状态改变

       IO = 等 + 拷贝,select函数只负责进行对fd进行等待,有时间就绪,就进行事件的派发,这里可以同时对多个fd进行等待。

1.2 认识一下select函数

函数原型:

【Linux】多路转接select_第1张图片

函数参数:

  • nfds:需要监视的最大的文件描述符值 + 1
  • rdset/wrset/exset:分别对应于需要检测可读文件描述符的集合,可写文件描述符的集合以及异常文件描述符的集合。其结构是使用位图形式,位图中比特位的位置表示的是文件描述符的值,比特位的值:0表示的是不关心的文件描述符,1表示的是关心的文件描述符。
  • timeout:其结构为timeval,用来设置select()的等待时间

函数功能:

       在多路复用中,select函数用于监控多个文件描述符,以便在这些描述符上的某些事件(比如可读,可写或者异常条件)发生时进行处理:

  • 等待事件:可以等待直到一个或者多个文件描述符变得可读、可写或者发生异常
  • 非阻塞监控:它允许程序在多个文件描述符之间进行选择,而不是阻塞在单一操作中
  • 提高效率:可以有效地处理大量并发连接,避免了使用线程或者进程池来处理每一个连接的开销

函数返回值:

  • 执行成功,则返回文件描述符状态已经改变的个数
  • 如果返回0,则代表在文件描述符状态改变前已经超过timeout时间了,没有返回
  • 当有错误发生时,则返回-1,错误原因存在于errno,此时参数readfds,writefds,exceptfds和timeout的值变得不可预测

错误值可能为:

  • EBADF:文件描述符为无效的或者该文件已经关闭
  • EINTR:此调用被信号所中断
  • EINVAL:参数n为负值
  • ENOMEM:核心内存不足

参数timeout的取值:

  • NULL:表示select()没有timeout,select函数将一直被阻塞,直到某一个文件描述符发生了事件,即阻塞IO
  • 0:仅仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生,即非阻塞IO
  • 特定的时间值:如果在指定的时间段里没有事件的发生,select函数将超时返回

关于timeval结构

       timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发送则函数返回,返回值为0。

你可能感兴趣的:(Linux操作系统,linux,select,多路复用,select服务器)