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

Windows和Linux内存共享机制

Windows和Linux内存共享机制

  • 引言
  • 1.Windows
    • 写操作
    • 读操作
  • 2.Linux
    • 写操作
    • 读操作
  • 3.Shell
      • 使用 tmux 运行 write 和 read
      • 说明


引言

在嵌入式开发领域,内存共享机制作为不同操作系统间实现高效数据交换的重要手段,尤其在对实时性和可靠性要求极高的环境中更为关键。近年来,随着ARINC 653标准的广泛应用,通过VxWorks仿真模拟器在Windows和Linux操作系统间建立内存共享机制已成为确保任务间稳定、同步运行的重要实现手段。本篇博客将深入探讨Windows和Linux各自的内存共享机制,结合ARINC 653标准在VxWorks中的实际应用,剖析其实现原理和实际使用中的关键技术,帮助读者更好地理解内存共享在跨平台环境中的应用场景与优势。

1.Windows

写操作


#include <windows.h>
#include <stdio.h>
#include <string.h>  // 用于字符串操作int main() {// 创建文件映射对象,大小为32字节HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,    // 使用系统分页文件NULL,                    // 默认安全性PAGE_READWRITE,          // 读写权限0,                       // 最大对象大小(高位)1024,                      // 最大对象大小(低位),32字节"Local\\MySharedMemory"   // 映射对象名称);if (hMapFile == NULL) {printf("Could not create file mapping object (%d).\n", GetLastError());return 1;}// 将文件映射到进程的地址空间LPVOID pBuf = MapViewOfFile(hMapFile,              // 文件映射对象句柄FILE_MAP_ALL_ACCESS,   // 读写权限0,                     // 偏移高位0,                     // 偏移低位32                     // 映射的字节数);if (pBuf == NULL) {printf("Could not map view of file (%d).\n", GetLastError());CloseHandle(hMapFile);return 1;}// 无限循环让用户输入数据并写入共享内存char input[32];while (1) {printf("Enter message to write to shared memory (up to 31 characters): ");fgets(input, sizeof(input), stdin);  // 从用户处读取输入input[strcspn(input, "\n")] = '\0';  // 移除换行符// 将用户输入的数据写入共享内存memcpy(pBuf, input, strlen(input) + 1);  // +1 是为了复制结束符printf("Data written to shared memory: %s\n", (char*)pBuf);}// 解除内存映射UnmapViewOfFile(pBuf);// 关闭文件映射对象句柄CloseHandle(hMapFile);return 0;
}

读操作


#include <windows.h>
#include <stdio.h>int main() {// 打开现有的文件映射对象HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,   // 访问权限FALSE,                 // 不继承句柄"Local\\MySharedMemory" // 映射对象名称);if (hMapFile == NULL) {printf("Could not open file mapping object (%d).\n", GetLastError());return 1;}// 映射文件视图到进程的地址空间LPVOID pBuf = MapViewOfFile(hMapFile,              // 文件映射对象句柄FILE_MAP_ALL_ACCESS,   // 读写权限0,                     // 偏移高位0,                     // 偏移低位32                     // 映射的字节数);if (pBuf == NULL) {printf("Could not map view of file (%d).\n", GetLastError());CloseHandle(hMapFile);return 1;}// 无限循环读取共享内存的数据while (1) {printf("Data read from shared memory: %s\n", (char*)pBuf);Sleep(1000);  // 每秒读取一次}// 解除内存映射UnmapViewOfFile(pBuf);// 关闭文件映射对象句柄CloseHandle(hMapFile);return 0;
}

2.Linux

写操作


#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>int main() {// 打开或创建共享内存对象int shm_fd = shm_open("/my_shared_memory", O_CREAT | O_RDWR, 0666);if (shm_fd == -1) {perror("shm_open");return 1;}// 配置共享内存大小ftruncate(shm_fd, 1024);  // 设置大小为1024字节// 映射共享内存到进程地址空间void* ptr = mmap(0, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);if (ptr == MAP_FAILED) {perror("mmap");return 1;}// 无限循环让用户输入数据并写入共享内存char input[1024];while (1) {printf("Enter message to write to shared memory: ");fgets(input, sizeof(input), stdin);  // 从用户处读取输入input[strcspn(input, "\n")] = '\0';  // 移除换行符// 将用户输入的数据写入共享内存memcpy(ptr, input, strlen(input) + 1);  // +1 是为了复制结束符printf("Data written to shared memory: %s\n", (char*)ptr);}// 解除内存映射munmap(ptr, 1024);// 关闭共享内存对象close(shm_fd);shm_unlink("/my_shared_memory");return 0;
}

读操作


#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>int main() {// 打开现有的共享内存对象int shm_fd = shm_open("/my_shared_memory", O_RDONLY, 0666);if (shm_fd == -1) {perror("shm_open");return 1;}// 映射共享内存到进程地址空间void* ptr = mmap(0, 1024, PROT_READ, MAP_SHARED, shm_fd, 0);if (ptr == MAP_FAILED) {perror("mmap");return 1;}// 无限循环读取共享内存的数据while (1) {printf("Data read from shared memory: %s\n", (char*)ptr);// sleep(1);  // 每秒读取一次}// 解除内存映射munmap(ptr, 1024);// 关闭共享内存对象close(shm_fd);return 0;
}

