apr共享内存

news2024/11/24 15:30:56

下载:

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.coloradmin.cn/o/2246733.html

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

相关文章

Javaweb前端HTML css 整体布局

最后一个是线条颜色 盒子&#xff0c;整体还是300&#xff0c;400

5.STM32之通信接口《精讲》之USART通信---实验串口接收程序

根据上节&#xff0c;我们一已经完成了串口发送程序的代码&#xff0c;并且深入的解析探索了串口的原理&#xff0c;接下来&#xff0c;Whappy小编将带领大家进入串口接收程序的探索与实验&#xff0c;并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图…

借助算力云跑模型

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

SpringMVC 执行流程详解

目录 前言1. SpringMVC 的核心组件概述1.1 DispatcherServlet1.2 HandlerMapping1.3 HandlerAdapter1.4 拦截器&#xff08;HandlerInterceptor&#xff09;1.5 ViewResolver 2. SpringMVC 的执行流程详解2.1 接收请求并分发2.2 获取 HandlerExecutionChain2.3 获取 HandlerAda…

安卓应用安装过程学习

声明&#xff1a;此文章来自http://shuwoom.com/?p60的学习记录 启动式安装 public static final IPackageManager main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {PackageManagerService m new PackageManagerService(context, inst…

如何通过OpenSSL来创建自签名的CA证书?

通过创建自签名CA证书可以让我们在没有商业支持的情况下学习与研究PKI&#xff08;公钥基础设施&#xff09;和SSL/TLS技术&#xff0c;本文将详细介绍如何通过OpenSSL来创建自签名的CA证书。 1. 初衷&#xff1a;为什么需要创建自签名CA证书&#xff1f; 除了开篇引言中提到的…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令&#xff1a;brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

Python中“暂停”(time.sleep?input?)

input函数最是经典&#xff0c;在多种实现中简单粗暴单纯而经济。 (笔记模板由python脚本于2024年11月22日 10:58:38创建&#xff0c;本篇笔记适合比较熟悉python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大…

刷题——【模板】二维前缀和

前缀和 题目题目链接题解方法一方法二 题目 描述 给你一个 n 行 m 列的矩阵 A &#xff0c;下标从1开始。 接下来有 q 次查询&#xff0c;每次查询输入 4 个参数 x1 , y1 , x2 , y2 请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和&#xff0c; 输入描述&#x…

10 - Clickhouse集群部署以及副本和分片

目 一、副本 1、简介 2、副本写入流程 3、副本配置步骤 3.1、启动zookeeper集群 3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下&#xff1a; 3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如…

Ubuntu24.04LTS设置root用户可远程登录

Ubuntu24.04LTS设置root用户可远程登录 文章目录 Ubuntu24.04LTS设置root用户可远程登录1. 设置root密码2. 设置root用户可远程登录1. 查看ssh服务是否安装2. 安装ssh服务3. 再次查看ssh服务是否安装4. 配置ssh文件5. 重启ssh服务6. root远程登录 1. 设置root密码 Ubuntu安装后…

DMA理论篇

DMA理论篇 简介 传统的数据传输都是需要CPU来实现&#xff0c;从一个地方拷贝到另一个地方&#xff1b;而DMA(Direct Memory Access)则不完全依赖CPU&#xff0c;DMA更新芯片SOC的一个控制器&#xff0c;他可以控制数据从内存中传输到另一个地方(外设、soc其它模块)&#xff…

理解原子变量之三:原子性与memory_order_relaxed

目录 CPU与内存的关系 原子性 典型使用场景 在本系列的第一篇文章理解原子变量之一&#xff1a;从互斥锁到原子变量&#xff0c;最粗浅的认识_原子互斥-CSDN博客&#xff0c;我通过几个实例从感性认识的角度介绍了原子性。本文在第一篇文章的基础上&#xff0c;从理性认识的…

医院信息化与智能化系统(22)

医院信息化与智能化系统(22) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

青少年编程等级考试C++一级,硬币反转问题

代码 #include<iostream>using namespace std;bool a[300];int main(){ int n,m; cin >> n >> m; for(int i 1;i < m;i) { for (int j 1;j < n;j) { if( j % i 0) { a[j] !a[j];…

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

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

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…

(十一)Python字符串常用操作

一、访问字符串值 Python访问子字符串变量&#xff0c;可以使用方括号来截取字符串。与列表的索引一样&#xff0c;字符串索引从0开始。 hh"LaoTie 666" hh[2] mm"床前明月光" mm[3] 字符串的索引值可以为负值。若索引值为负数&#xff0c;则表示由字符…

Sigrity SPEED2000 DDR simulation模式如何生成和解读DDR仿真报告-SODIMM-Write模式

Sigrity SPEED2000 DDR simulation模式如何生成和解读DDR仿真报告-SODIMM-Write模式 Sigrity SPEED2000 DDR simulation模式如何进行DDR仿真分析操作指导-SODIMM-Write模式详细介绍了如何进行DDR Write模式的仿真分析,下面基于此仿真结果进行DDR报告的输出和解读分析 在workfl…

【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)

识别逻辑 深度学习 使用了端到端的学习策略&#xff0c;直接学习从图像到检测结果的映射关系&#xff0c;自动提取特征&#xff0c;并且根据特征与特征之间的关系&#xff0c;计算出检测结果。 传统算法 则是人工提取特征&#xff0c;比如边缘特征&#xff0c;直线特征&#x…