国内可以做网页的网站/百度客户端在哪里打开

国内可以做网页的网站,百度客户端在哪里打开,广州 营销型网站建设公司,html5高端网站建设织梦模板代码:https://gitee.com/nanyi-c/linux/tree/master/day50 一、I/O多路转接之select 1.初始select 系统提供select函数来实现多路复用输入/输出模型 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的程序会停在select这里等待,直到被…

代码:https://gitee.com/nanyi-c/linux/tree/master/day50

一、I/O多路转接之select

1.初始select

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

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

2.select函数原型

select 是一个在 Unix 和类 Unix 操作系统中的系统调用,用于监控多个文件描述符,等待其中一个或多个文件描述符变得“就绪”。就绪可以意味着可读、可写或者发生异常

在这里插入图片描述

参数说明

参数描述
nfds这是你监控的文件描述符集(readfds、writefds、exceptfds)中最高文件描述符的编号加1。简单来说,它是监控的文件描述符范围的上限
readfds输入输出型参数,只关心读事件
writefds输入输出型参数,只关心写事件
exceptfds输入输出型参数,只关心异常事件
timeout输入输出型参数,设置为 NULLselect 将无限期阻塞,直到至少有一个文件描述符就绪。如果 timeout 设置为非 NULL 值,它将在指定的秒数和微秒数后超时

在这里插入图片描述

以下是 timeval 结构体的定义:

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

struct timeval {long    tv_sec;         /* seconds */long    tv_usec;        /* microseconds */
};

select 调用的返回值和含义如下:

  • 返回值大于0:表示就绪的文件描述符数量。输入输出型参数
  • 返回0:表示超时发生,没有文件描述符就绪。
  • 返回-1:表示出错,并且设置 errno 来指示错误类型。

错误值可能为:

  • EBADF 文件描述词为无效的或该文件已关闭

  • EINTR 此调用被信号所中断

  • EINVAL 参数n为负值

  • ENOMEM 核心内存不足

