首页 > 其他分享 >IO多路复用

IO多路复用

时间:2024-07-21 21:18:10浏览次数:11  
标签:timeout 多路复用 listenfd fds fd IO 集合 select

IO多路复用

select系统调用

维护的是一个文件描述符集合,监测这些fd集合。

#include <sys/select.h> // 头文件

运行机制

将文件描述符集合复制到内核空间,然后对其进行遍历,查看可读,可写,错误事件,返回就绪事件总数。

select函数

select函数调用时需要五个参数,包括文件描述符集合总数nfds(最大是1024个),底层fd集合是数组实现的,fdset是比特位的集合。可读集合read_fds,可写集合write_fds,异常集合excep_fds,超时时间timeout。返回值是所有就绪事件的数量和。

fd_set fds, read_fds, write_fds, excep_fds; // fds是应用层,而其它三个都是内核层要进行操作的。
struct timeval timeout;
FD_ZERO(fds); // 首先所有标志位置0
FD_SET(listenfd, fds); // 将代表listenfd的进行置1
int maxfd = listenfd;
struct time_val timeout; // 如果为NULL,设定一直阻塞等待
timeout.tv_sec = 5; // 等待5s, 5s事件就继续执行
timeout.tv_usec = 0;
struct sockaddr_in client;
bezero(&client, sizeof(client));
socklen_t len = sizeof(client);
while(1){
    read_fds = fds;
	int nready = select(nfds, &read_fds, &write_fds, &excep_fds, &timeout); // 首先拿到这个,接下来就是处理这些集合,select会修改可读可写异常标志位
    if(FD_ISSET(listenfd, &read_fds)) {  // 考虑是否listenfds可读
        int clientfd = accept(listenfd, (struct sockaddr*)&client, &len);
        FD_SET(clientfd, fds); // 设置标志位,fds
        if(clientfd > maxfd) maxfd = clientfd; // 这一步问题是解决回收连接之后的问题。
    }
    // 循环对fd集合进行读
    for(int i = listenfd + 1; i < maxfd+1; ++i){
        char buffer[1024] = {0};
        int n = recv(i , buffer, 1024, 0);
        if(n == 0){
            close(i);
            FD_CLR(i, &fds);
            break;
        }
    }
}

注意

  1. fd阻塞和select阻塞不同,select只是分辨fd不会阻塞于读和写就行。
  2. select一般限制最多fd大小为1024

poll系统调用

标签:timeout,多路复用,listenfd,fds,fd,IO,集合,select
From: https://www.cnblogs.com/solicit/p/18314965

相关文章

  • CS50P: 7. Regular Expressions
    RegularExpressions/Regexes判断用户是否输入邮箱地址......
  • Microsoft Endpoint Manager(MEM)是微软的一体化端点管理平台,结合了Microsoft Intune和C
    MicrosoftEndpointManager(MEM)是微软的一体化端点管理平台,结合了MicrosoftIntune和ConfigurationManager(SCCM),为企业提供跨设备、跨平台的终端管理和安全性管理能力。主要特点和功能包括:统一管理控制台:MEM提供了统一的管理控制台,使IT管理员可以从一个地方管理和监控企业中的......
  • MCM: Masked Cell Modeling for Anomaly Detection in Tabular Data(论文研读)
    Notice:此篇文章为论文精读。Paper来源:点我跳转Abstract解决了表格数据(即结构化数据)中的异常检测问题——通常由one-class分类(只有一个类别或类别的样本集用于训练模型。通常,这个类别包含所谓的正常或良性样本,而异常样本或异常类别是未知的或未在训练数据中包含的)设置实现......
  • IO流超级详细内容!
    IO流(非常重要)概述IO流的分类总体来看,只是传输时的单位不同IO流的体系字节输入流:FileInputStream读单个字节InputStreamr=newFileInputStream("F:\\JavaEE\\api_learning\\api_learning\\src\\main\\java\\IO\\a.txt");intb;//记录每次读取返回的......
  • MySQL入门学习-SQL高级技巧.Window Function
        在MySQL中,窗口函数(WindowFunction)是一种强大的分析工具,它可以在查询结果的基础上进行更复杂的计算和分析。一、窗口函数的概念:    窗口函数可以对查询结果的每一行数据,根据指定的分区(Partition)和排序规则(Order)进行计算。它可以在同一查询中同时返回基础......
  • Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  无前言  只要装过各种系统的人都或多或少会接触到UEFI或者BIOS这样的概念。本文也不会对这些概念进行详解,本文主要把这些概念串起来,并引入MOK(Mach......
  • Instruction和Question的区别和联系
    Instruction和Question的区别和联系https://blog.csdn.net/qq_35082030/article/details/1307270163.Question和Instruction的区别问答(QA)和指令(Instruction)是人机交互中最常见的形式之一。QA是指一问一答的形式,通常是用户提问,模型给出回答。而Instruction则源自于PromptEngin......
  • C#中的Action
            C#中的Action是一种委托类型,‌用于引用不返回值的方法。‌Action可以接受0到16个参数,‌并且不返回任何值。‌它是一种通用的委托类型,‌非常方便用于处理不同参数和不同函数签名的情况。‌Action的用法包括声明Action委托类型、‌创建Action实例并赋值给委托变......
  • 解决: Cannot load information for github.com
    问题在共享项目至idea时候出现:IamgettingthiserrorwhilesharingonGithHubinIntellijeIDEA:Cannotloadinformationforgithub.com/:Requestresponse:Accesstothissitehasbeenrestricted.Ifyoubelievethisisanerror,pleasecontacthttps://suppor......
  • GGR273Smart Cities Bike Sharing Locations
    GGR273Lab1:SmartCities–BikeSharingLocationsLab 1:Analyzing BicyclingParking Locations inToronto(15%)Due:July 19th 2024@ 11:59 pm ESTthroughtheQuizzestabSubmitthrough Lab 1and answerquestionsandsubmitfile(.jpeg ofyour......