共享内存操作梳理
bcu_shared.c 共享内存操作梳理仅梳理 SQlite/bcu_shared.c 中 POSIX 共享内存的创建、初始化、互斥锁配置及清理全流程。一、涉及的全部共享内存 APIAPI次数作用shm_open1创建/打开共享内存返回文件描述符ftruncate1设定共享内存大小mmap1将共享内存映射到进程地址空间memcpy1将数据库数据整体复制进共享内存pthread_mutexattr_init1初始化互斥锁属性pthread_mutexattr_setpshared1设置属性为进程间共享pthread_mutex_init1在共享内存中初始化互斥锁pthread_mutexattr_destroy1销毁互斥锁属性munmap1解除内存映射代码存在但不可达shm_unlink1删除共享内存代码存在但不可达二、操作时序shm_open() │ ▼ ftruncate() │ ▼ mmap() │ ▼ memcpy() ← 把从 SQLite 加载的5张表数据整体拷入共享内存 │ ▼ pthread_mutexattr_init() │ ▼ pthread_mutexattr_setpshared() ← 关键设为 PTHREAD_PROCESS_SHARED │ ▼ pthread_mutex_init() │ ▼ while(1) { sleep(1); } ← 常驻保持共享内存存活 ▼ (不可达) munmap() shm_unlink() ← 正常清理逻辑但死循环导致永远走不到三、逐步骤详解1.shm_open— 创建共享内存shm_fdshm_open(/bcu_shared_data,O_CREAT|O_RDWR,0666);参数含义/bcu_shared_data共享内存名称其他进程通过同一个名字 attachO_CREAT | O_RDWR不存在则创建以读写方式打开0666权限位所有用户可读写返回值是文件描述符整数在 Linux 上位于/dev/shm/bcu_shared_data。注意此时共享内存大小为 0还不能用。2.ftruncate— 设定大小ftruncate(shm_fd,sizeof(ShareData));把共享内存撑大到sizeof(ShareData)字节。ShareData结构体包含 6 个 Sheet每个放 50 个PointValuepthread_mutex_t大约 26KB。失败则close(shm_fd)并退出。3.mmap— 映射到进程地址空间g_sharedmmap(NULL,sizeof(ShareData),PROT_READ|PROT_WRITE,MAP_SHARED,shm_fd,0);参数含义NULL内核自动选择映射地址sizeof(ShareData)映射大小PROT_READ | PROT_WRITE可读可写MAP_SHARED关键标志修改对所有进程可见shm_fd文件描述符0偏移量从头开始成功返回指向共享内存的指针g_shared之后可以像普通内存一样读写修改会同步到所有 attach 的进程。4.memcpy— 整体复制数据memcpy(g_shared,temp,sizeof(ShareData));在此之前load_sheet_data()已将 5 张 SQLite 表加载到栈上的临时变量ShareData temp。这一步一次性整体拷贝进共享内存所有后续进程看到的就是这份数据。5. 互斥锁初始化 — 进程间同步pthread_mutexattr_tmutex_attr;pthread_mutexattr_init(mutex_attr);pthread_mutexattr_setpshared(mutex_attr,PTHREAD_PROCESS_SHARED);pthread_mutex_init(g_shared-mutex,mutex_attr);pthread_mutexattr_destroy(mutex_attr);这是一个四步走的标准流程步骤函数说明创建属性对象pthread_mutexattr_init在栈上初始化属性结构体设为进程间共享pthread_mutexattr_setpshared核心不加这个标志锁只在单进程内有效初始化锁pthread_mutex_init在共享内存上创建锁所有进程可用销毁属性pthread_mutexattr_destroy栈上的属性对象用完释放之后其他进程如rtu使用LOCK(gbcu_shared-mutex)/UNLOCK(...)即可跨进程同步。6. 常驻循环while(1){sleep(1);}唯一目的保持进程存活。一旦进程退出共享内存虽然不会立即消失还有进程 attach 的话但创建者退出意味着无人负责清理。7. 清理逻辑不可达munmap(g_shared,sizeof(ShareData));// 解除映射close(shm_fd);// 关闭文件描述符shm_unlink(/bcu_shared_data);// 删除共享内存信号处理已注释signal(SIGINT, ...)被注释掉while(1)死循环使得这段代码永不执行。进程只能被kill强制终止。四、其他进程如何 attachrtu.c等进程通过相同 API 附加同一块共享内存// rtu.c 中对应的操作不在本文件仅做对照shm_fdshm_open(/bcu_shared_data,O_RDWR,0);// 名称必须一致gbcu_sharedmmap(NULL,sizeof(ShareData),PROT_READ|PROT_WRITE,MAP_SHARED,shm_fd,0);// 使用LOCK(gbcu_shared-mutex);get_bcu_shared_point_value(系统状态管理、开关控制,120,val);UNLOCK(gbcu_shared-mutex);名称/bcu_shared_data是连接双方的关键约定。五、总结bcu_shared.c的共享内存操作遵循 POSIX 标准五步走shm_open → ftruncate → mmap → 写入数据 → 初始化进程间锁 → 常驻设计要点一次搬运SQLite → 临时结构体 →memcpy进共享内存之后再也不碰数据库进程间锁PTHREAD_PROCESS_SHARED保证多个进程可以安全地并发读写名称约定/bcu_shared_data是跨进程 attach 的唯一标识常驻不退出用死循环维持共享内存生命周期代价是清理代码不可达