3.Shell

这里的shell由于要开两个终端所以不能使用SSH会话或者处于不能使用图形化界面的终端

#!/bin/bash# 编译 read.c 和 write.c
gcc - o write write.c - lrt   #  - lrt 是在一些系统上链接实时库所需的
gcc - o read read.c - lrt# 检查编译是否成功
if [[ !- f "write" || !- f "read" ]]; then
echo "Compilation failed!"
exit 1
fi# 在新终端中运行 write 程序
gnome - terminal -- bash - c "./write; exec bash" &# 在新终端中运行 read 程序
gnome - terminal -- bash - c "./read; exec bash" &# 等待所有后台进程结束
wait

如果只是在命令行界面下运行程序,可以使用 screentmux 工具来在多个会话中运行 writeread 程序。这里是如何做到这一点的。

使用 tmux 运行 write 和 read

  1. 安装 tmux(如果尚未安装):

    sudo apt install tmux  # Debian/Ubuntu 系统
    sudo yum install tmux  # CentOS/RHEL 系统
    
  2. 创建新的 Memory_Sharing.sh 脚本
    修改 Memory_Sharing.sh 脚本以使用 tmux

    #!/bin/bash# 编译 read.c 和 write.c
    gcc -o write write.c -lrt   # -lrt 是在一些系统上链接实时库所需的
    gcc -o read read.c -lrt# 检查编译是否成功
    if [[ ! -f "write" || ! -f "read" ]]; thenecho "Compilation failed!"exit 1
    fi# 创建一个新的 tmux 会话,命名为 "memory_sharing"
    tmux new-session -d -s memory_sharing# 在第一个窗格中运行 write 程序
    tmux send-keys -t memory_sharing './write' C-m# 在新窗格中运行 read 程序
    tmux split-window -h
    tmux send-keys -t memory_sharing './read' C-m# 附加到 tmux 会话
    tmux attach-session -t memory_sharing
    

说明

  1. 创建 tmux 会话

    • tmux new-session -d -s memory_sharing 创建一个新的后台会话。
  2. 在窗格中运行程序

    • tmux send-keys -t memory_sharing './write' C-m 在第一个窗格中运行 write 程序。
    • tmux split-window -h 创建一个新的窗格,并在其中运行 read 程序。
  3. 附加到会话

    • tmux attach-session -t memory_sharing 附加到创建的 tmux 会话,可以看到两个程序的输出。

运行该脚本后,将在 tmux 中看到 writeread 程序的输出。按 Ctrl + b 然后按 c 可以创建新的窗格,按 Ctrl + b 然后按 o 切换窗格,按 Ctrl + b 然后按 d 可以分离会话。

相关文章:

Windows和Linux内存共享机制

Windows和Linux内存共享机制 引言1.Windows写操作读操作 2.Linux写操作读操作 3.Shell使用 tmux 运行 write 和 read说明 引言 在嵌入式开发领域&#xff0c;内存共享机制作为不同操作系统间实现高效数据交换的重要手段&#xff0c;尤其在对实时性和可靠性要求极高的环境中更为…...

windows@命令行中获取环境变量取值不展开取值(原值)

文章目录 命令行中获取环境变量取值获取不展开的值具体实现注解 封装为函数版本1版本2 命令行中获取环境变量取值 这里主要讨论获取未展开的值本来获取未展开的值应该作为默认选项,至少有合适的api方便直接调用,但是不知道微软怎么想的,让这个任务变得不直接 获取不展开的值 …...

如何找到多平台内容爆款进行批量复刻?

为了进一步扩大品牌社媒影响力&#xff0c;在消费者做决策的时候&#xff0c;能够第一时间出现在首选位置。持续在抖音、小红书、b站、公众号等各大社媒平台&#xff0c;产生连续的、正向的高质量品牌曝光&#xff0c;是非常重要的。如何进行这种多平台品牌影响力的提升呢&…...

【UML】- 用例图(结合银行案例解释其中的奥义)

目录 一、相关介绍 作用&#xff1a; 组成&#xff1a; 关系 二、使用具体银行案例解释各组成部分的含义 1、系统 2、参与者 3、用例 4、关联关系 5、扩展关系 6、泛化&#xff08;继承&#xff09;关系 三、成品 一、相关介绍 作用&#xff1a; 用例图可以描述一个…...

浅谈UI自动化

⭐️前言⭐️ 本篇文章围绕UI自动化来展开&#xff0c;主要内容包括什么是UI自动化&#xff0c;常用的UI自动化框架&#xff0c;UI自动化原理等。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题…...

三、k8s快速入门之Kubectl 命令基础操作

⭐️创建Pod [rootmaster ~]# kubectl run nginx --imageharbor.tanc.com/library/ngix:latest kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be rmoved in a future version. Use kubectl run --generatorrun-pod/v1 or kbectl create instead. deplo…...

深度学习-BP算法详解

