select、poll、epoll函数详解

本文详细介绍了Linux下select、poll和epoll三种I/O多路复用函数的工作原理及使用,包括概念、描述符集、就绪条件、限制等,特别讨论了它们在处理大量描述符时的性能差异和适用场景。
摘要由CSDN通过智能技术生成

1.select 函数

该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。

1.1 概念

#include <select.h>
int select(int maxfdp1,  fd_set *readset,  fd_set *writeset,  
		   	fd_set *exceptset,  const struct timeval *timeout);

返回值:若有就绪描述符则为其数目,若超时则返回0,出错返回-1。
参数1: maxfdp1 指定待测试的描述符个数。 它的值是待测试的最大描述符加1,描述符从0开始。//命名的来由max fd plus 1,最大的fd+1
PS:存在这个参数纯粹是为了效率原因。每个fd_set都有表示大量描述符(典型值1024)的空间,但是一个普通的进程所用的数量确少很多。所以内核通过在进程和内核之间不复制描述符集中不必要的部分,从而不测试总为0的那些位来提高效率。
参数2: readset、writeset、exceptset 是指定让内核测试读、写、异常条件的描述符,如果对其中某个描述符不感兴趣可以设为空指针。
参数3: timeout 告知内核等待所指定描述符中的任何一个就绪可花多长时间。

struct timeval {
long tv_sec; /* seconds /
long tv_usec; /
microseconds */
} 该参数有三种可能:
1.永远等待下去:仅在有一个描述符准备好I/O时才返回,将其设为空指针;
2.等待一段固定时间:在有一个描述符准备好I/O时返回,但是不超过由该参数所指向的timeval结构中指定的秒数和微秒数;
3.根本不等待:检查描述符后立即返回,这就是轮询。为此,该参数必须指向一个timeval结构,但是其中的值必须设置为0。

1.2 描述符集

主要关注的是中间的三个参数,这里引入一个问题:怎么给它们仨指定一个或者多个描述符值?
select使用描述符集,通常是一个整数数组,其中每个整数中的每一位对应一个描述符。

举例说明:

使用32位整数,则数组第一个元素a[0]对应描述符0~31位,第二个元素a[1]对应描述符32 ~ 63位,以此类推……

具体的代码实现:
使用以下select提供的四个函数。

void FD_ZERO(fd_set *fdset);	//clear all bits in fdset ---清空fdset中的所有位
void FD_SET(int fd, fd_set *fdset);	//turn on the bit for fd in fdset ---在fdset中打开fd的对应位 
void FD_CLR(fd_set *fdset
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
selectpollepollLinux下的三种I/O多路复用机制。 select是最古老的一种,它通过轮询的方式来检查多个文件描述符是否处于就绪态。当文件描述符就绪时,select会通知应用程序进行读操作。然而,在连接数少并且连接都十分活跃的情况下,select的性能可能不如其他两种。因为select的通知机制需要回调多个函数,这会导致性能下降。 pollselect的改进版本,它也是通过轮询的方式来检查文件描述符的就绪态。和select不同的是,poll使用了结构体数组来传递文件描述符信息,减少了函数调用的次数。但是,随着文件描述符数量的增加,poll的效率会线性降低。 而epoll是最新的一种I/O多路复用机制,它采用了回调机制。当文件描述符就绪时,epoll会通过回调机制直接调用相应的回调函数,减少了函数调用的开销。与selectpoll相比,epoll在大量活跃的文件描述符情况下具有更好的性能,因为它的效率不受文件描述符数量的影响。使用epoll需要先调用epoll_create()函数创建一个epoll的句柄,然后将需要监视的文件描述符添加到epoll中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [selectpollepoll详解](https://blog.csdn.net/u010306832/article/details/119942290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [selectpollepoll详解](https://blog.csdn.net/fengyuyeguirenenen/article/details/124234675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值