Linux下C语言多路复用——select函数

本文详细解析了Linux下的C语言多路复用函数select,包括其头文件、函数集、函数原型和参数说明。select函数用于等待多个文件描述符的事件,如数据可读、可写或异常,并在事件发生或超时后唤醒进程。通过FD_ZERO、FD_SET等函数操作文件描述符集合,配合struct timeval结构体设置超时时间。文章还给出了流程图、示例代码和代码解析。
摘要由CSDN通过智能技术生成

select函数解析

select()函数允许进程指示内核等待多个事件(文件描述符)中的任何一个发生,并只在有一个或多个事件发生或经历一段指定时 间后才唤醒它,然后接下来判断究竟是哪个文件描述符发生了事件并进行相应的处理。

头文件:

#include <sys/select.h>
#include <sys/time.h>
struct timeval
{
long tv_sec; //seconds
long tv_usec; //microseconds
};

函数集:

FD_ZERO(fd_set* fds) //清空集合
FD_SET(int fd, fd_set* fds) //将给定的描述符加入集合
FD_ISSET(int fd, fd_set* fds) //判断指定描述符是否在集合中
FD_CLR(int fd, fd_set* fds) //将给定的描述符从文件中删除

函数原型:

int select(int max_fd, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout);

说明: select监视并等待多个文件描述符的属性发生变化,它监视的属性分3类,分别是readfds(文件描述符有数据到来可读)、 writefds(文件描述符可写)、和exceptfds(文件描述符异常)。调用后select函数会阻塞,直到有描述符就绪(有数据可读、可写、 或者有错误异常),或者超时( timeout 指定等待时间)发生函数才返回。当select()函数返回后,可以通过遍历 fdset,来找到 究竟是哪些文件描述符就绪。

参数:
  1. select函数的返回值是就绪描述符的数目,超时时返回0,出错返回-1;

  2. 第一个参数max_fd指待测试的fd的总个数,它的值是待测试的最大文件描述符加1。Linux内核从0开始到max_fd-1扫描文件描述 符,如果有数据出现事件(读、写、异常)将会返回;假设需要监测的文件描述符是8,9,10,那么Linux内核实际也要监测0~7,此时真 正带测试的文件描述符是0~10总共11个,即max(8,9,10)+1,所以第一个参数是所有要监听的文件描述符中最大的+1。

  3. 中间三个参数readset、writeset和exceptset指定要让内核测试读、写和异常条件的fd集合,如果不需要测试的可以设置为 NULL;

  4. 最后一个参数是设置select的超时时间,如果设置为NULL则永不超时;

    注意:

    待测试的描述集总是从0, 1, 2, …开始的。 所以, 假如你要检测的描述符为8, 9, 10, 那么系统实际也要 监测0, 1, 2, 3, 4, 5, 6, 7, 此时真正待测试的描述符的个数为11个, 也就是max(8, 9, 10) + 1

    在Linux内核有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数中,这也意味着select所用到的FD_SET是有限的,也正是这个 原因select()默认只能同时处理1024个客户端的连接请求:
    /linux/posix_types.h:
    #define __FD_SETSIZE 1024

流程图:

在这里插入图片描述

代码:

     /* ARRAY_SIZE(x)可以确定一个数组中的元素个数 */
    #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 
    
    int    i,j;
    int    fds_array[1024];/* 收录文件描述符 */
    int    listenfd,connfd;/* 文件描述符 */
    fd_set rdset;/* 文件描述符的集合 */
    int    maxfd=0; 
    char   buf[1024]; /* 客户端发来的内容(事件) */
    int    rv;
    int    found;

    for(i=0; i<ARRAY_SIZE(fds_array) ; i++)  
    {
              
         fds_array[i]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
select函数Linux C编程中的一种多路复用机制,用于监视并等待多个文件描述符的属性发生变化。它可以同时监视多个文件描述符的可读、可写和异常状态。select函数的原型如下: ```c #include <sys/select.h> int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout); ``` 其中,nfds是待监视的文件描述符的最大值加1,readfds、writefds和exceptfds分别是用于监视可读、可写和异常状态的文件描述符集合。timeout参数指定等待时间,当超过指定时间后,select函数会返回。当select函数返回后,可以通过遍历fd_set集合来确定哪些文件描述符已经就绪。 使用select函数可以实现多个文件描述符的并发处理,提高程序的效率和响应速度。 #### 引用[.reference_title] - *1* [IO多路复用之——select详解](https://blog.csdn.net/weixin_60954394/article/details/127062613)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [LinuxC语言多路复用——select函数](https://blog.csdn.net/qq_45097019/article/details/105166595)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值