Linux管道识
深入理解管道 (Pipes):连接命令的瑞士军刀
在 Linux 和类 Unix 系统(包括 macOS)的命令行世界里,管道(Pipe)是一个极其强大且基础的概念。它允许你将一个命令的输出直接作为另一个命令的输入,像流水线一样处理数据。这种简洁而强大的机制是 Unix 哲学——“做一件事并做好它”(Do One Thing and Do It Well)以及"组合小程序来完成复杂任务"——的核心体现。本文将深入探讨管道的定义、工作原理、使用场景、优缺点,并提供测试用例、流程图和注意事项。
1. 什么是管道?
从用户的角度来看,管道就是你在命令行中看到的那个竖线符号 |
。它的作用是连接两个或多个命令,使得前一个命令的标准输出(stdout)被"管道"传送给后一个命令的标准输入(stdin)。
核心概念:
- 标准流 (Standard Streams): 每个 Unix 进程默认都有三个标准文件描述符:
0
: 标准输入 (stdin) - 进程读取数据的地方,默认是键盘。1
: 标准输出 (stdout) - 进程写入正常输出的地方,默认是终端屏幕。2
: 标准错误 (stderr) - 进程写入错误信息的地方,默认也是终端屏幕。
- 管道符
|
的作用: 当你使用command1 | command2
时,操作系统会进行特殊处理:command1
的标准输出不再指向终端屏幕。command2
的标准输入不再指向键盘。- 操作系统创建一个匿名管道 (Anonymous Pipe),这是一个内核中的内存缓冲区。
command1
的标准输出被重定向到这个管道的写入端。command2
的标准输入被重定向到这个管道的读取端。
类比:
想象一条工厂流水线。command1
是第一个工位,它完成一部分工作并将半成品(数据)放到传送带(管道)上。command2
是下一个工位,它从传送带上拿起半成品,继续加工,然后可能再放到下一个传送带上,或者直接输出最终产品。
2. 管道的工作原理
管道的实现依赖于操作系统内核提供的机制。当我们执行 command1 | command2
时,大致发生以下步骤:
- Shell 解析: Shell(如 Bash)解析命令行,识别出
|
符号。 - 创建管道: Shell 调用
pipe()
系统调用,在内核中创建一个管道。这个系统调用返回两个文件描述符:一个用于读取(fd[0]
),一个用于写入(fd[1]
)。 - 创建子进程: Shell 通常会为
command1
和command2
分别创建子进程(通过fork()
系统调用)。 - 重定向文件描述符:
- 在
command1
的子进程中:- 关闭其原来的标准输出(文件描述符 1)。
- 将管道的写入端
fd[1]
复制(dup2()
)到文件描述符 1 上。这样,command1
写入标准输出的数据实际上是写入了管道。 - 关闭不再需要的管道读取端
fd[0]
。
- 在
command2
的子进程中:- 关闭其原来的标准输入(文件描述符 0)。
- 将管道的读取端
fd[0]
复制(dup2()
)到文件描述符 0 上。这样,command2
从标准输入读取的数据实际上是从管道读取的。 - 关闭不再需要的管道写入端
fd[1]
。
- 在
- 执行命令: 两个子进程分别使用
exec()
系列函数加载并执行command1
和command2
的程序代码。由于文件描述符已经在exec()
之前被重定向,新程序将继承这些重定向,从而实现了管道连接。 - 数据流动:
command1
运行时,其写入标准输出的数据进入内核的管道缓冲区。command2
运行时,其从标准输入读取数据时,会从管道缓冲区中获取。 - 同步与阻塞: 管道缓冲区的大小是有限的。
- 如果
command1
产生数据的速度快于command2
处理的速度,当缓冲区满了之后,command1
的写操作会被阻塞,直到command2
读取了一些数据腾出空间。 - 如果
command2
需要读取数据,但缓冲区是空的,并且command1
还没有关闭管道的写入端,command2
的读操作会被阻塞,直到command1
写入了新数据。 - 当
command1
完成并关闭其写入端后,command2
读取完缓冲区中剩余的数据后,再次读取会收到文件结束符(EOF),通常这会使command2
结束执行。
- 如果
3. 管道的优势
- 模块化与简洁性: 将复杂任务分解为一系列小而专一的命令,每个命令做好自己的事,通过管道连接起来,代码清晰,易于理解和维护。
- 强大的组合能力: Unix/Linux 提供了大量的小工具(
grep
,sort
,uniq
,wc
,awk
,sed
等),通过管道可以将它们任意组合,创造出无穷的可能性来处理文本数据。 - 效率: 数据通常在内存中直接传递,避免了将中间结果写入磁盘再读出的开销(与使用临时文件相比)。内核负责缓冲和同步,效率较高。
- 易于使用: 语法简单,只有一个
|
符号,学习成本低。
4. 管道的使用场景与测试用例
管道最常用于文本数据的处理和过滤。
测试环境准备:
为了方便测试,我们先创建一些示例文件:
# 创建一个包含一些文本行的文件
echo -e "apple\nbanana\napple\norange\nbanana\napple" > fruits.txt# 创建一个包含进程信息的模拟日志(实际用 ps aux)
echo -e "USER PID %CPU %MEM COMMAND\nroot 1 0.1 0.5 init\nuser 1001 0.5 1.2 bash\nuser 1005 15.2 5.0 chrome\nroot 50 0.0 0.1 kthreadd\nuser 1010 0.8 2.1 firefox" > processes.log
测试用例:
统计文件中某个单词出现的次数:
cat fruits.txt | grep "apple" | wc -l
解释:
cat fruits.txt
: 读取 fruits.txt 的内容并输出到标准输出。|
: 将 cat 的输出通过管道传递给 grep。grep "apple"
: 从标准输入(来自管道)中筛选包含 “apple” 的行,并输出到标准输出。|
: 将 grep 的输出通过管道传递给 wc。wc -l
: 从标准输入(来自管道)中读取数据,并计算行数(-l),将结果输出到标准输出(终端)。- 预期输出: 3
找出文件中不重复的水果名称并排序:
cat fruits.txt | sort | uniq
解释:
cat fruits.txt
: 输出文件内容。| sort
: 将内容排序后输出。sort 会读取所有输入再进行排序输出。| uniq
: 从已排序的标准输入中移除连续的重复行,输出唯一行。- 预期输出:
apple banana orange
计算 user 用户运行的进程数量:
cat processes.log | grep "^user" | wc -l
解释:
ps aux
或cat processes.log
: 列出所有进程信息或模拟信息。| grep "^user"
或grep "^$(whoami)"
: 筛选出以 “user”(或当前用户名)开头的行。^
表示行首。| wc -l
: 统计筛选后的行数。- 预期输出 (基于 processes.log): 3
查找占用 CPU 最高的 5 个进程 (实际场景):
ps aux --sort=-%cpu | head -n 6
解释:
ps aux
: 列出所有进程的详细信息。--sort=-%cpu
: 按照 CPU 使用率(%cpu)降序(-)排序。| head -n 6
: 取排序后输出的前 6 行(包括标题行)。- 预期输出: 类似 ps 的输出格式,按 CPU 降序排列的前 5 个进程加标题行。
复杂链式管道:统计 Web 服务器访问日志中最常访问的 10 个页面:
cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 10
解释:
cat access.log
: 读取日志文件。| awk '{print $7}'
: 提取每行的第 7 个字段(通常是请求的 URL 路径)。| sort
: 对 URL 路径进行排序,以便 uniq 能正确工作。| uniq -c
: 统计每个 URL 连续出现的次数,并在前面加上次数。| sort -nr
: 按数量(第一列 -n)降序(-r)排序。| head -n 10
: 取出排序后的前 10 行,即访问次数最多的 10 个 URL 及其次数。
5. 管道的流程图
流程图解释:
command1
进程执行,其标准输出(stdout)被重定向到内核管道的写入端 (P_write)。- 数据写入内核维护的管道缓冲区 §。
command2
进程执行,其标准输入(stdin)被重定向到内核管道的读取端 (P_read)。command2
从管道缓冲区读取数据。command1
的标准错误(stderr)默认仍然输出到终端。command2
的标准输出(stdout)默认输出到终端(除非后面还有管道或重定向)。command2
的标准错误(stderr)默认也输出到终端。
6. 注意事项与限制
标准错误流 (stderr) 不通过管道:
默认情况下,管道只传递前一个命令的标准输出 (stdout),不传递标准错误 (stderr)。command1
的错误信息会直接显示在终端上,而不是被 command2
处理。
解决方案: 如果需要将 stderr 也通过管道传递,可以使用 2>&1
将 stderr 重定向到 stdout。
# 将 command1 的 stdout 和 stderr 都传递给 command2
command1 2>&1 | command2
或者在 Bash 4+ 中,使用更简洁的 |&
:
command1 |& command2
缓冲 (Buffering):
- 标准输出可能是行缓冲(输出到终端时)或全缓冲(输出到文件或管道时)。
- 行缓冲:遇到换行符
\n
或缓冲区满时才实际输出。 - 全缓冲:缓冲区满了才实际输出。
这可能导致某些情况下数据传递的延迟,或者在使用head
等命令提前结束管道时,command1
可能因为 SIGPIPE 信号而提前终止,但缓冲区行为有时会让人困惑。可以使用stdbuf
命令调整缓冲策略(如stdbuf -oL command1 | command2
使 command1 行缓冲)。
错误处理:
- 管道中任何一个命令失败(以非零状态退出)都可能导致整个流水线的结果不符合预期。
- 默认情况下,管道命令的最终退出状态是最后一个命令的退出状态。这意味着即使前面的命令失败了,只要最后一个命令成功(退出状态为 0),整个管道命令也被认为是成功的。
解决方案: 在 Bash 中,可以使用 set -o pipefail
选项。设置后,管道命令的退出状态将是最后一个(最右边)非零退出状态的命令的退出状态,或者如果所有命令都成功退出则为 0。
set -o pipefail
command1 | command2 | command3
echo $? # 会反映第一个失败的命令(从右往左看)的退出码
set +o pipefail # 取消设置
性能:
虽然管道通常比使用临时文件高效,但在处理极大量数据或管道链过长、涉及复杂计算时,也可能成为瓶颈。每个 |
都会创建一个新的进程,这有一定开销。
线性的数据流:
管道天生是线性的,数据从左到右依次处理。对于需要更复杂数据流(如分支、合并、循环)的任务,单纯使用管道可能不够灵活,这时可能需要脚本语言(Bash, Python, Perl等)或临时文件。
命令的兼容性:
并非所有命令都设计为良好地处理管道数据。有些命令可能期望交互式输入,或者其输出格式不适合作为其他命令的输入。需要了解参与管道的每个命令的行为。
替代方案:
- 临时文件:
command1 > tempfile; command2 < tempfile; rm tempfile
。更明确,但 I/O 开销大。 - 命令替换:
command2 $(command1)
。将 command1 的输出作为参数传递给 command2,适用于输出内容不大的情况。 - 进程替换:
command2 <(command1)
(Bash/Zsh)。类似管道,但看起来像一个文件名,更灵活,可以用于需要文件名的命令。diff <(command1) <(command2)
。 - 命名管道 (Named Pipes / FIFOs):
mkfifo mypipe; command1 > mypipe & command2 < mypipe
。可以在不相关的进程之间传递数据,比匿名管道更持久。 - 脚本语言: 对于复杂的逻辑,使用 Python、Perl、Ruby 或更强大的 Shell 脚本通常是更好的选择。
7. 总结
管道是 Unix/Linux 命令行界面中的一颗璀璨明珠。它以极其简单的方式实现了强大的进程间通信,是实现命令组合、数据流处理的核心机制。理解管道的工作原理、掌握其常用技巧(如 2>&1
, pipefail
)并了解其局限性,对于任何希望高效使用命令行的用户或开发者来说都至关重要。熟练运用管道,能够让你将各种小工具组合起来,轻松应对各种复杂的文本处理和系统管理任务,真正体会到 Unix 哲学的魅力。不断实践,你会发现管道的威力远超想象。
相关文章:
Linux管道识
深入理解管道 (Pipes):连接命令的瑞士军刀 在 Linux 和类 Unix 系统(包括 macOS)的命令行世界里,管道(Pipe)是一个极其强大且基础的概念。它允许你将一个命令的输出直接作为另一个命令的输入,像…...
LabVIEW 中VI Server导出 VI 配置
该 LabVIEW VI 展示了在 VI Server 中配置和执行 Exported VIs 的过程,实现对服务器端导出 VI 的远程调用与操作。 具体过程及模块说明 前期配置:需确保在 LabVIEW 的 “Tools> Options > VI Server > Protocols” 路径下,启用 …...
map和set的遗留 + AVL树(1):
在讲解新的东西之前,我们把上节遗留的问题说一下: 遗留问题: 首先,我们的最上面的代码是一个隐式类型转换,我们插入了一对数据。 我们说了,我们的方括号的底层是insert,当我们调用operator的[…...
Java学习手册:Spring Security 安全框架
一、Spring Security 简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护 Java 应用程序,尤其是基于 Spring 的应用。它构建在 Spring 框架之上,能够轻松地集成到基于 Spring 的应用程序中,包括…...
pip 常用命令及配置
一、python -m pip install 和 pip install 的区别 在讲解 pip 的命令之前,我们有必要了解一下 python -m pip install 和 pip install 的区别,以便于我们在不同的场景使用不同的方式。 python -m pip install 命令使用 python 可执行文件将 pip 模块作…...
C++_STL
C 标准模板库(Standard Template Library,STL)是一套功能强大的 C 模板类和函数的集合,它提供了一系列通用的、可复用的算法和数据结构。 STL 的设计基于泛型编程,这意味着使用模板可以编写出独立于任何特定数据类型的…...
[FPGA Video] AXI4-Stream Remapper
Xilinx AXI4-Stream Remapper IP (PG379) 详细介绍 概述 Xilinx LogiCORE™ IP AXI4-Stream Remapper 核是一个专为视频处理设计的模块,用于在不同每时钟像素数(Pixels Per Clock, PPC)要求之间重新映射视频像素。它支持将输入 AXI4-Stream…...
【数据结构】励志大厂版·初阶(复习+刷题):栈与队列
前引:本篇将由小编与大家一起复习 栈 、队列 的知识点,栈、队列的顺序、链式结构各个缺点好处,如何实现、对于一般的增删查找此篇文章一定再详细不过!对代码的注释、何时需要判断、特殊情况,白话文版一解到底ÿ…...
pytest——参数化
之前有说过,通过pytest测试框架标记参数化功能可以实现数据驱动测试。数据驱动测试使用的文件主要有以下类型: txt 文件 csv 文件excel 文件json 文件yaml 文件.... 本文主要讲的就是以上几种文件类型的读取和使用 一.txt 文件读取使用 首先创建一个 …...
第7篇:RESTful API设计与安全防护
在前后端分离架构中,RESTful API是系统交互的核心通道。本文将从接口规范设计到安全防护,全面讲解如何在EggJS中构建安全、规范、易用的API系统,并提供完整的解决方案和最佳实践。 一、标准化API接口规范设计 1. RESTful设计原则 核心要素&…...
CSS 架构与命名规范
CSS 架构与命名规范:BEM、SMACSS 与 OOCSS 实战 引言 在前端开发中,随着项目规模的扩大,CSS 代码往往会变得难以维护和扩展。无组织的样式表会导致命名冲突、权重覆盖问题和样式继承混乱,这些问题在团队协作的大型项目中尤为明显…...
实验二 软件白盒测试
实验二 软件白盒测试 某工资计算程序功能如下:若雇员月工作小时超过40小时,则超过部分按原小时工资的1.5倍的加班工资来计算。若雇员月工作小时超过50小时,则超过50的部分按原小时工资的3倍的加班工资来计算,而40到50小时的工资仍…...
【数据结构】String字符串的存储
目录 一、存储结构 1.字符串常量池 2.字符串哈希表 2.1结构 2.2基础存储单位 2.2.1键对象 2.2.2值对象 二、存储过程 1.搜索 2.创建 三、存储位置 四、存储操作 1.new新建 2.intern入池 这是String类的详解:String类变量 一、存储结构 1.字符串常量池…...
LLMs Tokenizer Byte-Pair Encoding(BPE)
1 Byte-Pair Encoding(BPE) 如何构建词典? 准备足够的训练语料;以及期望的词表大小;将单词拆分为字符粒度(字粒度),并在末尾添加后缀“”,统计单词频率合并方式:统计每一个连续/相邻字节对的出现频率,将最高频的连续字…...
npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令
前端比较主流的包管理器主要有三个npm,yarn,pnpm 多层级依赖,通常发生在依赖之间存在复杂的版本要求时 包 A 依赖于包 B1.0.0 包 B 依赖于包 C2.0.0 另一个包 D 也依赖于 C3.0.0 一、NPM (Node Package Manager) https://www.npmjs.cn/…...
使用mybatis实例类和MySQL表的字段不一致怎么办
在 MyBatis 中,当 Java 实体类的属性名与数据库表的字段名不一致时,会导致查询结果无法正确映射。以下是几种常见解决方案及代码示例: 1. 使用 resultMap 显式映射(推荐) 场景:字段名与属性名差异较大&…...
阿里发布新一代通义千问 Qwen3模型
近日,阿里巴巴发布了新一代通义千问 Qwen3 模型,一举登顶全球最强开源模型。 这是国内首个“混合推理模型”,将“快思考”与“慢思考”集成进同一个模型,大大节省算力消耗。 旗舰模型 Qwen3-235B-A22B 在代码、数学、通用能力等…...
React pros比较机制
将 count1作为prop传递给Memoson组件 引用类型情况 虽然list值没有发生变化,但是仍旧重新渲染 解决方法使用useMemo()函数,传递一个空依赖项 // 传递数据为引用类型 比较的是引用 // 使用useMemo函数改写、const list useMemo(()>{return [1,2,3]},[…...
Flowable7.x学习笔记(十七)审批我的待办
前言 前文完成了我的待办的查询功能,本文就在此基础上从源码解读到完成审批任务的功能,审批界面我就先不带表单,直接单纯审批通过,这里需要注意的事,审批的表单其实每个节点都可能需要不同的表单内容,后续要…...
HTTP 状态码详解:用途与含义
HTTP 状态码详解:用途与含义 HTTP 状态码详解:用途与含义1. (2xx)成功类200 OK201 Created204 No Content206 Partial Content 2. (3xx)重定向类301 Moved Permanently302 Found(临时重定向&…...
AI日报 · 2025年05月02日 | 再见GPT-4!OpenAI CEO 确认 GPT-4 已从 ChatGPT 界面正式移除
1、OpenAI CEO 确认 GPT-4 已从 ChatGPT 界面正式移除 在处理 GPT-4o 更新问题的同时,OpenAI CEO Sam Altman 于 5 月 1 日在 X 平台发文,正式确认初代 GPT-4 模型已从 ChatGPT 主用户界面中移除。此举遵循了 OpenAI 此前公布的计划,即在 4 …...
ppt设计美化公司_杰青_长江学者_优青_青年长江学者_万人计划青年拔尖人才答辩ppt模板
WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 / 近期PPT美化案例 - 院士增选、科学技术奖、杰青、长江学者特聘教授、校企联聘长江、重点研发、优青、青长、青拔.. 杰青(杰出青年科学基金) 支持已取得突出成果的45岁以下学…...
文章四《深度学习核心概念与框架入门》
文章4:深度学习核心概念与框架入门——从大脑神经元到手写数字识别的奇幻之旅 引言:给大脑装个"GPU加速器"? 想象一下,你的大脑如果能像智能手机的GPU一样快速处理信息会怎样?这正是深度学习的终极目标&…...
HTML5+JavaScript实现连连看游戏之二
HTML5JavaScript实现连连看游戏之二 以前一篇,见 https://blog.csdn.net/cnds123/article/details/144220548 连连看游戏连接规则: 只能连接相同图案(或图标、字符)的方块。 连线路径必须是由直线段组成的,最多可以有…...
2025年- H19-Lc127-48.旋转矩阵(矩阵)---java版
1.题目描述 2.思路 画出矩阵,新的旋转矩阵的列坐标等于原始矩阵的矩阵长度-i-1(也就是减去当前遍历的i),前后对调。然后新的旋转矩阵的横坐标,是原始矩阵的列坐标。 3.代码实现 public class H48 {public void rota…...
深入理解 MyBatis 代理机制
在 Java 开发领域,MyBatis 是一款优秀的持久层框架,它极大地简化了数据库操作,提高了开发效率。其中,代理机制作为 MyBatis 的核心特性之一,在连接 Java 代码与数据库操作中发挥着关键作用。本文将深入探讨 MyBatis 代…...
游戏引擎学习第254天:重新启用性能分析
运行游戏并尝试让性能分析系统恢复部分功能 我们现在的调试系统这几天基本整理得差不多了,因此我们打算开始清理一些功能,比如目前虽然已经在收集性能分析数据,但我们没有办法查看或有效利用这些信息。今天的计划可能会围绕这方面展开&#…...
性能测试工具篇
文章目录 目录1. JMeter介绍1.1 安装JMeter1.2 打开JMeter1.3 JMeter基础配置1.4 JMeter基本使用流程1.5 JMeter元件作用域和执行顺序 2. 重点组件2.1 线程组2.2 HTTP取样器2.3 查看结果树2.4 HTTP请求默认值2.5 JSON提取器2.6 用户定义的变量2.7 JSON断言2.8 同步定时器&#…...
【Hive入门】Hive性能调优之Join优化:深入解析MapJoin与Sort-Merge Join策略
目录 前言 1 Hive Join操作基础 1.1 Join操作的类型与挑战 1.2 Hive Join执行机制 2 MapJoin优化策略 2.1 MapJoin原理 2.2 MapJoin适用场景 2.3 MapJoin关键参数 3 Sort-Merge Join优化策略 3.1 Sort-Merge Join原理 3.2 Sort-Merge Join优势 3.3 关键配置参数 3…...
【Unity】使用XLua实现C#访问Lua文件
先引入XLua文件中的Plugins和XLua文件夹于Unity项目的Asset文件中 XLua_github链接 建立Lua虚拟机:LuaEnv luaEnv new LuaEnv(); 关闭虚拟机,及时释放资源:luaEnv.Dispose(); Resources文件夹下加载lua文件(假设文件路径为Resour…...
AXI中的out of order和interleaving的定义和两者的差别?
AXI中的out of order和interleaving的定义和两者的差别 摘要:在 AXI (Advanced eXtensible Interface) 协议中,Out-of-Order 和 Interleaving 是两个与事务处理顺序和数据传输相关的概念,它们都与 AXI 协议支持的多事务并发处理能力有关&…...
生产级RAG系统一些经验总结
本文将探讨如何使用最新技术构建生产级检索增强生成(RAG)系统,包括健壮的架构、向量数据库(Faiss、Pinecone、Weaviate)、框架(LangChain、LlamaIndex)、混合搜索、重排序器、流式数据接入、评估策略以及实际部署技巧。 引言:检索增强生成的力量 大型语…...
sftp连接报错Received message too long 168449893
sftp连接报错Received message too long 168449893 一、openEuler传文件报错二、分析问题三、解决问题endl 一、openEuler传文件报错 [rootRocky9-12 ~]# scp apache-tomcat-10.1.33.tar.gz root10.0.0.14:Authorized users only. All activities may be monitored and report…...
Java中修饰类的关键字
Java中修饰类的关键字 在web编程课上,老师提问了Java中各种修饰类的关键字的用途和区别,一时间我头脑空白,现在课后重新梳理一遍Java中修饰类的各种关键字的区别和用法。在Java编程中,修饰类的关键字起着至关重要的作用ÿ…...
2025年人工智能火爆技术总结
2025年人工智能火爆技术总结: 生成式人工智能 生成式人工智能可生成高质量的图像、视频、音频和文本等多种内容。如昆仑万维的SkyReels-V2能生成无限时长电影,其基于扩散强迫框架,结合多模态大语言模型和强化学习等技术,在运动动…...
脑机接口技术:开启人类与机器的全新交互时代
在科技飞速发展的今天,人类与机器的交互方式正经历着前所未有的变革。从最初的键盘鼠标,到触摸屏,再到语音控制,每一次交互方式的升级都极大地提升了用户体验和效率。如今,脑机接口(Brain-Computer Interfa…...
Arduino程序函数详解与实际案例
一、Arduino程序的核心架构与函数解析 Arduino程序的核心由两个函数构成:setup() 和 loop()。这两个函数是所有Arduino代码的骨架,它们的合理使用决定了程序的结构和功能。 1.1 setup() 函数:初始化阶段 setup() 函数在程序启动时仅执行一次,用于完成初始化配置,例如设置…...
2025年RAG技术发展现状分析
2025年,大模型RAG(检索增强生成)技术经历了快速迭代与深度应用,逐渐从技术探索走向行业落地,同时也面临安全性和实用性的新挑战。以下是其发展现状的综合分析: 一、技术架构的持续演进 从单一到模块化架构 …...
C++11新特性_范围-based for 循环
based for 循环介绍 范围 - based for 循环(Range-based for loop)是 C11 引入的一种新的 for 循环语法,它可以更简洁地遍历容器和数组。 遍历数组:定义了一个整数数组 arr,使用范围 - based for 循环 for (int num :…...
小牛电动:荣登央视舞台,引领智能出行新潮流
在这个科技飞速发展的时代,出行方式也在不断地变革与创新。而在两轮电动车领域,有一个品牌凭借其卓越的技术、独特的设计和优质的服务脱颖而出,那就是小牛电动。近日,小牛电动荣登央视舞台,成为备受瞩目的焦点…...
Three.js在vue中的使用(一)-基础
Three.js 是一个基于 WebGL 的 JavaScript 3D 图形库,它简化了在网页中创建和渲染 3D 场景的复杂性。Three.js 提供了丰富的功能,如光照、材质、几何体、动画、控制器等,使得开发者可以快速构建交互式的 3D 应用。 🧠 Three.js 原理概述 1. WebGL 基础 Three.js 底层使用…...
开发板型号 ESP32-DevKitC-32模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3
以下是关于开发板型号 ESP32-DevKitC-32、模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3 的详细介绍: 开发板型号:ESP32-DevKitC-32 概述:ESP32-DevKitC 是乐鑫推出的一款基于 ESP32 模组的小型开发板,板上模组的绝大部…...
【C语言练习】015. 声明和初始化指针
015. 声明和初始化指针 015. 声明和初始化指针1. 声明指针示例1:声明一个指向整数的指针2. 初始化指针示例2:将指针初始化为`NULL`示例3:将指针初始化为某个变量的地址示例4:将指针初始化为动态分配的内存地址3. 使用指针访问和修改变量的值示例5:使用指针访问和修改变量的…...
手撕哈希表
引入:unordered_set /map是什么? 库里面除开set和map,还有unordered_set 和 unordered_map,区别在于: ①:set和map的底层结构是红黑树,而unordered_set和unordered_map的底层是哈希表 ②&…...
编程题python常用技巧-持续
1.字典 1.1排序 在Python中,要按照字典的值进行排序,可以按照以下步骤操作: 方法说明 获取键值对列表:使用 dict.items() 获取字典的键值对视图。排序键值对:使用 sorted() 函数,并通过 key 参…...
大模型蒸馏技术
提问:请写一篇关于蒸馏大模型的详细解说(论文),要求配有图并不少于8000字。 Deepseek: 大模型蒸馏技术:原理、方法与产业实践 ——基于知识压缩与效率优化的深度解析 目录 引言:大模型时代的…...
深入理解C语言中的整形提升与算术转换
深入理解C语言中的整形提升与算术转换 一.整形提升:概念与原理 在C语言中,整形提升(Integer Promotion)是一个重要但容易被忽视的概念。它指的是在表达式中,任何小于int类型的整型(如char、short…...
企业经营系统分类及功能详解
近年来互联网行业下行,招聘少,要求离谱,年龄学历背景已经卡的死死的,技术再突出也没用。 但对于软件开发来说,互联网只是一小部分,企业级系统软件开发,虽然不如互联网大起大落,但重…...
IRF2.0IRF3.1
1、IRF3定义 IRF3是一种能够提高网络接入层的接入能力和管理效率的纵向网络整合虚拟化技术,采用IEEE 802.1BR标准协议实现。IRF3将多台PEX设备(Bridge Port Extender)连接到父设备(Parent device)上,将每台…...
【C++】类和对象【中下】
目录 一、类与对象1、运算符重载1.2 赋值运算符重载1.3 <<运算符和>>运算符1.4 前置与后置 2、 const成员函数3、取地址运算符重载 个人主页<—请点击 C专栏<—请点击 一、类与对象 本期的主题是一步步完善日期类的编写,将要讲解的知识融入在代…...