BP&#xff08;Back Propagation&#xff0c;反向传播&#xff09;是训练神经网络的重要算法之一。它通过计算误差并将误差反向传播&#xff0c;以更新神经网络中的权重和偏置&#xff0c;进而使模型更好地拟合数据。 1. BP算法的基本原理 反向传播的基本思想是&#xff1a; …...

Java审计对比工具JaVers使用

最近有个需求&#xff0c;需要将页面的内容生成excel或者word文档&#xff0c;而且每次的修改都需要生成新的版本&#xff0c;同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象&#xff0c;同时存储到数据库一条新数据&#xff0c;对应数据表一…...

unity中预制体的移动-旋转-放缩

unity中预制体的移动-旋转-放缩 左上侧竖栏图标介绍Tools(手形工具)Move Tool(移动工具&#xff0c;单位米)Rotate Tool(旋转工具&#xff0c;单位角度)Scale Tool(缩放工具&#xff0c;单位倍数)Rect Tool(矩形工具)Transform Tool(变换工具)图标快捷键对照表工具使用的小技巧…...

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的&#xff1a;首先需要明确测试的目的&#xff0c;即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求&#xff1a;深入了解系统的业务特性&#xff0c;包括用户行…...

ubuntu常用基本指令简记

一、在线帮助 1、help Linux命令可以分为内部命令和外部命令&#xff0c;内部命令就是由Linux默认Shell-bash提供的命令&#xff0c;而非bash提供的命令就是外部命令。 对于内部命令&#xff0c;可以使用help命令来获取帮助 形式为 help 指令 2、man 在日常使用中碰到的绝…...

【解决方案】用git reset --hard重置了提交但是发现reset了一些本不该reset的内容,是不是寄了?

使用 git reset --hard [commit_id] 命令后&#xff0c;所有的更改&#xff08;包括暂存区和工作区的更改&#xff09;都会被重置到指定的提交。如果想要撤销这个操作&#xff0c;恢复到重置之前的状态&#xff0c;可以尝试以下方法&#xff1a; 1. 使用 Git Reflog 恢复 Git…...

ACM模式下Java读取控制台输入注意事项及输出规范化

背景 在ACM模式下。需要我们去接受输入的参数&#xff0c;一般是使用Scanner去读取控制台输入的参数System.in。 不熟悉的情况下&#xff0c;很容易出现问题&#xff0c;针对常见的问题做一个总结。 一、nextXxx 如next&#xff0c;nextInt&#xff0c;nextFloat&#xff0c…...

面试题整理 2

总结了本次面试遇到的值得整理记录的面试题。 目录 变量赋值判断 变量判断 Foreach使用 Mysql优化策略 合理的索引设计 查询优化 数据表结构设计 配置优化 合理使用事务 定期维护数据库 使用缓存 监控与性能分析 Redis主从复制 介绍 配置 示例 Redis 数据类型…...

华为自研仓颉编程语言官网上线 首个公测版本开放下载

仓颉编程语言官网正式公开上线&#xff0c;同时首个公测版本开放下载。本次仓颉编程语言官网上线了首页、在线体验、文档、学习、下载、动态以及三方库共六个模块&#xff0c;可供开发和学习和体验。 据悉&#xff0c;仓颉编程语言是在今年6月的华为开发者大会上正式公布&…...

NVR监测软件/设备EasyNVR多品牌NVR管理工具/设备对城市安全有哪些具体益处?

在智慧城市的建设中&#xff0c;各种先进的技术系统正发挥着越来越重要的作用。其中&#xff0c;NVR监测软件/设备EasyNVR作为一种高效的视频边缘计算网关&#xff0c;不仅能够实现视频数据的采集、编码和存储&#xff0c;还能与其他智慧城市系统进行深度集成&#xff0c;共同推…...

MFC工控项目实例二十八模拟量信号每秒采集100次

用两个多媒体定时器&#xff0c;一个定时0.1秒计时&#xff0c;另一个定时0.01秒用来对模拟量信号采集每秒100次。 1、在SEAL_PRESSUREDlg.h中添加代码 class CSEAL_PRESSUREDlg : public CDialo { public:CSEAL_PRESSUREDlg(CWnd* pParent NULL); // standard constructor&a…...

安装scrcpy-client模块av模块异常,环境问题解决方案

背景 使用 pip install scrcpy-client命令出现以下报错 performance hint: av\logging.pyx:232:5: Exception check on log_callback will always require the GIL to be acquired. Possible solutions: 1. Declare log_callback as noexcept if you control the definition …...

硅谷甄选(11)角色管理

角色管理模块 10.1 角色管理模块静态搭建 还是熟悉的组件&#xff1a;el-card、el-table 、el-pagination、el-form <template><el-card><el-form :inline"true" class"form"><el-form-item label"职位搜索"><el-…...

C语言结构体 变量对齐原理

以32位Linux为例&#xff0c;默认对齐值是4. 对齐原则通常有以下几种&#xff1a; 第一个成员在与结构体变量偏移量为0的地址处。其他成员变量要对齐到某个数字&#xff08;对齐参数&#xff09;的整数倍的地址上。结构体总大小为最大对齐参数的整数倍。嵌套结构体要对齐到…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...