2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client C++实现

和IOServer主要差别:
1 使用Open_Client 连接
2 一定要先打开IOServer,再打开IO_Client

效果显示

在这里插入图片描述

1 C++ 代码实现

1.1 shareddataClient.h 头文件中引用

和shareddataServer.h 一样需要引入相应的头文件

 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)#define WIN32_LEAN_AND_MEAN             //  从 Windows 头文件中排除极少使用的信息#include <windows.h>
#elif defined(linux) || defined(__linux)#include <string.h>#include <sys/mman.h>#include <fcntl.h>#include <unistd.h> 
#endif 
1.2 shareddataClient.h 主要调用接口
1.2.1 预定义变量名称,为了能够Linux|Windows下通用
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)   #elif defined(linux) || defined(__linux)typedef void *HANDLE;typedef void *LPVOID;typedef long long __int64;typedef __int64 LONG_PTR, *PLONG_PTR;typedef unsigned long long ULONG_PTR;typedef unsigned long long  *PULONG_PTR; typedef int BOOL; #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
#endif
1.2.2 函数接口定义
namespace SHAREDDATA
{typedef unsigned char uchar;BD_API  int  GetIOData(uchar* p_IOData, int start, int len);
BD_API  int  SetIOData(uchar* p_IOData, int start, int len);
BD_API  int  SetDM8(uchar* p_DM8, int start, int len);
BD_API  int  GetDM8(uchar* p_DM8, int start, int len);
BD_API  int  GetDM16(uchar* p_DM16, int start, int len);
BD_API  int  SetDM16(uchar* p_DM16, int start, int len); /*** ************************************************************************************************ @brief ReleaseMMF* 销毁资源* * @return BD_API * ************************************************************************************************/
BD_API void ReleaseMMF();
/*** ************************************************************************************************ @brief * * * @return BD_API * ************************************************************************************************/
BD_API int Open_Client();
1.3 shareddataClient.cpp 函数接口实现

namespace SHAREDDATA
{ #pragma region MMF 内存共享 IO 区// 创建共享文件句柄 HANDLE hMapFile_IO = INVALID_HANDLE_VALUE;// 文档句柄int  fd_io=-1;#pragma endregion MMF 内存IO 区#pragma region MMF 内存共享 DM8 区// 创建共享文件句柄 HANDLE hMapFile_DM8 = INVALID_HANDLE_VALUE;// 文档句柄int  fd_dm8=-1;#pragma endregion MMF 内存DM8 区#pragma region MMF 内存共享 DM16 区// 创建共享文件句柄 HANDLE hMapFile_DM16 = INVALID_HANDLE_VALUE;// 文档句柄int  fd_dm16=-1;#pragma endregion MMF 内存DM16 区
}
/*** SHAREDDATA * 文件共享方式进行通讯*/
namespace SHAREDDATA
{ LPVOID  MapViewofFile_New(HANDLE handle,const int& fd, const int& size) {LPVOID lpBase=nullptr;if(handle==nullptr||size==0)return lpBase;#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)   // 映射缓存区视图 , 得到指向共享内存的指针lpBase = MapViewOfFile(handle,            // 共享内存的句柄FILE_MAP_ALL_ACCESS, // 可读写许可0,0,size);#elif defined(linux) || defined(__linux)if(fd<0)return nullptr;// map memory to filelpBase = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);#endifreturn lpBase;}void  UnMapViewofFile_New(HANDLE handle,const int& size){if(handle==nullptr||size==0)return ;#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)   // 解除文件映射UnmapViewOfFile(handle);#elif defined(linux) || defined(__linux)// unmap and closemunmap(handle, size);#endif    return;}
/*** ************************************************************************************************ @brief * Create_Server* 创建一个server* * @return BD_API * ************************************************************************************************/BD_API int  Open_Client()
{int nRet = 0; try{ 	#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)hMapFile_IO = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, "ShareMemoryIO");if (hMapFile_IO != INVALID_HANDLE_VALUE && hMapFile_IO>0)nRet = 0;else return  -1;// &1 DM8//&1 DM8 hMapFile_DM8 =  OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, "ShareMemoryDM8");if (hMapFile_DM8 != INVALID_HANDLE_VALUE && hMapFile_DM8 > 0)nRet = 0;else return -1;// &2 DM16hMapFile_DM16 = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, "ShareMemoryDM16");if (hMapFile_DM16 != INVALID_HANDLE_VALUE && hMapFile_DM16 > 0)nRet = 0;else return -1;#elif defined(linux) || defined(__linux)// specify shared file path// 路径一定要存在,否则会报警// &0 DMIOstring  shared_file_io = path+"ShareMemoryIO";fd_io = open(shared_file_io.c_str(), O_CREAT | O_RDWR | O_TRUNC, 00777);if (fd_io < 0){cout << "create file error" << endl;return -1; }ftruncate(fd_io, n_max_IO_uchars); // extend file size// &0 DM8string shared_file_dm8 = path+"ShareMemoryDM8";fd_dm8 = open(shared_file_dm8.c_str(), O_CREAT | O_RDWR | O_TRUNC, 00777);if (fd_dm8 < 0){cout << "create file error" << endl;return -1;}ftruncate(fd_dm8, n_max_DM8s); // extend file size// map memory to file//hMapFile_DM8 = mmap(NULL, n_max_DM8s,    , PROT_READ | PROT_WRITE, MAP_SHARED, fd_dm8, 0);// &0 DM16string shared_file_dm16= path+"ShareMemoryDM16";fd_dm16 = open(shared_file_dm8.c_str(), O_CREAT | O_RDWR | O_TRUNC, 00777);if (fd_dm16 < 0){cout << "create file error" << endl;return -1;}ftruncate(fd_dm16, n_max_DM16s); // extend file size     #endif}catch (exception& e){nRet = -1;}return nRet;
}
#pragma region  销毁共享文件 句柄
// 销毁内存 MMF 句柄
BD_API void ReleaseMMF()
{
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)  if (hMapFile_IO != NULL)CloseHandle(hMapFile_IO);if (hMapFile_DM8 != NULL)CloseHandle(hMapFile_DM8);if (hMapFile_DM16 != NULL)CloseHandle(hMapFile_DM16); 
#elif defined(linux) || defined(__linux)if(fd_io>=0)close(fd_io);if(fd_dm8>=0)close(fd_dm8);if(fd_dm16>=0)close(fd_dm16);   
#endif
}
#pragma endregion 
}
namespace SHAREDDATA
{ 
#pragma  region   MappingMemoryFile 共享/*** ************************************************************************************************ @brief GetIOData*  获取IO 输出* @param[in] p_IOData  Comment* @param[in] start  Comment* @param[in] len  Comment* * @return BD_API * ************************************************************************************************/BD_API  int  GetIOData(uchar* p_IOData, int start, int len){int nRet = 0;std::lock_guard<std::mutex> lock(_mutex);try{if (len + start > n_max_IO_uchars){len = n_max_IO_uchars - start;}if (len > 0){ LPVOID lpBase = MapViewofFile_New(hMapFile_IO,fd_io, n_max_IO_uchars);// copy 内存memcpy(p_IOData, (uchar*)lpBase, len);//memcpy(p_IOData, b_IO, len); // 解除文件映射 UnMapViewofFile_New(lpBase, n_max_IO_uchars);}else nRet = -1;}catch (exception& e){nRet = -1;}return nRet;}/*** ************************************************************************************************ @brief SetIOData* 设置IO数据* @param[in] p_IOData  Comment* @param[in] start  Comment* @param[in] len  Comment* * @return BD_API * ************************************************************************************************/BD_API  int  SetIOData(uchar* p_IOData, int start, int len){int nRet = 0;std::lock_guard<std::mutex> lock(_mutex);try{if (len + start > n_max_IO_uchars){len = n_max_IO_uchars - start;}//  len 一定》0if (len > 0){// 映射缓存区视图 , 得到指向共享内存的指针LPVOID lpBase = MapViewofFile_New(hMapFile_IO,fd_io,  n_max_IO_uchars); // copy 内存memcpy((uchar*)lpBase, p_IOData, len);//memcpy(b_IO, p_IOData, len);// 解除文件映射  UnMapViewofFile_New(lpBase, n_max_IO_uchars);}else nRet = -1;}catch (exception& e){nRet = -1;}return nRet;}/// @brief SetDM8/// @param p_DM8 /// @param start /// @param len /// @return BD_API  int  SetDM8(uchar* p_DM8, int start, int len){int nRet = 0;std::lock_guard<std::mutex> lock(_mutex);try{if (start > n_max_DM8s){len = 0;nRet = -1;return nRet;}if (len + start > n_max_DM8s){len = n_max_DM8s - start;}//  len 一定》0if (len > 0){           // 映射缓存区视图 , 得到指向共享内存的指针LPVOID lpBase = MapViewofFile_New(hMapFile_DM8,fd_dm8,  n_max_DM8s);  memcpy((uchar*)lpBase + start, p_DM8, len);//memcpy(DM_8 + start, p_DM8, len);// 解除文件映射  UnMapViewofFile_New(lpBase, n_max_DM8s);}else nRet = -1;}catch (exception& e){nRet = -1;}return nRet;}BD_API  int  GetDM8(uchar* p_DM8, int start, int len){int nRet = 0;std::lock_guard<std::mutex> lock(_mutex);try{if (start > n_max_DM8s){nRet = -1;return nRet;}if (len + start > n_max_DM8s){len = n_max_DM8s - start;}//  len 一定》0if (len > 0){if (hMapFile_DM8 == INVALID_HANDLE_VALUE)return -2;// 映射缓存区视图 , 得到指向共享内存的指针LPVOID lpBase = MapViewofFile_New(hMapFile_DM8,fd_dm8,  n_max_DM8s);  // copy 内存memcpy(p_DM8, (uchar*)lpBase + start, len);//memcpy(p_DM8, DM_8 + start, len);// 解除文件映射UnMapViewofFile_New(lpBase, n_max_DM8s);}else nRet = -1;}catch (exception& e){nRet = -1;}return nRet;}BD_API  int  GetDM16(uchar* p_DM16, int start, int len){int nRet = 0;std::lock_guard<std::mutex> lock(_mutex);try{if (start * 2 > n_max_DM16s){nRet = -1;return nRet;}if (len + start > n_max_DM16s){len = n_max_DM16s - start;}//  len 一定》0// 这里的 DM16 的地址   可能直接就是 int 类型的, 无需start *2 if (len > 0){// 映射缓存区视图 , 得到指向共享内存的指针LPVOID lpBase = MapViewofFile_New(hMapFile_DM16,fd_dm16,  n_max_DM8s);   // copy 内存memcpy(p_DM16, (uchar*)lpBase + start, len*2);//memcpy(p_DM16, DM_16 + start, len * 2);// 解除文件映射UnMapViewofFile_New(lpBase, n_max_DM16s);}else nRet = -1;}catch (exception& e){nRet = -1;}return nRet;}BD_API  int  SetDM16(uchar* p_DM16, int start, int len){int nRet = 0;std::lock_guard<std::mutex> lock(_mutex);try{if (start * 2 > n_max_DM16s){len = 0;nRet = -1;return nRet;}if (len + start > n_max_DM16s){len = n_max_DM16s - start;}//  len 一定》0// 这里的 DM16 的地址   可能直接就是 int 类型的, 无需start *2 if (len > 0){ // 映射缓存区视图 , 得到指向共享内存的指针LPVOID lpBase = MapViewofFile_New(hMapFile_DM16,fd_dm16,  n_max_DM8s);   // copy 内存memcpy((uchar*)lpBase + start, p_DM16, len*2);//memcpy(DM_16 + start, p_DM16, len * 2);// 解除文件映射UnMapViewofFile_New(lpBase, n_max_DM16s);}else nRet = -1;}catch (exception& e){nRet = -1;}return nRet;}
#pragma endregion
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写starter写核心

文章目录 使用cn.smart 不能使用com 避免在yml配置的时候 开启或者 写万能接口实现调整日志级别写了core核心 但是没有引入其他功能组件,就是注解可以使用但是功能没有增,所以core的作用就是写入注解从新写starter 第一步提取注解 写到核心包里面,看其他包 新建模块 使用cn.s…

开源发布Whistle: 基于弱音素监督推进数据高效多语言和跨语言语音识别

论文地址&#xff1a;https://arxiv.org/abs/2406.02166 开源代码及模型&#xff1a; https://github.com/thu-spmi/CAT/blob/master/egs/cv-lang10/readme.md 摘 要 Whistle和Whisper一样&#xff0c;均采用弱监督方式训练ASR基座模型。不同于Whisper采用基于子词&#xff0…

全志T113系列芯片参数|性能|功耗|资料|选型-远众技术

全志T113-i和T113-S3/S4处理器&#xff0c;凭借高性价比、丰富接口、工业级性能等特性&#xff0c;适合不同应用场景。 一、T113-i&#xff1a;强大性能与丰富接口的理想嵌入式处理器 全志T113系列中的T113-i是一款引人注目的高性能、低成本嵌入式处理器&#xff0c;专为各种…

嵌入式面试需要注意的问题!

1.在嵌入式和IT行业&#xff0c;技术更新换代非常快。因此&#xff0c;求职者必须时刻关注行业的最新动向和发展趋势。了解当前市场上哪些技术和岗位需求量大&#xff0c;哪些新兴技术值得学习和掌握&#xff0c;都是至关重要的。 &#x1f538;嵌入式行业&#xff1a;嵌入式系…

1、项目基础

1、系统架构图 2、项目业务组成 3、技术选型 3.1 前端 vue3 ts sass axios 3.2后端 spring-cloud系列 gateway openfeign spring-cloud-alibaba系列 nacos sentinel seata

基于矩阵分解算法的评分预测实现---信息检索课设以及所涉及的深度学习原理

一、实验环境 Windows,Python 3 Python作为主要编程语言,使用Python的Pandas、NumPy、Matplotlib等库 二、实验内容 主要任务 查阅相关资料,了解矩阵分解算法的基本概念、应用场景及其难点。重点了解SVD(Singular Value Decomposition,奇异值分解)系列方法。掌握Pyth…

使用Python进行文件批量重命名:轻松实现文件管理

哈喽,大家好,我是木头左! 引言 在日常生活和工作中,经常需要对大量的文件进行重命名。手动一个个地修改文件名不仅耗时耗力,还容易出错。为了解决这个问题,可以利用Python编程语言来实现文件的批量重命名。本文将介绍如何使用Python编写一个简单的脚本,实现对文件进行批…

windows@无密码的本地用户账户相关问题@仅用用户名免密登录远程桌面登录和控制@无密码用户访问共享文件夹以及挂载问题

文章目录 abstract此用户无法登录账户被禁用问题访问共享文件夹时带上凭据错误案例和解决 两类登录方式控制台登录与远程登录的区别为什么限制空密码账户只允许控制台登录相关安全策略如何修改该策略注意事项 启用允许被免密登录功能使用空密码进行远程桌面连接设置远程桌面链接…

硅纪元视角 | 1 分钟搞定 3D 创作,Meta 推出革命性 3D Gen AI 模型

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

2.2.2 C#中显示控件BDPictureBox 的实现----DisplayContext说明续

2.2.2 C#中显示控件BDPictureBox 的实现----DisplayContext说明续 1 主要目标描述 实现图片缩放信息和中心点位置偏移信息的管理&#xff0c;外部调用者只要输入放大&#xff0c;缩小&#xff0c;位置偏移&#xff0c;其他全部由displayContext 实现 2 公共的函数部分&#…

第二天:ALOAM前端讲解【第2部分】

三、scan2scan 3. 帧间匹配 特征关联与损失函数计算 (1)线特征 点到线的距离公式: d ϵ = ∣ ( X ~ ( k +

网安小贴士(2)OSI七层模型

一、前言 OSI七层模型是一种网络协议参考模型&#xff0c;用于描述计算机网络体系结构中的不同层次和功能。它由国际标准化组织 (ISO) 在1984年开发并发布。 二、定义 OSI七层模型&#xff0c;全称为开放式系统互联通信参考模型&#xff08;Open Systems Interconnection Refe…

微信小程序 DOM 问题

DOM 渲染问题 问题 Dom limit exceeded, please check if theres any mistake youve made.测试页面 <template><scroll-view scroll"screen" style"width: 100%;height: 100vh;" :scroll-y"true" :scroll-with-animation"true&…

记录:pcl库使用VoxelGrid对象对点云下采样时引发free(ptr)异常的解决办法 C++

如题&#xff0c;使用pcl库的VoxelGrid对象对点云下采样时&#xff0c;Memory.h文件中EIGEN_DEVICE_FUNC inline void aligned_free(void *ptr)函数的free(ptr);引发异常&#xff08;203行&#xff09;解决办法。 原使用场景代码&#xff1a; pcl::VoxelGrid<pcl::PointXYZ…

如何应对.rmallox勒索病毒:预防勒索病毒的实用技巧

导言&#xff1a; 在当今数字化世界中&#xff0c;网络安全成为了任何组织和个人都必须面对的重要挑战之一。勒索病毒&#xff08;Ransomware&#xff09;作为一种恶意软件类型&#xff0c;已经成为网络安全威胁中的重要一环。最近出现的.rmallox勒索病毒引发了广泛关注和担忧…

casefold()方法——所有大写字符转换为小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 casefold()方法是Python3.3版本之后引入的&#xff0c;其效果和lower()方法非常相似&#xff0c;都可以转换字符串中所有大写字符为小写。…

基于深度学习的虚拟换装

基于深度学习的虚拟换装技术旨在通过计算机视觉和图像处理技术&#xff0c;将不同的服装虚拟地穿在用户身上&#xff0c;实现快速的试穿和展示。这项技术在电商、时尚和虚拟现实领域具有广泛的应用&#xff0c;能够提升用户体验&#xff0c;增加互动性。以下是关于这一领域的系…

bazel的详细使用教程

由于CSDN&#xff1b;复制近来的mk笔记格式太乱 建议看这个pdf文档 https://download.csdn.net/download/qq_41537499/89512254 为什么要学习bazel&#xff1f; 从Android 14开始&#xff0c;Google仍然强烈建议开发者使用Bazel和Kleaf构建Android内核及其工件。这表明Bazel在…

一篇文章用python GUI构建学生管理系统

引言 通过使用Python&#xff0c;我们可以利用其简洁和功能强大的特性&#xff0c;结合Tkinter提供的GUI开发能力&#xff0c;快速构建一个直观且易于使用的学生管理系统。 准备工作 在开始之前&#xff0c;确保你的开发环境中已经安装了 PythonTkinter库 安装完成后&…

华为HCIP Datacom H12-821 卷23

1.单选题 下面是路由器Huawei的部分配置信息,关于该配置信息描述错误的是: [HUAWEl] ip as-path-filter 2 permit_200 300[HUAWEI]route-policy test permit node 10 [HUAWE-route-policy]if-match as-path-filter 2 该Route Policy只能在OSPF进程中进行调用B、设置序…