共享内存 windows和linux
服务端,即写入端
#include <iostream>
#include <string.h>
#define BUF_SIZE 1024
#ifdef _WIN32
#include <windows.h>
#define SHARENAME L"shareMemory"
HANDLE g_MapFIle;
LPVOID g_baseBuffer;
#else
#define SHARENAME "shareMemory"
#include <sys/shm.h>
#include <sys/time.h>
#include <unistd.h>
int g_shmid = -1;
char* g_baseBuffer = NULL;
#endifvoid CloseShareMemory()
{
#ifdef _WIN32if (g_baseBuffer) {FlushViewOfFile(g_baseBuffer, BUF_SIZE);UnmapViewOfFile(g_baseBuffer);g_baseBuffer = NULL;}if (g_MapFIle) {CloseHandle(g_MapFIle);g_MapFIle = NULL;}
#elseshmdt(g_baseBuffer);shmctl(g_shmid, IPC_RMID, 0);//删除
#endif
}bool CreateShareMemory()
{
#ifdef _WIN32if (g_MapFIle)CloseShareMemory();g_MapFIle = CreateFileMapping(INVALID_HANDLE_VALUE, //物理文件句柄NULL, //默认安全级别PAGE_READWRITE, //可读可写0, //高位文件大小BUF_SIZE, //地位文件大小SHARENAME //共享内存名称);if (g_MapFIle) {//映射缓存区视图,得到指向共享内存指针g_baseBuffer = MapViewOfFile(g_MapFIle, //共享内存句柄FILE_MAP_ALL_ACCESS, //可读可写许可0,0,BUF_SIZE);memset(g_baseBuffer, 0, BUF_SIZE);//初始化 置 0 return true;}
#elsekey_t key = ftok(SHARENAME, 0);g_shmid = shmget(key, BUF_SIZE, IPC_CREAT | 0666);if (g_shmid != -1) {g_baseBuffer = (char*)shmat(g_shmid, 0, 0);return true;}
#endifreturn false;
}int main()
{//创建if (!CreateShareMemory()) {std::cout << "CreateShareMemory error!\n";return -1;}//写入数据char ch[1024];while (1) {std::cout << "写入数据或输入exit退出:" << std::endl;std::cin >> ch;if (0 == strcmp(ch, "exit"))break;memcpy(g_baseBuffer, ch, 1024);}//断开 关闭CloseShareMemory();return 0;
}
客户端,即读取端
#include <iostream>
#include <string.h>
#define BUF_SIZE 1024
#ifdef _WIN32
#include <windows.h>
#define SHARENAME L"shareMemory"
HANDLE g_MapFIle;
LPVOID g_baseBuffer;
#else
#define SHARENAME "shareMemory"
#include <sys/shm.h>
#include <sys/time.h>
#include <unistd.h>
int g_shmid = -1;
char* g_baseBuffer = NULL;
#endifvoid CloseShareMemory()
{
#ifdef _WIN32if (g_baseBuffer) {FlushViewOfFile(g_baseBuffer, BUF_SIZE);UnmapViewOfFile(g_baseBuffer);g_baseBuffer = NULL;}if (g_MapFIle) {CloseHandle(g_MapFIle);g_MapFIle = NULL;}
#elseshmdt(g_baseBuffer);//shmctl(g_shmid, IPC_RMID, 0);//删除
#endif
}bool OpenShareMemory()
{
#ifdef _WIN32if (g_baseBuffer)CloseShareMemory();g_MapFIle = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, SHARENAME);if (g_MapFIle) {g_baseBuffer = MapViewOfFile(g_MapFIle, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);return true;}
#elsekey_t key = ftok(SHARENAME, 0);g_shmid = shmget(key, BUF_SIZE, IPC_CREAT | 0666);if (g_shmid != -1) {g_baseBuffer = (char*)shmat(g_shmid, 0, 0);return true;}
#endifreturn false;
}int main()
{while (1) {//打开if (!OpenShareMemory()) {std::cout << "CreateShareMemory error!\n";return -1;}//读取char str[1024];memcpy(str, g_baseBuffer, 1024);memset(g_baseBuffer, 0, BUF_SIZE);if(str[0] != '\0')std::cout << "read value:" << str << std::endl;//断开 关闭CloseShareMemory();
#ifdef _WIN32Sleep(100);
#else#endif}return 0;
}
windows演示图

linux 演示图

相关文章:
共享内存 windows和linux
服务端,即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…...
一个mongodb问题分析
mongodb问题分析 现状 表的个数: 生产上常用的表就10来个。 sharding cluster replica set方式部署: 9个shard server, 每个shard server 1主2从, 大量数据写入时或对大表创建索引时,可能有主从复制延迟问题。实…...
Vue3.0极速入门- 目录和文件说明
目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件说明node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录,基本上要做的事情都在这个目录里assets放置一些图片,如logo等。componentsvue组件…...
RabbitMQ---订阅模型-Direct
1、 订阅模型-Direct • 有选择性的接收消息 • 在订阅模式中,生产者发布消息,所有消费者都可以获取所有消息。 • 在路由模式中,我们将添加一个功能 - 我们将只能订阅一部分消息。 例如,我们只能将重要的错误消息引导到日志文件…...
Django REST framework实现api接口
drf 是Django REST framework的简称,drf 是基于django的一个api 接口实现框架,REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …...
4.19 20
服务端没有 listen,客户端发起连接建立,会发生什么? 服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。 没有 listen&#x…...
(动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】
❓剑指 Offer 10- II. 青蛙跳台阶问题 难度:简单 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97(1000000007),如计算初始结果为:1…...
物联网WIFI 模块AT指令版本七大元凶
前言 目前我们讨论的这个问题,并不是说WIFI方案不具备以应的功能。而是指在同一个AT固件下可能存在的问题。由于各厂商AT指令的开发深度不同,导致各厂商之间的AT指令差异很大。我总结了一些问题,可能是导致目前AT指令不好用元凶。 底层库问题…...
Qt 正则(数据格式校验、替换指定格式数据、获取匹配数据)
头文件引用 #include <QRegExp>初始化QRegExp实列 QRegExp re("^\\d{1,3},\\d{1,3}$");数据格式验证 QRegExp re("^\\d{1,3},\\d{1,3}$"); QString msg "12,33"; if(re.exactMatch()){// 验证通过 }else{//验证不通过 }替换数…...
网络层协议——ip
文章目录 1. 网络层2. IP协议2.1 协议头格式 3. 网段划分3.1 特殊的IP地址3.2 IP地址的数量限制 4. 私有IP地址和公网IP地址 1. 网络层 在应用层解决了如何读取完整报文、序列化反序列化、协议处理问题。在传输层解决了可靠性问题。那么网络层IP的作用是在复杂的网络环境中确定…...
Qt6和Rust结合构建桌面应用
桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开…...
Kubernetes(K8S)简介
Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…...
面试中问:React中函数组件和class组件的区别,hooks模拟生命周期
React中函数组件和class组件的区别,hooks模拟生命周期 React中函数组件和class组件的区别hooks模拟生命周期 React中函数组件和class组件的区别 函数组件: 定义:函数组件是使用纯函数定义的组件,它接受 props 作为参数并返回 JSX。简洁性&am…...
Python高光谱遥感数据处理与高光谱遥感机器学习方法应用
本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…...
Java实现接收xml格式数据并解析,返回xml格式数据
需求描述:后端接受xml格式数据,解析出相应数据,并返回xml格式数据。 <!--XML解析--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>…...
【C++】初步认识模板
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、泛型编程二、函数模板2.1 函…...
Ansible 临时命令搭建安装仓库
创建一个名为/ansible/yum.sh 的 shell 脚本,该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库. 存储库1: 存储库的名称为 EX294_BASE 描述为 EX294 base software 基础 URL 为 http://content/rhel8.0/x86_64/dvd/BaseOS GPG 签名检查为…...
phpstorm动态调试
首先在phpstudy搭建好网站,在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…...
二叉树的层序遍历及完全二叉树的判断
文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…...
java八股文面试[JVM]——JVM内存结构
参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构: 方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实…...
Mermaid:文本驱动的可视化引擎深度指南
Mermaid:文本驱动的可视化引擎深度指南 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图的开发者。 …...
Python实战:用LangGraph和MCP打造你的第一个AI代理(附完整代码)
Python实战:用LangGraph和MCP构建智能代理的完整指南 在当今快速发展的AI领域,构建能够理解和执行复杂任务的智能代理已成为开发者关注的焦点。本文将带您深入了解如何利用LangGraph框架和模型上下文协议(MCP)构建一个功能完备的AI代理,从基础…...
打造轻量级Windows系统:Tiny11Builder深度应用指南
打造轻量级Windows系统:Tiny11Builder深度应用指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 价值定位:解决三大系统痛点 你的Windo…...
OpenClaw技能扩展:用QwQ-32B实现公众号自动发布
OpenClaw技能扩展:用QwQ-32B实现公众号自动发布 1. 为什么需要公众号自动化发布 作为一个技术博主,我每周都要在公众号发布2-3篇技术文章。最让我头疼的不是写作本身,而是发布前的繁琐流程:手动调整Markdown格式、生成封面图、上…...
雀魂AI助手Akagi:5分钟搭建你的专属麻将教练
雀魂AI助手Akagi:5分钟搭建你的专属麻将教练 【免费下载链接】Akagi A helper client for Majsoul 项目地址: https://gitcode.com/gh_mirrors/ak/Akagi 你是否曾在雀魂游戏中面对复杂牌局不知所措?是否想提升麻将技巧却苦于没有专业指导…...
OpenClaw安全加固指南:nanobot镜像的防火墙与权限配置
OpenClaw安全加固指南:nanobot镜像的防火墙与权限配置 1. 为什么需要安全加固? 当我第一次在本地部署OpenClaw时,最让我忐忑不安的就是安全问题。这个能操控我鼠标键盘、读写文件的AI助手,会不会不小心删掉我的重要文档…...
SpringBoot+Vue社区老年人帮扶系统源码+论文
代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...
Keepalived+Nginx+Tomcat 高可用项目集成 MySQL 数据库全记录
前言在之前的文章中,我搭建了基于 KeepalivedNginxTomcat 的高可用 Web 架构,实现了入口 VIP 漂移和反向代理。但这套架构还缺少“数据层”——所有服务都是无状态的,不能持久化数据。为了让项目更完整,我决定加入 MySQL 数据库&a…...
多模态扩展实验:OpenClaw+Qwen3-32B处理图片描述生成
多模态扩展实验:OpenClawQwen3-32B处理图片描述生成 1. 实验背景与动机 最近在探索如何将OpenClaw的自动化能力扩展到视觉领域。作为一个长期依赖文本交互的框架,OpenClaw能否结合多模态大模型处理图像任务?这引发了我的兴趣。恰好手头有台…...
从数据流视角看训练:你的GPU/TPU是如何‘吃’数据的?Epoch、Batch与迭代的硬件协同
从数据流视角看训练:你的GPU/TPU是如何‘吃’数据的?Epoch、Batch与迭代的硬件协同 当你在深夜盯着屏幕上缓慢跳动的训练进度条时,是否好奇过那些被吞进GPU的数据究竟经历了怎样的旅程?本文将带你从硬件执行层的独特视角ÿ…...
