apr共享内存

下载:

Download - The Apache Portable Runtime Project

编译:

使用cmake-gui生成库:
apr-1.lib
aprapp-1.lib
libapr-1.lib
libaprapp-1.lib
libapr-1.dll
在Developer PowerShell for VS 2019中:
执行nmake -f Makefile.win来编译APR。
nmake -f Makefile.win install PREFIX=C:\your\installation\path
最后生成头文件

code:

创建、写数据、读数据

int main() {//内存池,管理所有的共享内存(共享内存区域在这个池子里)apr_pool_t* pool;//apr_status_t 是一个枚举类型,用于表示 APR 函数的返回状态。//通过检查 apr_status_t 的值,可以判断函数调用是否成功以及具体的错误原因。apr_status_t status;// 初始化APR库//apr_initialize() 函数用于初始化 APR 库。在调用任何其他 APR 函数之前,必须先调用这个函数。apr_initialize();//atexit(apr_terminate) 函数用于注册一个在程序正常终止时调用的函数//在这个例子中,apr_terminate 函数会在程序退出时被调用,以确保 APR 资源被正确清理。//apr_terminate 函数负责释放 APR 在初始化时分配的所有资源,包括内存、文件句柄等。//即使程序在某些地方抛出异常,atexit 注册的函数也会在程序退出时被调用,确保资源被正确释放atexit(apr_terminate);// 创建内存池status = apr_pool_create(&pool, NULL);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to create pool\n");return -1;}// 创建共享内存段// apr_shm_t 类型用于表示共享内存段,而 apr_shm_create 函数用于创建共享内存段。//apr_shm_t 是 APR 中用于表示共享内存段的数据结构。//这个指针将指向新创建的共享内存段。通过这个指针,//你可以对共享内存段进行各种操作,如读取、写入和销毁。apr_shm_t* shm;//通常是一个简短的字符串,用于唯一标识共享内存段。例如 "my_shared_memory"。不是路径const char* shm_name = "my_shared_memory";//用于指定共享内存段的大小,1024个字节apr_size_t shm_size = 1024;//创建一个共享内存段,并将其相关信息存储在一个 apr_shm_t 结构体中status = apr_shm_create(&shm, shm_size, shm_name, pool);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to create shared memory\n");return -1;}// 获取共享内存的地址char* shm_addr = (char*)apr_shm_baseaddr_get(shm);// 写入数据strcpy(shm_addr, "Hello, APR!");// 读取数据printf("Shared memory content: %s\n", shm_addr);// 销毁共享内存段status = apr_shm_destroy(shm);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to destroy shared memory\n");return -1;}// 清理内存池apr_pool_destroy(pool);
}

进程1:写数据

demo.cpp

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <apr_general.h>
#include <apr_pools.h>
#include <apr_shm.h>
using namespace std;int main() {cout << "****************************" << endl;cout << "apr_demo_process" << endl;cout << "xie_ru: " << "Hello, APR!" << endl;cout << "****************************" << endl;//内存池,管理所有的共享内存(所有的共享内存区域都在这个池子里)apr_pool_t* pool;//apr_status_t 是一个枚举类型,用于表示 APR 函数的返回状态。//通过检查 apr_status_t 的值,可以判断函数调用是否成功以及具体的错误原因。apr_status_t status;// 初始化APR库//apr_initialize() 函数用于初始化 APR 库。在调用任何其他 APR 函数之前,必须先调用这个函数。apr_initialize();//atexit(apr_terminate) 函数用于注册一个在程序正常终止时调用的函数//在这个例子中,apr_terminate 函数会在程序退出时被调用,以确保 APR 资源被正确清理。//apr_terminate 函数负责释放 APR 在初始化时分配的所有资源,包括内存、文件句柄等。//即使程序在某些地方抛出异常,atexit 注册的函数也会在程序退出时被调用,确保资源被正确释放atexit(apr_terminate);// 创建内存池status = apr_pool_create(&pool, NULL);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to create pool\n");return -1;}// 创建共享内存段// apr_shm_t 类型用于表示共享内存段,而 apr_shm_create 函数用于创建共享内存段。//apr_shm_t 是 APR 中用于表示共享内存段的数据结构。//这个指针将指向新创建的共享内存段。通过这个指针,//你可以对共享内存段进行各种操作,如读取、写入和销毁。apr_shm_t* shm;//通常是一个简短的字符串,用于唯一标识共享内存段。例如 "my_shared_memory"。不是路径const char* shm_name = "my_shared_memory";//用于指定共享内存段的大小,1024个字节apr_size_t shm_size = 1024;//创建一个共享内存段,并将其相关信息存储在一个 apr_shm_t 结构体中status = apr_shm_create(&shm, shm_size, shm_name, pool);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to create shared memory\n");return -1;}// 获取共享内存的地址char* shm_addr = (char*)apr_shm_baseaddr_get(shm);// 写入数据strcpy(shm_addr, "Hello, APR!");// 读取数据//printf("Shared memory content: %s\n", shm_addr);//阻塞,防止进程退出while (1){Sleep(1000 * 30);break;}// 销毁共享内存段status = apr_shm_destroy(shm);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to destroy shared memory\n");return -1;}// 清理内存池apr_pool_destroy(pool);
}

