当前位置: 首页 > news >正文

重定向和语言级缓冲区【Linux操作系统】

文章目录

  • 重定向
    • 重定向的原理
    • 重定向系统调用接口
    • 进程替换不会影响重定向
    • bash命令行中输入,输出,追加重定向的区别
      • 输出重定向
      • 输入重定向
      • 追加重定向
      • 命令行中只支持向文件描述符为0,1,2的标准流进行>,>>,<重定向
      • 文件描述符为2的标准错误重定向的时候,要指定文件描述符2
      • 标准错误流的作用是什么?
  • 语言级缓冲区
    • 语言级缓冲区为什么存在?
    • 语言级缓冲区什么时候刷新?
      • 向显示器文件写入时:
      • 向普通文件写入(读取)时:

重定向

进程每次新打开一个文件时,操作系统都要给它创建struct flie结构变量

然后从头开始遍历打开它的进程的PCB中的文件描述符表,找到空的就把struct flie结构变量的地址放进去

所以:
如果进程关掉一个文件之后,再打开一个新文件
那么新文件的文件描述符,就有可能会是关掉文件的文件描述符


标准输入的文件描述符为0,如果我把它关掉,再新打开一个文件
因为打开文件时,文件描述符的分配是从头开始遍历,见缝插针,所以新打开的文件的文件描述符就为0



重定向的原理

操作系统层面,把文件描述符表的一个下标里面存放的struct flie结构变量地址,换成其他的文件的struct flie结构变量的地址
操作系统做的这个操作,进程不知道


下面的代码
在这里插入图片描述

先关掉标准输出(显示器),再打开文件log1.txt
那么打开log.txt的时候,给它分配的文件描述符就是1
也就是log.txt的struct flie结构变量的地址覆盖了,1下标中存储的标准输出的struct flie结构变量的地址
但是进程不知道,进程里只是用变量存储了一开始使用open打开标准输出时返回的文件描述符,即1
printf的时候,底层就用变量中存储的文件描述符调用write对文件描述符为1的文件进行写入
进程不知道1下标已经不指向标准输入了
此时向显示器写入的内容,就变成了向log1.txt中写入了
这不就是重定向?



重定向系统调用接口

dup2
头文件:unistd.h
参数表:
①fd1:拷贝本源fd(文件描述符)
②fd2:拷贝到的目标位置的fd

底层实现:
就是把文件描述符表中,下标为参数①的元素中存储的地址,拷贝覆盖到参数②下标对应的元素中

特点:
①函数完成之后,第一个参数fd1下标中,存储的地址不变,所以指向的文件不变
②第二个参数fd2,拷贝前指向的文件一般会被关闭



进程替换不会影响重定向

因为进程替换只会替换代码和数据,不会修改内核数据结构

进程替换就是最多让:
物理内存中存储的原进程的代码和数据被清空覆盖
相应的mm_struct(进程地址空间)中的虚拟地址可能会修改,页表的映射也可能修改
也就是只修改了因为代码和数据被覆盖造成的影响,其他的内核数据结构都不变

所以:
进程的PCB不变,进程PCB中的struct files_struct*类型的指针指向的结构体变量不变
那么这个结构体变量中存储的文件描述符表的内容就也不会改变



bash命令行中输入,输出,追加重定向的区别

核心区别就是:
①打开文件的方式不同
②对文件进行的操作不同


输出重定向

就是以只写的方式打开重定向之前的文件,再调用系统调用dup2进行把文件描述符表中下标为1的元素中的地址覆盖掉

之后再进程替换进行写入文件的操作


输入重定向

就是以只读的方式打开重定向之前的文件,再调用系统调用dup2进行把文件描述符表中下标为0的元素中的地址覆盖掉

之后进行读取文件的操作

之后再进程替换进行读取文件的操作


追加重定向

就是以追加的方式打开重定向之前的文件,再调用系统调用dup2进行把文件描述符表中下标为1的元素中的地址覆盖掉

之后再进程替换进行追加写入文件的操作


命令行中只支持向文件描述符为0,1,2的标准流进行>,>>,<重定向

为什么?
因为重定向是在进程替换之前进行的,bash即使解析了用户的命令,也根本不知道替换上来的进程会打开什么文件
即使知道了,在替换进程之前打开了,也没办法把文件描述符传递给替换上来的进程

所以命令行中只能重定向进程创建时就默认打开的0,1,2


