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