常见的程序片段如下:
fs_set readset;
FD_SET (fd, &readset);
select(fd+1, &readset, NULL, NULL, NULL) ;
if(FD_ISSET (fd, readse) ([....}

1.select要正常工作,需要借助一个辅助数组,来保存所有合法fd

2.每次使用都要重置

3.就绪了,循环检测处理所有事件

关于fd_set结构

在Linux系统中,fd_set 是一个数据结构,用于表示一组文件描述符的集合。它通常与 select 系统调用一起使用,以便同时监控多个文件描述符的状态(是否可读、可写或有异常发生)。

fd_set 是一个固定大小的位掩码,其中每一位代表一个文件描述符。在内部,它通常是一个长整型数组,数组中的每个元素代表一定范围内的文件描述符。由于 fd_set 的大小是固定的,所以它有一个最大文件描述符的限制,这个限制在 Linux 系统中通常是 FD_SETSIZE(通常定义为 1024)。

在这里插入图片描述

常见宏操作

  • FD_ZERO(fd_set *set):将 fd_set 清零,即初始化 fd_set,使其不包含任何文件描述符。
  • FD_SET(int fd, fd_set *set):将指定的文件描述符 fd 添加到 fd_set 集合中。
  • FD_CLR(int fd, fd_set *set):从 fd_set 集合中移除指定的文件描述符 fd
  • FD_ISSET(int fd, fd_set *set):检查指定的文件描述符 fd 是否在 fd_set 集合中。这个宏在 select 调用后使用,以确定哪些文件描述符已经就绪。

3.理解select执行过程

理解 select 模型的关键在于理解 fd_set,为说明方便,取 fd_set 长度为 1 字节,fd_set 中的每一 bit 可以对应一个文件描述符 fd,则 1 字节长的 fd_set 最大可以对应 8 个 fd。

  • 执行 fd_set set; FD_ZERO(&set); 则 set 用位表示是 0000,0000。
  • 若 fd=5,执行 FD_SET(fd,&set); 后 set 变为 0001,0000(第 5 位置为 1)。
  • 若再加入 fd=2,fd=1,则 set 变为 0001,0011。
  • 执行 select(6,&set,0,0,0) 阻塞等待。
  • 若 fd=1,fd=2 上都发生可读事件,则 select 返回,此时 set 变为 0000,0011

注意 :没有事件发生的 fd=5 被清空。

4.socket就绪条件

读就绪
  • socket 内核中,接收缓冲区中的字节数,大于等于低水位标记 SO_RCVLOWAT,此时可以无阻塞的读取该文件描述符,并且返回值大于 0。
  • socket TCP 通信中,对端关闭连接,此时对该 socket 读,则返回 0。
  • 监听 socket 上有新的连接请求。
  • socket 上有未处理的错误。
写就绪
  • socket 内核中,发送缓冲区中的可用字节数(发送缓冲区的空闲位置大小),大于等于低水位标记 SO_SNDLOWAT,此时可以无阻塞的写,并且返回值大于 0。
  • socket 的写操作被关闭(close 或者 shutdown),如果此时进行写操作的话,会触发 SIGPIPE 信号。
  • socket 使用非阻塞 connect 连接成功或失败之后,socket 上有未读取的错误。
异常就绪
  • socket上收到带外数据,关于带外数据,和TCP紧急模式相关(回忆TCP协议头中,有一个紧急指针的字段)

二、SelectServer.hpp

1.基础框架

在这里插入图片描述

2.设计Loop

在这里插入图片描述

测试

每隔3s轮询一次

在这里插入图片描述

如果设置为nullptr,那么就永久阻塞式等待,直到有新链接

在这里插入图片描述

无论哪种方式我们建立链接时,服务器会疯狂输出,这是因为我们还没有对收到新链接后怎么做

如果事件就绪,但是不处理,select会一直通知我,直到我处理了

在这里插入图片描述

我们重新设置一下

在这里插入图片描述

此时便不会疯狂输出,还会显示剩余时间

在这里插入图片描述

时间就绪后就可以处理事件了,在rfds内

因为rfds是输入输出型参数,这里已经返回了哪些事已经就绪的

在这里插入图片描述

处理事件

首先我们要判断我们的文件描述符是不是就绪的,如果是,就可以建立连接了

在这里插入图片描述

测试

在这里插入图片描述

已经获得了一个新的sockfd

接下来我们可以读取吗?绝对不能读!读取的时候,条件不一定满足(建立连接–》不发请求,(底层没有数据)读的时候被阻塞,单进程绝对挂掉)

谁最清楚底层fd的数据是否就绪了呢??通过select!

想办法把新的fd添加给select,由select统一进行监管。

select 为什么等待的fd会越来越多??

只要将新的fd,添加到fd_array中即可

初始化数组,并且把0号位给listen套接字

在这里插入图片描述

重新设计Loop,并且找到最大的文件fd,使用for循环可以处理多个文件描述符,进行动态更新和确定最大文件描述符

在这里插入图片描述

添加一个debug函数便于我们调试以及查看信息

在这里插入图片描述

HandlerEvent函数负责检测哪些文件描述符就绪,并根据它们是监听套接字还是普通套接字来调用相应的处理函数。

处理新链接,并把新链接的fd添加到fd_array中

在这里插入图片描述

处理普通fd就绪 进行IO

在这里插入图片描述

测试

在这里插入图片描述

三、select总结

小结:

  • select要正常工作,需要借助一个辅助数组,来保存所有合法fd
  • 每次使用都要重置
  • 就绪了,循环检测处理所有事件

缺点

  • 每次调用 select,都需手动设置 fd 集合,从接口使用角度来说也非常不便。
  • 每次调用 select,都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大。
  • 同时每次调用 select 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大。
  • select 可监控的文件描述符数量太少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年中国家电零售与创新趋势解析:以旧换新国补激活需求,AI 技术渗透至研发、供应链、营销

一、产业环境:政策驱动与技术变革下的挑战与机遇 在全球经济波动与国内消费转型的双重背景下,中国家电产业正经历前所未有的变革。2024 年,家电行业面临的 “三座大山”—— 短期消费信心低迷、中期房地产降温、长期人口下行压力 —— 持续施…

【大模型基础_毛玉仁】4.1 参数高效微调简介

目录 4 参数高效微调4.1 参数高效微调简介4.1.1 下游任务适配1)上下文学习(In-context learning)2)指令微调(Instruction Tuning) 4.1.2 参数高效微调4.1.3 参数高效微调的优势 4 参数高效微调 大语言模型…