进程2:读取数据

process_two.cpp

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <apr_general.h>
#include <apr_pools.h>
#include <apr_shm.h>
using namespace std;int main() {cout << "****************************" << endl;cout << "apr_process_two_process" << endl;cout << "shu_chu: " << "Hello, APR!" << endl;cout << "****************************" << endl;apr_pool_t* pool;apr_status_t status;apr_shm_t* shm;const char* shm_name = "my_shared_memory";// 初始化APR库status = apr_initialize();if (status != APR_SUCCESS) {fprintf(stderr, "Failed to initialize APR\n");return -1;}// 注册终止函数if (atexit(apr_terminate) != 0) {fprintf(stderr, "Failed to register apr_terminate\n");return -1;}// 创建内存池status = apr_pool_create(&pool, NULL);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to create pool\n");return -1;}// 获取已存在的共享内存段status = apr_shm_attach(&shm, shm_name, pool);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to attach to shared memory: %d\n", status);return -1;}// 获取共享内存的基地址char* shm_addr = (char*)apr_shm_baseaddr_get(shm);// 读取数据printf("Shared memory content: %s\n", shm_addr);// 销毁共享内存段(注意:通常由创建者销毁)status = apr_shm_destroy(shm);if (status != APR_SUCCESS) {fprintf(stderr, "Failed to destroy shared memory: %d\n", status);return -1;}// 清理内存池apr_pool_destroy(pool);return 0;
}

补充:

把libapr-1.dll拷贝到可执行文件下

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

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

相关文章

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到MySQL数据库中&#xff0c;实现从“聚水谭…

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…

java基础知识(常用类)

一、包装类&#xff08;Wrapper) &#xff08;1&#xff09;包装类与基本数据的转换 装箱&#xff1a;基本类型->包装类型 拆箱&#xff1a;包装类型->基本类型 java5以后是自动装箱和拆箱的方式&#xff0c;自动装箱底层调用的是valueOf方法&#xff0c;比如Integer.…

【Python系列】字典灵活的数据存储与操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件&#xff0c;我的路径是&#xff1a;D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径&#xff0c; 2.用管理员模式打开conf文件&#xff0c;右键管理员&#xff0c;记事本或者not 3.选中的一行新建一…

AVL树实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的 左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制⾼度差去控制平…

jvm发展历程介绍

初始阶段&#xff1a;JDK 1.0 - JDK 1.1 • 经典JVM&#xff1a;这是JVM的早期实现&#xff0c;主要特点是使用解释器&#xff08;Interpreter&#xff09;来逐行解释执行Java字节码。这种方式虽然简单直接&#xff0c;但执行效率相对较低。 • JIT编译器&#xff08;Just-In-T…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …

HTML 元素类型介绍

目录 1. 块级元素&#xff08;Block-level Elements&#xff09; 2. 行级元素&#xff08;Inline Elements&#xff09; 3. 行内块级元素&#xff08;Inline-block Elements&#xff09; 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …

高危,Laravel参数注入漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;披露了Laravel 参数注入漏洞(CVE-2024-52301)。在受影响的版本中&#xff0c;Application.php 文件的 detectEnvironment 函数直接使用了 $_SERVER[argv]&#xff0c;但没有检查运行环境是否为 CLI…

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型&#xff08;LLMs&#xff09;在处理表格数据时的微调优化策略。具体来说&#xff0c;论文探讨了以下…

如何搭建C++环境--1.下载安装并调试Microsoft Visual Studio Previerw(Windows)

1.首先&#xff0c;打开浏览器 首先&#xff0c;搜索“Microsoft Visual Studio Previerw” 安装 1.运行VisualStudioSetup (1).exe 无脑一直点继续 然后就到 选择需要的语言 我一般python用pycharm Java&#xff0c;HTML用vscode&#xff08;Microsoft Visual Studio cod…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库&#xff1f; 因为在国内&#xff0c;访问&#xff1a;https://hub.docker.com/ 会出现无法访问页面。。。。&#xff08;已经使用了魔法&#xff09; 当然现在也有一些国内的镜像管理网站&#xff0c;比如网易云镜像服务、Dao…

1123--日期类

目录 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程&#xff0c;通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom&#xff0c;根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据&#xff0c;可以使用通义千问&#xff0c;关于LinearScale与BandScale不懂的地方也可以在通义千…