文件描述符为2的标准错误重定向的时候,要指定文件描述符2

例如
对标准输出进行重定向是:echo xxxx>log.txt
因为标准输出的文件描述符是1,>默认只会把log.txt的struct file的地址填到1下标处
echo xxxx 1>log.txt当然也没问题

对标准错误进行重定向只能是:echo xxxx 2>log.txt
因为不指定2这个文件描述符,>默认只会把log.txt的struct file的地址填到1下标处
所以2下标位置的显示器的struct file地址不会被覆盖
指定了之后才会覆盖对应下标的struct file地址


标准错误流的作用是什么?

标准输出和标准错误都是把信息打印到显示器,那为什么还要有标准错误呢?

这是因为人们使用标准输出时,可以打印各种各样的信息
而人们使用标准错误时,一般只会打印某些代码出错时的错误信息

而且标准输出和标准错误虽然都是向显示器写入,但是它们两个是不同的文件,文件描述符也不同
可以根据这个特点,把它们两个打印的信息重定向到不同文件中保存,这样在调试时就可以只看标准错误输出的错误信息

例如
重定向标准输出和标准错误,分别生成日志,这样就在出现错误的时候,就可以直接查看错误日志

在这里插入图片描述


语言级缓冲区

语言级缓冲区为什么存在?

比起高级语言层面的函数操作,执行系统调用的成本时间,空间成本更高==
为什么呢?
①执行系统调用时需要进行内核态和用户态之间的切换
②内核的安全检查比库函数严格的多,需要花费更多时间

所以高级语言为了提高效率,降低成本,就会尽可能减少调用系统调用

printf,fprintf,scanf,fscanf等需要向文件/外设写入(读取)的IO语言接口,要IO的话又一定要调用系统调用

和内核级缓冲区存在的原因一样
如果每次printf/scanf都调用系统调用,那么效率无疑会降低
所以语言层面IO的时候,也建立了语言级缓冲区
先把printf/scanf写入(读取)到的内容放进语言级缓冲区,累积到一定程度/时机合适时,再使用一次系统调用拷贝到内核级缓冲区

所以printf/scanf的作用和系统调用read和write的作用一样:都只有拷贝的作用


语言级缓冲区什么时候刷新?

向显示器文件写入时:

