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

共享内存 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 演示图
在这里插入图片描述

http://www.lryc.cn/news/140830.html

相关文章:

  • 一个mongodb问题分析
  • Vue3.0极速入门- 目录和文件说明
  • RabbitMQ---订阅模型-Direct
  • Django REST framework实现api接口
  • 4.19 20
  • (动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】
  • 物联网WIFI 模块AT指令版本七大元凶
  • Qt 正则(数据格式校验、替换指定格式数据、获取匹配数据)
  • 网络层协议——ip
  • Qt6和Rust结合构建桌面应用
  • Kubernetes(K8S)简介
  • 面试中问:React中函数组件和class组件的区别,hooks模拟生命周期
  • Python高光谱遥感数据处理与高光谱遥感机器学习方法应用
  • Java实现接收xml格式数据并解析,返回xml格式数据
  • 【C++】初步认识模板
  • Ansible 临时命令搭建安装仓库
  • phpstorm动态调试
  • 二叉树的层序遍历及完全二叉树的判断
  • java八股文面试[JVM]——JVM内存结构
  • Kafka基本使用
  • 【目标检测】理论篇(2)YOLOv3网络构架及其代码实现
  • k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC
  • IDEA项目实践——Element UI概述
  • Docker 容器学习笔记
  • Day03-vue基础
  • RAC sid=‘*‘ 最好加上 v$system_parameter
  • 【位运算进阶之----左移(<<)】
  • 石油石化行业网络监控运维方案,全局态势感知,实时预警
  • MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理
  • Diffusion Models for Image Restoration and Enhancement – A Comprehensive Survey