相关新闻

风丘助力混合动力汽车工况测试:精准采集整车信号解决方案

风丘助力混合动力汽车工况测试:精准采集整车信号解决方案

一 、背景 混合动力汽车是介于纯电动汽车与燃油汽车两者之间的一种新能源汽车。它既包含纯电动汽车无污染、启动快的优势,又拥有燃油车续航便捷、不受电池容量限制的特点。在当前环境下,混合动力汽车比纯电动汽车更符合目前的市场需求。然而,…

2026/6/24 23:19:34阅读更多 →
windows系统安装Python + Pycharm教程【新手简洁版】

windows系统安装Python + Pycharm教程【新手简洁版】

python 解释器:将我们写的Python代码转换为二进制 pycharm :编译python代码的软件工具 1.安装python 1.1下载Python安装包 网址:Python Releases for Windows | Python.org 找到download --->选择你要的版本(推荐3.13.*&a…

2026/6/23 19:45:53阅读更多 →
计算机毕业设计之高校教室场馆资产管理系统

计算机毕业设计之高校教室场馆资产管理系统

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括高校教室场馆资产管理系统的网络应用,在外国高校教室场馆资产管理已经是很普遍的方式,不过国内的高校教室场馆资产管理可能还处于起步阶段。高校教室场…

2026/6/24 20:42:24阅读更多 →
MPC862程序流追踪与硬件调试:从原理到实战解决嵌入式通信系统难题

MPC862程序流追踪与硬件调试:从原理到实战解决嵌入式通信系统难题

1. MPC862程序流追踪:从硬件原理到实战调试在嵌入式通信系统的开发里,最让人头疼的莫过于程序“跑飞”了。你看着板子上的指示灯乱闪,串口输出一堆乱码,但就是不知道CPU到底执行了哪条指令、在哪个分支上出了问题。尤其是在像MPC8…

2026/6/24 23:23:10阅读更多 →
基于Tor Hidden Service的匿名通信系统Ricochet架构深度解析

基于Tor Hidden Service的匿名通信系统Ricochet架构深度解析

1. 项目概述:为什么我们需要一个“终极”匿名通信方案?在数字世界里,隐私和匿名性正变得越来越奢侈。我们每天使用的即时通讯工具,无论是微信、Telegram还是Signal,都在不同程度上依赖于中心化的服务器。这意味着&…

2026/6/24 23:23:10阅读更多 →
多重冒号(::)在编程中的核心作用:从命名空间到代码组织

多重冒号(::)在编程中的核心作用:从命名空间到代码组织

1. 项目概述:从“多重冒号”到代码的优雅表达最近在代码审查和开源项目里,我时不时会看到一个叫“Multiple-Colon”的讨论点。乍一看这个标题,你可能会有点懵:冒号不就是个标点吗,还能玩出什么花样?但如果你…

2026/6/24 23:23:10阅读更多 →
LINPACK基准测试:从原理到实战,全面解析HPC性能评估金标准

LINPACK基准测试:从原理到实战,全面解析HPC性能评估金标准

1. 项目概述:从“超级计算机的标尺”到“无处不在的性能度量”如果你在服务器、高性能计算(HPC)甚至个人电脑的评测里,看到过“双精度浮点性能达到XX TFlops”这样的描述,那背后十有八九站着LINPACK的身影。LINPACK Be…

2026/6/24 23:23:10阅读更多 →
OpenClaw:面向业务流程的智能体操作系统架构解析

OpenClaw:面向业务流程的智能体操作系统架构解析

1. OpenClaw 不是“另一个 Agent 框架”,而是面向真实业务流的智能体操作系统 你点开 GitHub 上 OpenClaw 的 README,第一眼看到的不是“支持多模型”“内置 20 Skill”,而是一张带虚线边框的三层架构图:最上层写着 Business Fl…

2026/6/24 23:23:10阅读更多 →
Claude Code Auto Mode:CLI驱动的VS Code智能协同范式

Claude Code Auto Mode:CLI驱动的VS Code智能协同范式

1. Auto Mode不是“全自动”,而是Claude Code里最被误解的交互范式很多人第一次看到“Claude Code Auto Mode”这个名称,下意识就联想到“代码全自动生成”“不用敲一个字就能跑通项目”——我刚接触时也这么想。结果在VS Code里点开Auto Mode&#xff0…

2026/6/24 23:18:07阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/24 7:33:03阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/25 2:52:24阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/24 7:37:00阅读更多 →