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拷贝到可执行文件下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值