进程、线程、进程间通信Unix Domain Sockets (UDS)
进程、线程、UDS
- 进程和线程
- 进程间通信
- Unix Domain Sockets (UDS)
- UDS的核心适用场景和用途
- 配置UDS的几种主要方式
- socketpair() 基本配置流程
- socketpair() 进阶——传递文件描述符
- 补充
- socketpair() 函数
- struct msghdr 结构体
- struct iovec
- struct cmsghdr
- struct iovec 、struct msghdr 、struct cmsghdr三者关系
- sendmsg() 函数
- recvmsg() 函数
博客园——进程和线程_1
博客园——进程和线程_2
博客园——浅析Unix domain socket是什么、Java如何使用UnixSocket调用Docker API对容器进行操作(jnr-unixsocket的使用)
进程和线程
每个进程中的内容 | 每个线程中的内容 |
---|---|
地址空间 | 程序计数器 |
全局变量 | 寄存器 |
打开文件 | 堆栈 |
子进程 | 状态 |
即将发生的定时器 | |
信号与信号处理程序 | |
账号信息 |
-
进程模型
在进程模型中,计算机上所有可运行的软件,通常也包括操作系统本身,被组织成若干顺序进程,一个进程就是一个正在执行程序的实例,包括程序计算器、寄存器、变量当前值。 -
进程的状态
进程运行,占用CPU资源执行程序
就绪态,等待调度程序给进程分配CPU资源
阻塞态,等待某种外部事件发生,比如用户输入
运行——》阻塞 :进程因为等待输入而被阻塞
运行——》就绪 :调度程序选择另外的进程执行
就绪——》运行 :调度程序选择了这个进程
阻塞——》就绪 :出现有效输入
- 进程的实现
为了实现进程模型,操作系统维护了一张表格(结构数组)——进程表,每个进程占用一个表项——进程控制块,其包含了进程状态的重要信息,进程在从运行态切换到其它状态时,必须将一些必要的当前信息保存到进程控制块中。
进程控制块中的字段(部分)
进程管理 | 存储管理 | 文件管理 |
---|---|---|
寄存器 | 正文段指针 | 根目录 |
程序计数器 | 数据段指针 | 工作目录 |
程序状态字 | 堆栈段指针 | 文件描述符 |
堆栈状态 | 用户ID | |
进程状态 | 组ID | |
优先级 | ||
调度参数 | ||
进程ID | ||
父进程 | ||
进程组 | ||
信号 | ||
进程开始时间 | ||
使用的CPU时间 | ||
子进程的CPU时间 | ||
下次定时器时间 |
- 中断向量
中断向量本质上是一个指针,指向中断服务程序(ISR, Interrupt Service Routine)的地址。中断向量存储了中断处理程序的内存地址,CPU通过该指针跳转到正确的代码位置执行来执行ISR。
所有的中断都是从保存寄存器开始,对于当前进程而言,通常是保存在进程控制块中,随后,会从堆栈中,删除由中断硬件机制存入堆栈的那部分信息,并将堆栈指针指向一个由进程处理程序所使用的临时堆栈。
一些诸如保存寄存器值和设置堆栈指针等操作,通常由一个短小的汇编语言例程来完成,当该例程结束后,它会调用一个C过程处理某个特定的终端类型剩下的工作。
在完成有关工作后,大概就会使相关的进程就绪,接着调用调度程序,决定下一个该运行的进程。决定好以后,会将控制转给一段汇编语言代码,为将要执行的进程装入寄存器值以及内存映射并启动该进程运行。
中断发生后操作系统最底层的工作步骤
1.硬件过程:压入堆栈程序计算器等
2.硬件从中断向量装入新的程序计数器
3.汇编语言过程:保存寄存器值
4.汇编语言过程:设置新的堆栈
5.C中断服务例程运行(读、缓冲写入)
6.调度程序决定下一个将要运行的进程
7.C过程:返回至汇编代码
8.汇编语言过程:开始运行新的当前进程
- POSIX线程
IEEE在IEEE标准1003.1c中定义了线程的标准。它定义的线程包叫作pthread。
大部分UNIX系统都支持该标准。
进程间通信
竞争条件:两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序
互斥:以某种手段确保当一个进程在使用一个共享数据时,其他进程不能做同样的操作
临界区:对共享内存进行访问的程序片段
互斥实现方案:
屏蔽终端、锁变量、严格轮转法、Peterson解法、TSL指令
Unix/Linux 系统中的进程间通信(IPC, Inter-Process Communication)机制:
-
管道(Pipe)
匿名管道(单向通信):
通过 pipe() 系统调用创建,用于父子进程或兄弟进程间的通信。
数据单向流动(一个写端,一个读端)。
示例:ls | grep “file”(Shell 中的竖线 | 就是匿名管道)。
命名管道(FIFO):
通过 mkfifo 命令或 mkfifo() 函数创建,存在于文件系统中。
允许无亲缘关系的进程通信。 -
信号(Signal)
用于通知进程某事件的发生(如 SIGKILL、SIGTERM)。
通过 kill()、raise() 或键盘组合(如 Ctrl+C 发送 SIGINT)触发。
异步通信,处理函数通过 signal() 或 sigaction() 注册。 -
共享内存(Shared Memory)
最高效的 IPC 方式,多个进程直接访问同一块内存。
通过 shmget() 创建共享内存段,shmat() 附加到进程地址空间。
需配合同步机制(如信号量)避免竞争条件。 -
消息队列(Message Queue)
进程通过 msgget() 创建队列,msgsnd() 和 msgrcv() 发送/接收消息。
消息按类型存储,支持优先级。
与管道不同,消息队列是持久的(除非显式删除)。 -
信号量(Semaphore)
用于进程间同步,避免资源竞争。
通过 semget()、semop() 等操作信号量集。
分为 System V 信号量和 POSIX 信号量(后者更轻量)。 -
套接字(Socket)
支持跨网络通信,也可用于本地进程间通信(Unix Domain Socket)。
本地套接字通过文件系统路径标识(如 /tmp/mysocket)。
示例:AF_UNIX 地址族的套接字。 -
内存映射文件(Memory-Mapped File)
通过 mmap() 将文件映射到进程内存空间,多个进程可共享修改。
适用于大文件读写或进程间共享数据。 -
文件锁(File Locking)
通过 fcntl() 或 flock() 对文件加锁,实现进程间同步。
分为建议性锁(需进程主动检查)和强制性锁(内核强制限制)。 -
远程过程调用(RPC, Remote Procedure Call)
允许进程调用另一台机器上的函数(如 Sun RPC)。
本地通信也可通过 RPC 框架实现。
Unix Domain Sockets (UDS)
Unix Domain Sockets (UDS) 是一种进程间通信(IPC)机制,允许同一台主机上的进程相互通信。与网络套接字不同,UDS不通过网络协议栈,而是通过文件系统进行通信,因此效率更高。
-
使用场景
同一主机上的客户端/服务器通信
数据库系统与本地客户端通信
X Window系统
Docker守护进程通信
系统服务内部通信 -
使用方法
步骤 | 服务器端 | 客户端 |
---|---|---|
1.创建 | Socket socket(AF_UNIX, type, 0) | socket(AF_UNIX, type, 0) |
2.绑定地址 | bind() + listen() | connect() |
3.通信 | accept() → read/write | read/write |
4.关闭 | close() + unlink() | close() |
- 与普通套接字的差异
Unix Domain Sockets (UDS) 和普通网络套接字(如 TCP/UDP)在编程接口上非常相似,下面进行对比:
(1)地址结构不同
UDS 使用 sockaddr_un(文件系统路径或抽象名)
普通套接字使用 sockaddr_in(IP + 端口)
(2)通信范围不同
特性 | Unix Domain Sockets (UDS) | 普通套接字(TCP/UDP) |
---|---|---|
通信范围 | 仅限同一台主机上的进程 | 可以跨网络通信(本地或远程主机) |
依赖网络协议栈 | 不依赖,直接走内核 IPC 机制 | 依赖 TCP/IP 或 UDP/IP 协议栈 |
性能 | 更高(无需序列化、校验和、路由等) | 较低(有协议栈开销) |
(3)绑定流程差异
UDS 需要处理文件系统路径
普通套接字绑定到 IP + 端口
(4)权限控制
UDS 受文件系统权限控制
普通套接字依赖网络权限
(5)数据传递能力
UDS 支持传递文件描述符和进程凭证
普通套接字只能传输原始数据
UDS的核心适用场景和用途
- 本地高性能进程间通信(IPC)
- 文件描述符与进程间状态传递
- 系统服务与守护进程通信
- 容器化环境(Container)内部通信
- 特权分离与安全沙盒
- 特殊场景:抽象命名空间(Linux 特有)
配置UDS的几种主要方式
具体取决于通信模型和需求
方法 | 适用场景 | 是否需要文件路径 | 特点 |
---|---|---|---|
socketpair() | 父子进程/线程间快速通信 | 否(匿名) | 简单高效,但限于相关进程 |
常规 UDS | 客户端-服务器模型 | 是 | 支持多客户端,需管理 socket 文件 |
抽象命名空间 | Linux 匿名通信 | 否(但需特殊命名) | 无文件残留,不可移植 |
SOCK_DGRAM | 无连接消息传递 | 可选 | 类似 UDP,无可靠性保证 |
SCM_RIGHTS | 传递文件描述符 | 依赖基础 UDS | 跨进程资源共享的唯一标准方式 |
I/O 多路复用 | 高并发事件驱动 | 依赖基础 UDS | 高性能,但实现复杂 |
socketpair() 基本配置流程
- 创建套接字对
- 创建子进程
- 关闭不需要的文件描述符
- 使用套接字进行通信
下面是代码示例:
//创建套接字对
int sockets[2];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) {perror("socketpair");exit(EXIT_FAILURE);
}
参数说明:
AF_UNIX 或 AF_LOCAL:表示本地通信(同一主机)
SOCK_STREAM:提供面向连接的可靠通信(类似TCP)
0:默认协议
sockets:用于存储创建的套接字描述符的数组
//创建子进程
pid_t pid = fork();
if (pid == -1) {perror("fork");exit(EXIT_FAILURE);
}
关闭不需要的文件描述符在子进程中
if (pid == 0) { // 子进程close(sockets[0]); // 关闭父进程使用的套接字// 现在可以使用 sockets[1] 与父进程通信// ... 通信代码 ...close(sockets[1]); // 通信结束后关闭exit(EXIT_SUCCESS);
}在父进程中
else { // 父进程close(sockets[1]); // 关闭子进程使用的套接字// 现在可以使用 sockets[0] 与子进程通信// ... 通信代码 ...close(sockets[0]); // 通信结束后关闭wait(NULL); // 等待子进程结束
}
可以使用 read()/write() 或 send()/recv() 进行通信:父进程发送数据到子进程:char message[] = "Hello from parent";
write(sockets[0], message, sizeof(message));子进程接收数据:char buffer[256];
ssize_t n = read(sockets[1], buffer, sizeof(buffer));
if (n > 0) {printf("Child received: %s\n", buffer);
}
socketpair() 进阶——传递文件描述符
socketpair() 创建的套接字还可以用于传递文件描述符(如示例代码中的 SendFD 和 RecvFD 方法):
- 使用 sendmsg() 和 recvmsg() 系统调用
- 通过辅助数据 (cmsghdr) 传递文件描述符
- 设置 msg_control 和 msg_controllen 字段
- 使用 SCM_RIGHTS 作为控制消息类型
补充
socketpair() 函数
//创建一对相互连接的匿名套接字,适用于父子进程或线程间通信。
//与 pipe() 不同,socketpair 创建的套接字是全双工的(双向通信)。
//文件描述符通过 fork() 继承,无需暴露文件系统路径(匿名性)。
int socketpair(int domain, int type, int protocol, int sv[2]);
参数 | 取值/类型 | 作用 |
---|---|---|
domain | AF_LOCAL/AF_UNIX | 指定协议族(Unix Domain Socket,本地通信) |
type | SOCK_STREAM | 面向连接的可靠通信(类似 TCP,保证数据顺序) |
SOCK_DGRAM | 无连接的数据报(类似 UDP,不保证顺序) | |
protocol | 0 | 通常为 0,表示默认协议 |
sv | int[2] | 用于返回两个关联的套接字描述符(sv[0] 和 sv[1]) |
struct msghdr 结构体
struct msghdr {void *msg_name; // 目标地址(用于网络通信,UDS 中为 NULL)socklen_t msg_namelen; // 地址长度struct iovec *msg_iov; // 数据块数组(分散/聚集 I/O)int msg_iovlen; // 数据块数量void *msg_control; // 控制信息(如文件描述符、凭证)socklen_t msg_controllen; // 控制信息长度int msg_flags; // 接收时的标志位(通常忽略)
};
关键成员
成员 | 用途 |
---|---|
msg_iov | 指向 struct iovec 数组,支持分散读写(Scatter/Gather I/O) |
msg_control | 指向控制信息缓冲区(如传递文件描述符的 cmsghdr 结构) |
msg_controllen | 控制信息的实际长度(需对齐到 CMSG_SPACE) |
struct iovec
struct iovec {void *iov_base; // 数据缓冲区地址size_t iov_len; // 数据长度
};
struct cmsghdr
struct cmsghdr {socklen_t cmsg_len; // 控制信息总长度(含头部)int cmsg_level; // 协议层级(如 SOL_SOCKET)int cmsg_type; // 信息类型(如 SCM_RIGHTS)// 随后是实际的控制数据(如 int fd)
};
struct iovec 、struct msghdr 、struct cmsghdr三者关系
- 这三个结构体共同用于 高级 I/O 操作(如 sendmsg/recvmsg),分工明确:
iovec:管理普通数据(如字符串、二进制块)。
msghdr:整合数据+控制信息,作为 I/O 操作的顶层容器。
cmsghdr:专门处理控制信息(如文件描述符、进程凭证)。 - 它们的关系类似于 快递包裹:
iovec = 包裹中的物品(数据内容)
cmsghdr = 快递单上的备注(特殊指令)
msghdr = 整个包裹(物品+快递单)
三者的内存布局
struct msghdr+---------------------+| msg_iov ---------->|--> struct iovec[0] {iov_base, iov_len}| msg_iovlen = 2 | struct iovec[1] {iov_base, iov_len}| || msg_control ------->|--> struct cmsghdr| msg_controllen | |-- cmsg_len+---------------------+ |-- cmsg_level (SOL_SOCKET)|-- cmsg_type (SCM_RIGHTS)|-- CMSG_DATA() -> 实际数据(如 int fd)
总结:
结构体 | 存储内容 | 所属层级 | 典型用途 |
---|---|---|---|
iovec | 普通数据(用户态缓冲区) | 数据层 | 分散/聚集 I/O |
cmsghdr | 控制信息(内核级元数据) | 控制层 | 传递文件描述符、进程凭证 |
msghdr | 整合 iovec + cmsghdr | 操作聚合层 | sendmsg/recvmsg 的参数 |
sendmsg() 函数
//发送数据和辅助数据(如文件描述符)。
//通过 msg_control 传递控制信息(需按 CMSG_SPACE 对齐)。
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
参数 | 类型 | 作用 |
---|---|---|
sockfd | int | 套接字描述符(如 socketpair 返回的 pipes[1]) |
msg | const msghdr* | 包含数据和控制信息的消息结构体 |
flags | int | 发送标志(如 MSG_DONTWAIT 非阻塞,通常设为 0) |
recvmsg() 函数
//接收数据和辅助数据(如文件描述符)。
//通过 msg_control 提取控制信息(需检查 cmsg_type)。
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
参数 | 类型 | 作用 |
---|---|---|
sockfd | int | 套接字描述符(如 socketpair 返回的 pipes[0]) |
msg | struct msghdr* | 接收数据的消息结构体(需预分配缓冲区) |
flags | int | 接收标志(如 MSG_WAITALL 阻塞等待全部数据,通常设为 0) |
相关文章:
进程、线程、进程间通信Unix Domain Sockets (UDS)
进程、线程、UDS 进程和线程进程间通信Unix Domain Sockets (UDS)UDS的核心适用场景和用途配置UDS的几种主要方式socketpair() 基本配置流程socketpair() 进阶——传递文件描述符 补充socketpair() 函数struct msghdr 结构体struct iovecstruct cmsghdrstruct iovec 、struct m…...
大数据平台与数据仓库的核心差异是什么?
随着数据量呈指数级增长,企业面临着如何有效管理、存储和分析这些数据的挑战。 大数据平台和 数据仓库作为两种主流的数据管理工具,常常让企业在选型时感到困惑,它们之间的界限似乎越来越模糊,功能也有所重叠。本文旨在厘清这两种…...
Hadoop虚拟机中配置hosts
( 一)修改虚拟机的主机名 默认情况下,本机的名称叫:localhost。 我们进入linux系统之后,显示出来的就是[rootlocalhost ~]# 。为了方便后面我们更加便捷地访问这台主机,而不是通过ip地址,我们要…...
a-upload组件实现文件的上传——.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt
实现下面的上传/下载/删除功能:要求支持:【.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt】 分析上面的效果图,分为【上传】按钮和【文件列表】功能: 解决步骤1:上传按钮 直接上代码: <a-uploadmultip…...
QCefView应用和网页的交互
一、demo的主要项目文件 结合QCefView自带的demo代码 main.cpp #include #include <QCefContext.h> #include “MainWindow.h” int main(int argc, char* argv[]) { QApplication a(argc, argv); // build QCefConfig QCefConfig config; config.setUserAgent(“QCef…...
C++,设计模式,【建造者模式】
文章目录 通俗易懂的建造者模式:手把手教你造电脑一、现实中的建造者困境二、建造者模式核心思想三、代码实战:组装电脑1. 产品类 - 电脑2. 抽象建造者 - 装机师傅3. 具体建造者 - 电竞主机版4. 具体建造者 - 办公主机版5. 指挥官 - 装机总控6. 客户端使…...
Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…...
科研 | 光子技术为人工智能注入新动力
译《Nature》25.4.9 发表文章《A photonic processing boost for AI》 ▶ 基于人工智能(artificial intelligence, AI)的系统正被越来越广泛地应用于从基因数据解码到自动驾驶的各类任务。但随着AI模型的规模和应用的扩大,性能天花板与能耗壁…...
SQL语句练习 自学SQL网 多表查询
目录 Day 6 用JOINs进行多表联合查询 Day 7 外连接 OUTER JOINs Day 8 外连接 特殊关键字 NULLs Day 6 用JOINs进行多表联合查询 SELECT * FROM Boxoffice INNER JOIN movies ON movies.idboxoffice.Movie_id;SELECT * FROM Boxoffice INNER JOIN moviesON movies.idboxoffi…...
北京亦庄机器人马拉松:人机共跑背后的技术突破与产业启示
2025年4月19日,北京亦庄举办了一场具有里程碑意义的科技赛事——全球首个人形机器人半程马拉松。这场人类与20支机器人战队共同参与的21.0975公里竞速,不仅创造了人形机器人连续运动的最长纪录,更成为中国智能制造领域的综合性技术验证平台。…...
大连理工大学选修课——机器学习笔记(6):决策树
决策树 决策树概述 决策树——非参数机器学习方法 参数方法: 参数估计是定义在整个空间的模型 所有训练数据参与估算 所有的检验输入都用相同的模型和参数 非参数方法: 非参数估计采用局部模型 输入空间被分裂为一系列可以用距离度量的局部空间…...
现代前端工具链深度解析:从包管理到构建工具的完整指南
前言 在当今快速发展的前端生态中,高效的工具链已经成为开发者的必备利器。一个优秀的前端工具链可以显著提升开发效率、优化项目性能并改善团队协作体验。本文将深入探讨现代前端开发中最核心的两大工具类别:包管理工具(npm/yarn)和构建工具(Webpack/V…...
[C语言]猜数字游戏
文章目录 一、游戏思路揭秘二、随机数生成大法1、初探随机数:rand函数的魔力2、随机数种子:时间的魔法3、抓住时间的精髓:time函数 三、完善程序四、游戏成果1、游戏效果2、源代码 一、游戏思路揭秘 猜数字游戏,这个听起来就让人…...
【Linux】g++安装教程
Linux上安装g教程 实现c语言在Linux上编译运行 1. 更新软件包列表 打开终端,先更新软件包列表以确保获取最新版本信息: sudo apt update2. 安装 build-essential 工具包 build-essential 包含 g、gcc、make 和其他编译所需的工具: sudo…...
MQTT - Android MQTT 编码实战(MQTT 客户端创建、MQTT 客户端事件、MQTT 客户端连接配置、MQTT 客户端主题)
Android MQTT 编码实战 1、Settting 在项目级 build.gradle 目录下导入 MQTT 客户端依赖 implementation org.eclipse.paho:org.eclipse.paho.mqttv5.client:1.2.5 implementation org.eclipse.paho:org.eclipse.paho.android.service:1.1.1AndroidManifest.xml,…...
Redis分布式锁使用以及对接支付宝,paypal,strip跨境支付
本章重点在于如何使用redis的分布式锁来锁定库存。减少超卖,同时也对接了支付宝,paypal,strip跨境支付 第一步先建立一个商品表 CREATE TABLE sys_product (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(60) DEFAUL…...
沙箱逃逸(Python沙盒逃逸深度解析)
沙箱逃逸(Python沙盒逃逸深度解析) 一、沙盒逃逸的核心目标 执行系统命令 通过调用os.system、subprocess.Popen等函数执行Shell命令,例如读取文件或反弹Shell。 文件操作 读取敏感文件(如/etc/passwd)、写入后门文件…...
k8s-Pod生命周期
初始化容器 初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征: 1. 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成 2. 初…...
基于Springboot + vue实现的中医院问诊系统
项目描述 本系统包含管理员、医生、用户三个角色。 管理员角色: 用户管理:管理系统中所有用户的信息,包括添加、删除和修改用户。 配置管理:管理系统配置参数,如上传图片的路径等。 权限管理:分配和管理…...
computed计算值为什么还可以依赖另外一个computed计算值?
在 Vue(或类似的响应式框架)中,computed 计算属性之所以可以依赖另一个 computed 属性,是因为: ✅ 本质上 computed 是响应式依赖的“派生值” 每个 computed 本质上就是一个 基于其他响应式数据计算出来的值。 当你在…...
近期实践总结
一、计算机二级考试到底教会了我们什么? 1、概况 根据本人复习、考试的经验,不难发现里面的试题或多或少有些死板(甚至可以说落后于时代),当今时代已经不是二十年前什么都需要手搓的时代了,引擎、集成类软…...
Arduion 第一天,变量的详细解析
Arduino变量详解与嵌入式开发扩展 一、变量基础篇 1.1 变量声明与初始化 <ARDUINO>int ledPin 13; // 声明并初始化float sensorValue; // 先声明后赋值unsigned long startTime; // 无符号长整型void setup() {sensorValue analogRead(A0) *…...
【每日八股】复习 MySQL Day3:锁
文章目录 昨日内容复习MySQL 使用 B 树作为索引的优势是什么?索引有哪几种?什么是最左匹配原则?索引区分度?联合索引如何排序?使用索引有哪些缺陷?什么时候需要建立索引,什么时候不需要…...
2025年KBS新算法 SCI1区TOP:长颖燕麦优化算法AOO,深度解析+性能实测
目录 1.摘要2.算法原理3.结果展示4.参考文献5.文章&代码获取 1.摘要 本文提出了一种新颖的元启发式算法——长颖燕麦优化算法(AOO),该算法灵感来自动画燕麦在环境中的自然行为。AOO模拟了长颖燕麦的三种独特行为:(i) 通过自然…...
1.4 点云数据获取方式——结构光相机
图1-4-1结构光相机 结构光相机作为获取三维点云数据的关键设备,其工作原理基于主动式测量技术。通过投射已知图案,如条纹、点阵、格雷码等,至物体表面,这些图案会因物体表面的高度变化而发生变形。与此同时,利用相机从特定...
2025.4.29总结
工作:最近手头活变得多起来了,毕竟要测两个版本,有时候觉得很奇怪,活少的时候,又想让别人多分点活,活多的时候,又会有些许不自然。这种反差往往伴随着项目的节奏,伴随着两个极端。所…...
初探RAG
源码 核心工作流程 读取文件的内容将内容保存在向量数据库检索向量数据库用户的问题用户问题 上下文【向量数据】 > LLM 读取文件内容【pdf为例】 from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainerclass PDFFileLoader():d…...
AIGC(生成式AI)技术全景图:从文本到图像的革命
AIGC(生成式AI)技术全景图:从文本到图像的革命 前言 生成式人工智能(AIGC)正以惊人的速度重塑数字内容的生产方式。从GPT系列模型的文本生成,到Stable Diffusion的图像创作,再到Sora的视频合成…...
通信协议:数字世界的隐形语言——从基础认知到工程实践-优雅草卓伊凡
通信协议:数字世界的隐形语言——从基础认知到工程实践-优雅草卓伊凡 一、理解通信协议:数字世界的”隐形语法” 1.1 通信协议的不可见性与现实存在 通信协议如同空气中的无线电波,虽然看不见摸不着,却实实在在支撑着现代数字世…...
RPC复习
RPC复习 RPC (远程过程调用) 全面解析一、RPC 定义与核心作用1. 什么是RPC?2. 核心作用 二、主流RPC框架对比三、RPC适用场景四、RPC的缺陷五、RPC vs REST vs GraphQL六、Java实现案例:使用Dubbo框架案例描述1. 环境准备2. 定义服务接口3. 服务提供方实…...
Express 文件上传不迷路:req.files 一次性讲明白
前言 在开发后台接口的江湖中,文件上传堪称“隐藏副本”,难度不大但坑点极多。本来只想优雅接收一张图片,结果 undefined、报错、路径错乱轮番登场,逼得人想重拾卖烤红薯的梦想。别慌,本文将用轻松幽默的方式,深入拆解 req.files.file 的每个属性,从前端表单到后台处理…...
Leetcode 3530. Maximum Profit from Valid Topological Order in DAG
Leetcode 3530. Maximum Profit from Valid Topological Order in DAG 1. 解题思路2. 代码实现 题目链接:3530. Maximum Profit from Valid Topological Order in DAG 1. 解题思路 这一题的整体思路就是一个动态规划的思路,我们只需要在当前可以访问的…...
Mysql中索引的知识
Mysql中的索引的定义和种类 核心概念:索引是什么? 想象一下你有一本很厚的书,你想找到其中关于某个特定主题的内容。你有两种方法: 从头到尾翻阅整本书:这就像数据库中的全表扫描 (Full Table Scan)。如果书很长&…...
VSCode Verilog编辑仿真环境搭建
VSCode Verilog环境搭建 下载Iverilog安装Iverilog验证安装VS Code安装插件 下载Iverilog 官网下载Iverilog 安装Iverilog 一定要勾选这两项 建议勾选这两项 验证安装 运行Windows PowerShell输入命令:iverilog输入命令:Get-Command gtkwave …...
linux修改环境变量
添加环境变量注意事项。 vim ~/.bashrc 添加环境变量时,需要source ~/.bashrc后才能有效。同时只对当前shell窗口有效,当打开另外的shell窗口时,需要重新source才能起效。 1.修改bashrc文件后 2.source后打开另一个shell窗口则无效ÿ…...
为什么要学习《金刚经》
《金刚经》作为佛教般若经典的核心,以"缘起性空"为思想根基,通过佛陀与须菩提的对话,揭示了破除执著、见真实相的智慧。 以下从核心要义、精髓段落和现实应用三个维度进行解读: 一、核心思想精髓 1. "凡所有相&am…...
【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (上篇)(⭐️⭐️⭐️ 重点章节!!!)
习题集: 【单选题】在大模型微调中,与提示工程和RAG相比,微调的独特优势在于( ) A. 无需外部工具即可提升模型表现 B. 能让模型学习特定领域知识,提升底层能力 C. 可以更高效地检索知识 D. 能直接提升模型的知识边界,无需训练 【多选题】以下关于机器学习和传统编程的说…...
Docker 容器双网卡访问物理雷达网络教程
作者: 陈梓洋 环境: ubuntu 22.04lts 时间: 2025年4月29日 Docker 容器双网卡访问物理雷达网络教程 这个教程适用于这样的场景:容器保留原有 ROS 通信网络(如 bridge 网络),同时需要访问一个物…...
C++:Lambda表达式
C:Lambda表达式 C中lambda的基本语法1. 捕获列表(Capture List)2. 示例代码示例 1:简单的lambda示例 2:捕获变量示例 3:按引用捕获示例 4:捕获所有变量示例 5:作为函数参数 3. lambd…...
Vim 中替换字符或文本
在 Vim 中替换字符或文本可以使用 替换命令(substitute),其基本语法为: :[range]s/old/new/[flags]1. 基本替换 命令说明:s/foo/bar/替换当前行的第一个 foo 为 bar:s/foo/bar/g替换当前行的 所有 foo 为 bar:%s/foo/bar/g替换 …...
Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
主要功能介绍 1.PHP MYSQL开发,开源,方便二次开发。 2.后台管理界面清新 3.可批量导入导出数据,格式为:JsoN、CSV、 Excel等。 4.自适应手机端,PC端 5.数据修改,添加,删除非常方便,手机上就可以解决 6.可以增加管理员权限等 7.界面可以个性定制开发...
OpenAI Embedding 和密集检索(如 BERT/DPR)进行语义相似度搜索有什么区别和联系
OpenAI Embedding 和密集检索(如 BERT/DPR)其实是“同一种思想的不同实现”,它们都属于Dense Retrieval(密集向量检索),只不过使用的模型、部署方式和调用方式不同。 🧠 首先搞清楚:…...
C语言复习笔记--数据在内存中的存储
今天我们来复习一下数据在内存中的存储方式.话不多说进入正题. 整数在内存中的存储 整数的2进制表⽰⽅法有三种,即原码、反码和补码.三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最⾼位…...
笔试专题(十二)
文章目录 主持人调度题解代码 小红的ABC题解代码 不相邻取数题解代码 空调遥控题解代码 主持人调度 题目链接 题解 1. 排序 2. 先按左端点的大小进行排序,保证时间是连续的,如果后一个点的左端点大于等于前一个点的右端点就是和法的,否则…...
Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用---后台调用Python Matplotlib绘制图形
Rust语言最接近Python Matplotlib绘图库的应该是Plotters,但是试用下来还是没有Matplotlib效果好,所以尝试在Tauri Leptos项目中,后台调用Python Matplotlib绘制图形,并返回给前端Leptos展示。 具体效果如下: 1. 前端…...
Qemu-STM32(十七):STM32F103加入AFIO控制器
概述 本文主要描述了在Qemu平台中,如何添加STM32F103的AFIO控制器模拟代码,AFIO是属于GPIO引脚复用配置的功能。 参考资料 STM32F1XX TRM手册,手册编号:RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…...
刀客doc:小红书商业技术负责人苍响离职
根据大厂日爆的爆料,小红书商业化再度迎来高层人事变动,原商业平台技术负责人苍响(薯名),职级L2,已于本月正式离职,其下属团队现由电商业务负责人接管。 根据刀客doc获得的资料,苍响…...
CC52.【C++ Cont】滑动窗口
目录 1.题目 2.分析 方法1:暴力枚举 方法2:暴力枚举的优化:"同向双指针",也称滑动窗口 前置知识 核心操作 例子解释 代码 提交结果 1.题目 LCR 008. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target…...
linux中由于编译选项-D_OS64BIT导致的核心已转储问题
linux中由于编译选项-D_OS64BIT导致的核心已转储问题排查解决: 原因: a.so b.so a.so使用b.so 程序1 程序2 使用a.so 程序1运行正常,程序2启动后提示核心已转储。 程序1和程序2运行的代码都一致,只执行创建xApplication app&…...
Ubuntu搭建 Nginx以及Keepalived 实现 主备
目录 前言1. 基本知识2. Keepalived3. 脚本配置4. Nginx前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRU…...