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