Postman使用02、断点、fiddler弱网测试

脚本操作 一、脚本导出 1.导出json脚本 2.打包json文件 3.下载的文件 二 .导入脚本 1.选择文件 2.点击导入 3.导入的接口 三.多接口运行 1.集合右键,点击run ,运行多个接口 2.编辑环境,集合,执行次数等 3.运行多个接口 四.运行…

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一:连接数过小情况二:Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么?MySQL 查询慢,我们一般也会想到是因为索引,但除了索引还有哪些原因会导致数据库查询变慢呢? 以下以 MySQL 中一条 S…

【操作系统】进程三种状态?进程间状态的切换?挂起态?

进程状态 进程的五种(三种)状态: 新建(New):进程刚被创建,尚未加入到就绪队列;就绪(Ready):进程已获得除CPU外的所有资源,等待被调度执…

计算机控制系统的最小拍控制器设计及仿真分析

1题目 开环传递函数 G(s) 2/(s(0.5s1)) ,采样周期 T0.5 秒,设计单位速度输入下的最小拍控制器 1.1 方法1 根据课本中的步骤,最小拍控制器的设计步骤如下: 1. 确定对象的离散传递函数G(z),并确定其零极点。 2. 确定…

哈希--哈希桶

哈希桶是哈希表(散列表)中的一个概念,是哈希表数组中的每个元素 ,用于存储键值对数据。它有以下特点和相关要点: 结构与原理:哈希表底层常由数组构成,数组的每个元素即哈希桶。通过哈希函数计算…

Linux多线程详解

Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…

多路转接Poll

在之前我们讲过select是最古老的多路转接方案,古老就意味着他不是很方便使用,他需要用户手动保存fd_set这个位图结构,来表示读写事件的关注与否或者就绪性。 而且由于fd_set的大小是固定的,这就意味着他能管理的套接字文件描述符是…

多层感知机的简洁实现

《动手学深度学习》-4.3-笔记 import torch from torch import nn from d2l import torch as d2l 导入必要的库和模块 net nn.Sequential(nn.Flatten(),nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10))def init_weights(m):if type(m) nn.Linear:nn.init.normal_(m.we…

【GoLang】调用llm时提示词prompt的介绍以及使用方式

介绍 提示词是一种与大模型交互的对话格式,它以 JSON 格式定义了一个消息列表(messages),包含了系统消息和用户消息。 我们向AI提问时,其实发给AI的都是提示词,别看我们只是简单输入了一句话,…

区间端点(java)(贪心问题————区间问题)

deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到,这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组,每一个一维…

Qt事件处理(处理鼠标事件、键盘事件、定时器事件、窗口移动和大小变化事件)

事件处理 事件是应用程序内部或者外部产生的事情或者动作的统称。 在 Qt 中,事件是用一个对象来管理一个事件的。所有的事件对象都继承自抽象类 QEvent 。事件包括鼠标事件、键盘事件等,发出自 Qt 或操作系统本身。 处理事件一般通过重写相关的 Event 函…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统,支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

cfca 申请国密证书流程

之前给某银行开发项目,需要用到cfca国密双证证书,证书类型为企业双证的作为接口加密的密钥。 因为是第一次对接,其中走了不少的弯路,现将申请的流程发布出来做下记录 1、需要找到cfca的相关人员进行测试证书的申请 2、大概1天的…

基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

数字孪生技术如何为制造业开辟新天地?

1. 数字孪生在制造业的崛起背景 1.1 数字孪生的概念演进 “数字孪生”(Digital Twin)一词最早由美国密歇根大学Michael Grieves博士在2002年提出,但当时并未称之为“数字孪生”,而是以“信息镜像模型”描述数字世界与物理世界的映射关系。直到2010年前后,美军、NASA等在…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现: 电商物流网络在订单履约中由多个环节组成,图1是一个简化的物流网络示意图。其中,分拣中心作为网络的中间环节,需要将包按照不同流…

鸿蒙Flutter开发故事:不,你不需要鸿蒙化

在华为牵头下,Flutter 鸿蒙化如火如荼进行,当第一次看到一份上百个插件的Excel 列表时,我也感到震惊,排名前 100 的插件赫然在列,这无疑是一次大规模的军团作战。 然后,参战团队鱼龙混杂,难免有…