采用行刷新[即遇到\n就把对应的语言级缓冲区中的内容刷新到内核缓冲区中](内核级缓冲区对显示器文件也是行刷新

注意:
输出重定向到1的普通文件不会行刷新
因为操作系统检测的是文件类型,是存储在struct file中的,重定向的时候相当于把struct file换掉了

为什么呢?
因为显示器是用户最想快速看到/最能直观感受到IO结果的地方

比如用户对游戏的帧率的要求,就是对显示器IO速度的要求
所以向显示器文件刷新的速度必须要快


向普通文件写入(读取)时:

缓冲区写满了或者长时间不写了才刷新

相关文章:

重定向和语言级缓冲区【Linux操作系统】

文章目录 重定向重定向的原理重定向系统调用接口进程替换不会影响重定向bash命令行中输入&#xff0c;输出&#xff0c;追加重定向的区别输出重定向输入重定向追加重定向命令行中只支持向文件描述符为0&#xff0c;1&#xff0c;2的标准流进行>&#xff0c;>>&#xf…...

Channel如何安全地尝试发送数据

在 Go 语言中&#xff0c;无法直接检查 channel 是否关闭&#xff08;没有类似 IsClosed(ch) 的方法&#xff09;&#xff0c;但可以通过 非阻塞发送 或 select 语句 安全地尝试发送数据&#xff0c;避免向已关闭的 channel 发送数据导致 panic。以下是具体实现方式&#xff1a…...

MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点

MH21xx和MH22xx内核集成了串行/JTAG调试接口(SWJ-DP)。这是标准的ARM CoreSight调试接 口&#xff0c;包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。 ● JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。 ● 串行调试接口(SW-DP)为AHP-AP模块提供2针(时钟&#xff0…...

Tortoise-ORM级联查询与预加载性能优化

title: Tortoise-ORM级联查询与预加载性能优化 date: 2025/04/26 12:25:42 updated: 2025/04/26 12:25:42 author: cmdragon excerpt: Tortoise-ORM通过异步方式实现级联查询与预加载机制,显著提升API性能。模型关联关系基础中,定义一对多关系如作者与文章。级联查询通过s…...

【C++11】列表初始化

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲C11引入的列表初始化{}&#xff0c;注意这不是构造函数里的初始化列表&#xff01;&#xff01;&#xff01; 在阅读文章之前&#xff0c;请你记住一句重点&#xff1a;万物皆可{}初始化 &#x1f3ac;个人简介&#xff1a;努…...

基于Cherry Studio + DeepSeek 搭建本地私有知识库!

在当今数字化时代&#xff0c;知识管理变得越来越重要。无论是个人还是企业&#xff0c;都希望能够高效地存储、管理和检索知识。而借助 AI 技术&#xff0c;我们可以实现更加智能的知识库系统。本文将详细介绍如何使用 Cherry Studio 和 DeepSeek 搭建本地私有知识库&#xff…...

栈相关算法题解题思路与代码实现分享

目录 前言 一、最小栈&#xff08;LeetCode 155&#xff09; 题目描述 解题思路 代码实现&#xff08;C&#xff09; 代码解释 二、栈的压入、弹出序列&#xff08;剑指 Offer JZ31&#xff09; 题目描述 解题思路 代码实现&#xff08;C&#xff09; 代码解释 总结…...

MongoDB Atlas与MongoDB连接MCP服务器的区别解析

MongoDB Atlas作为全托管的云数据库服务&#xff0c;与本地自建MongoDB实例在连接MCP&#xff08;Model Context Protocol&#xff09;服务器时存在显著差异。以下从配置方式、安全机制、功能特性三个维度对比两者的区别&#xff1a; 连接配置差异 • 本地MongoDB&#xff1a;…...

服务器传输数据存储数据建议 传输慢的原因

一、JSON存储的局限性 1. 性能瓶颈 全量读写&#xff1a;JSON文件通常需要整体加载到内存中才能操作&#xff0c;当数据量大时&#xff08;如几百MB&#xff09;&#xff0c;I/O延迟和内存占用会显著增加。 无索引机制&#xff1a;查找数据需要遍历所有条目&#xff08;时间复…...

【大模型】Coze AI 智能体工作流从配置到使用实战详解

目录 一、前言 二、工作流介绍 2.1 什么是工作流 2.2 工作流与对话流 2.2.1 两者区别 2.3 工作流节点介绍 2.3.1 工作流节点说明 2.3.2 开始节点与结束节点 2.4 工作流入口 2.4.1 自定义智能体入口 2.4.2 从资源库新增工作流 2.5 工作流使用限制 三、工作流配置与使…...

Java后端开发——分层解耦详解

文章目录 一、三层架构1.1 概述1.2 具体实现方法 二、分层解耦2.1 以往问题2.2 概念解释2.3 解耦思路 三、Spring核心&#xff1a;IOC & DI3.1 快速入门3.2 IOC&#xff08;控制反转&#xff09;详解3.3 DI&#xff08;依赖注入&#xff09;详解 注入方式 标签&#xff1a;…...

论文如何降低AIGC?(完整指南版)

最近一段时间&#xff0c;关于论文AIGC率太高怎么办的问题&#xff0c;真的是知乎、小红书、B站到处都是&#xff01; 尤其是今年知网一升级&#xff0c;连纯手写的内容都能给你标疑似AIGC&#xff0c;简直离谱啊兄弟姐妹们&#x1f62d;&#xff01; 那论文到底怎么降低AIGC…...

【LCMM】纵向轨迹模型,组轨迹模型

latent_class_mixed_models 基础知识 增长混合模型&#xff08;GMM&#xff09;和潜在类别增长模型&#xff08;LCGA&#xff09;的核心区别确实主要在于是否允许类别内存在随机效应&#xff0c;但两者的差异还涉及模型灵活性、假设和应用场景等方面。以下是详细对比&#xf…...

Flask + ajax上传文件(三)--图片上传与OCR识别

本教程将详细介绍如何使用Flask框架构建一个图片上传与文字识别(OCR)的Web应用。我们将使用EasyOCR作为OCR引擎,实现一个支持中文和英文识别的完整应用。 环境准备 首先,确保你已经安装了Python 3.7+环境,然后安装必要的依赖库: pip install flask easyocr pillow werkz…...

观察者模式 (Observer Pattern)

观察者模式(Observer Pattern)是一种行为型设计模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己的状态。 一、基础 1. 意图 核心目的:定义对象间的一种一对…...

【Leetcode 每日一题】2444. 统计定界子数组的数目

问题背景 给你一个整数数组 n u m s nums nums 和两个整数 m i n K minK minK 以及 m a x K maxK maxK。 n u m s nums nums的定界子数组是满足下述条件的一个子数组&#xff1a; 子数组中的 最小值 等于 m i n K minK minK。子数组中的 最大值 等于 m a x K maxK maxK…...

LeetCode热题100——70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&#xff1a; …...

黑马Java基础笔记-4

方法 什么是方法 方法是程序中最小的执行单元。 形参和实参 调用 直接调用 getSum(10,20,30);赋值调用 int sum getSum(10,20,30);输出调用 System.out.println(getSum(10,20,30));方法的重载 在同一个类中&#xff0c;定义了多个同名的方法&#xff0c;这些同名的方法…...

【Python】Python中的浅拷贝和深拷贝

在Python中&#xff0c;浅拷贝&#xff08;shallow copy&#xff09;和深拷贝&#xff08;deep copy&#xff09;是两种不同的对象复制方式&#xff0c;它们在复制对象时的行为有所不同&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是创建一个新对象&…...

使用 LangGraph 和 Elasticsearch 构建强大的 RAG 工作流

作者&#xff1a;来自 Elastic Neha Saini 在这篇博客中&#xff0c;我们将向你展示如何配置和自定义 LangGraph Retrieval Agent 模板与 Elasticsearch&#xff0c;以构建一个强大的 RAG 工作流&#xff0c;实现高效的数据检索和由 AI 驱动的响应。 Elasticsearch 原生集成了…...

云原生--核心组件-容器篇-2-认识下Docker(三大核心之镜像,容器,仓库)

1、Docker基本概念 &#xff08;1&#xff09;、定义 Docker是一种开源的应用容器引擎&#xff0c;是基于操作系统级虚拟化技术。允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后发布到任何支持Docker的环境中运行。Docker容器是轻量级、独立且可执…...

智慧园区IOT项目与AI时代下的机遇 - Java架构师面试实战

在互联网大厂的Java求职者面试中&#xff0c;面试官通常会针对实际业务场景提出一系列问题。以下是关于智慧园区IOT项目及AI时代下的机遇的面试模拟对话。 第一轮提问 面试官&#xff1a;马架构&#xff0c;请简要介绍下智慧园区IOT项目的整体架构设计。 马架构&#xff1a;…...

Unity中文件上传以及下载,获取下载文件大小的解决方案

首先现在Unity插件那么的广泛的情况下,很多东西都不需要自己实现,直接使用第三方插件就可以了,但为什么这里需要自己写,接下来说明原因。 在Unity商城中有很多关于关于网络接口调用的插件,其中有一款叫BestHTTP这款使用比较广泛的插件,不知道朋友们是不是都知道,是不是…...

Word/WPS 删除最后一页空白页,且保持前面布局样式不变

如题&#xff0c;试了多种方法&#xff0c;都不行。主要是可能的原因太多了&#xff0c;没有通解&#xff0c;这只是适用于我的情况。 解决方案&#xff1a; 首先光标放在倒数第二页&#xff08;即想保留的最后一页&#xff09;&#xff0c;点击页面右下角这个小箭头&#xff…...

MySQL长事务的隐患:深入剖析与解决方案

MySQL长事务的隐患&#xff1a;深入剖析与解决方案 一、什么是长事务&#xff1f; 在数据库系统中&#xff0c;长事务(Long Transaction)通常指执行时间超过预期或系统设定阈值的事务。对于MySQL而言&#xff0c;虽然没有严格的时间定义&#xff0c;但一般认为执行时间超过数…...

【Tauri】桌面程序exe开发 - Tauri+Vue开发Windows应用 - 比Electron更轻量!8MB!

效果图 Tauri的二进制文件体积显著小于Electron&#xff0c;安装包通常缩小80%以上。应用启动更快&#xff0c;内存占用更低&#xff0c;尤其在老旧设备上体验更流畅。 写在前面 Tauri官网 https://tauri.app/zh-cn/支持语言&#xff1a;js、ts、rust、.net编译出来的exe文件&…...

2025春季NC:3.1TheTrapeziumRule

3.1TheTrapeziumRule 📐 The Idea Instead of finding the exact area under a curve y = f ( x ) y = f(x) y=...

【摩尔定律】

一、摩尔定律的核心定义​​ ​​原始表述&#xff08;1965年&#xff09;​​ “集成电路上可容纳的晶体管数量&#xff0c;每隔约 ​​18-24个月​​ 便会增加一倍&#xff0c;同时性能提升一倍&#xff0c;而成本下降一半。” ​​简化理解​​ 芯片的 ​​晶体管密度​​ 和…...

Maven 依赖冲突调解与版本控制

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

《Python Web部署应知应会》Flask网站隐藏或改变浏览器URL:从Nginx反向代理到URL重写技术

Flask网站隐藏或改变浏览器显示URL地址的实现方案&#xff1a;从Nginx反向代理到URL重写技术 引言 在Web应用开发中&#xff0c;URL路径的安全性往往被忽视&#xff0c;这可能导致网站结构和后端逻辑被攻击者轻易推断。对于Flask框架开发的网站&#xff0c;如何隐藏或改变浏览…...

6.2 内容生成与营销:个性化内容创作与营销策略优化

随着消费者对个性化体验的需求日益增长&#xff0c;传统的内容创作与营销方式已难以满足市场竞争的需要。基于大语言模型&#xff08;LLM&#xff09;与智能代理&#xff08;Agent&#xff09;的技术为企业提供了全新的解决方案&#xff0c;能够实现高效、精准、规模化的内容生…...

平面连杆机构(上)

1、平面四杆机构的类型与演化 1&#xff09;平面四杆机构的类型 a、铰链四杆机构&#xff1a;曲柄摇杆机构、双曲柄机构、双摇杆机构 b、其他四杆机构&#xff1a;曲柄滑块机构、导杆机构、滑块机构、双滑块机构、偏心轮四杆机构...... 2&#xff09;平面四杆机构的演化 a、…...

【数据结构刷题】顺序表与ArrayList

【数据结构刷题】顺序表与ArrayList 1. 杨辉三角2. 合并两个有序数组 1. 杨辉三角 LC链接&#xff1a;杨辉三角 //杨辉三角import java.util.ArrayList; import java.util.List;public class Demo1 {public List<List<Integer>> generate(int numRows) {List<…...

顶点着色器和片元着色器染色+表面体着色器染色

顶点/片元着色器染色 创建材质球及Shader同名文件VFColor //Update NOTE&#xff1a;replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*) Shader "CreateTest/VFColor" {Properties{_Color("颜色",Color)(1,1,1,1)}SubShader{Pass{//顶点片…...

240426 leetcode exercises

240426 leetcode exercises jarringslee 文章目录 240426 leetcode exercises[1669. 合并两个链表](https://leetcode.cn/problems/merge-in-between-linked-lists/?envTypeproblem-list-v2&envIdlinked-list)&#x1f501;基础版 保存断点&#xff0c;先拼再补&#x1f…...

代码随想录算法训练营Day35

卡码网46.携带研究材料 力扣494.目标和【meidum】 力扣416.分割等和子集【medium】 一、卡码网46.携带研究材料 题目链接&#xff1a;卡码网46.携带研究材料 视频链接&#xff1a;代码随想录 题解链接&#xff1a;代码随想录 1、思路 dp[i][j] 表示从下标为 [0-i] 的物品里任意…...

C++17 折叠表达式

C17 引入的折叠表达式&#xff08;Fold Expressions&#xff09; 是处理可变参数模板&#xff08;Variadic Templates&#xff09;的革命性特性。它通过简洁的语法&#xff0c;使得对参数包&#xff08;Parameter Pack&#xff09;的操作更加直观和高效&#xff0c;避免了传统的…...

Ubuntu编译opencv源码

准备 Ubuntu版本&#xff1a;22.04opencv版本&#xff1a;4.9.0没下载Ubuntu镜像的可以在清华镜像下载 本文以4.9.0版本演示&#xff0c;可根据自身情况选择 安装JDK和依赖项 本次编译主要为了获取java在linux环境下的动态库&#xff0c;所以需要在虚拟机上下载jdk # 安装…...

一种滑窗像素自差值的深度学习损失函数

公司项目&#xff0c;已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展&#xff0c;因其自主学习图像数据特征避免了人工设计算法的繁琐&#xff0c;精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能&#xff0c;使得深度学习技术在图像领…...

【Typecho】给Joe主题后台添加custom自定义功能!

大家好&#xff0c;今天来添加一下自定义功能&#xff01; &#x1f602; 温馨提示&#xff1a;站长已经通过本地环境测试custom自定义功能&#xff0c;功能正常可以使用&#xff0c;按照我的操作来一定成功&#xff01; 大纲 创建custom.php粘贴代码到custom.php文件引入cus…...

一些常见的资源池管理、分布式管理和负载均衡的监控工具

资源池管理监控工具 Prometheus 是一款开源的系统监控和警报工具。它可以通过收集各种指标数据,如CPU使用率、内存使用量、磁盘I/O等,来监控资源池中的服务器、容器等资源。Prometheus具有强大的查询语言和可视化功能,能够帮助管理员快速了解资源的使用情况,并及时发现潜在…...

WPF程序使用Sugar操作数据库

WPF 程序使用 Sugar ORM 操作数据库 一、引言 在 WPF(Windows Presentation Foundation)应用程序中,数据库操作是不可或缺的一部分。Sugar ORM(对象关系映射)是一种轻量级的 ORM 框架,它简化了数据库操作,使得开发者能够以面向对象的方式与数据库进行交互。本文将详细…...

【Castle-X机器人】四、智能机械臂安装与调试

持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】智能机械臂安装与调试 四、智能机械臂安装与调试2.1 安装2.2 调试2.2.1 2D摄像头测试 四、智能机械臂安装与调试 2.1 安装 使用相应工具将机械臂固定在Castle-X机器人底盘 2.2 调试 2.2.1 2D摄像头测试 内容地址 链…...

goweb-signup注册功能实现

注册功能 route.go package routerimport ("bluebell/controller""github.com/gin-gonic/gin" )func SetupRouter(mode string) *gin.Engine {r : gin.Default()r.POST("/signup", controller.SignupHandler)return r }UserController.go pac…...

Linux: 如何在VMware上安装Ubuntu操作系统

在VMware上安装Ubuntu操作系统是一个相对简单的过程&#xff0c;以下是详细的步骤&#xff1a; 一、准备工作 安装VMware软件 确保你已经在电脑上安装了VMware Workstation&#xff08;适用于Windows&#xff09;或VMware Fusion&#xff08;适用于Mac&#xff09;。如果没有安…...

详解 Network.framework:iOS 网络开发的新基石

详解 Network.framework&#xff1a;iOS 网络开发的新基石 引言 自 iOS 12 和 macOS 10.14 起&#xff0c;Apple 推出了一个新的网络开发框架 —— Network.framework。它被定位为下一代网络连接的基础设施&#xff0c;让开发者可以以更安全、更高效的方式&#xff0c;管理 T…...

Java—— 五道算法水题

第一题 需求&#xff1a; 包装类&#xff1a;键盘录入一些1~100之间的整数&#xff0c;并添加到集合中。直到集合中所有数据和超过200为止 代码实现&#xff1a; import java.util.ArrayList; import java.util.Scanner;public class Test1 {public static void main(String[]…...

将服务器接到路由器上访问

应用场景: 实验室网卡更换了,新网卡没有报备到校园网,暂时无法通过外部链接连到服务器. 除了跳板机之外,可以使用以下方法将服务器接入到路由器访问. 将服务器接到交换机上&#xff0c;将交换机接到路由器上本地电脑 连接路由器wifi登录http://192.168.0.1/&#xff0c;访问路…...

MyBatis缓存配置的完整示例,包含一级缓存、二级缓存、自定义缓存策略等核心场景,并附详细注释和总结表格

以下是MyBatis缓存配置的完整示例&#xff0c;包含一级缓存、二级缓存、自定义缓存策略等核心场景&#xff0c;并附详细注释和总结表格&#xff1a; 1. 一级缓存&#xff08;默认开启&#xff09; // 使用同一SqlSession执行两次查询&#xff0c;自动命中一级缓存 try (SqlSe…...

我爱学算法之—— 二分查找(上)

了解二分算法 二分查找&#xff0c;想必多多少少有一点了解了&#xff0c;我们了解的二分查找算法&#xff1a; 当一个数组有序的时候&#xff0c;我们可以使用二分算法来查找一个值&#xff1b; 直接比较mid((left right)/2)和我们要查找的值target&#xff1b;如果nums[mid]…...