参考链接:https://pmem.io/2015/06/13/accessing-pmem.html
这篇文章主要还是纯C语言有关
全文API函数:
pmemobj_creat() //创建持久化内存池
pmemobj_open() //打开已创建的持久化内存池
pmemobj_close() //释放内存池
pmemobj_check() //验证内存池元数据一致性
pmemobj_direct() //将持久性指针转化为结构指针
pmemobj_root() //获取持久化内存池的根节点
pmemobj_persist() //确保变量持久化存储
在 pmemobj_creat() 时需要添加一个编程前就写好的 layout 命名,是要通过这个 layout 来将你指定的内存池传递给 pmemobj_open() 进行匹配。
持久指针 pmemoid 的结构体:
typedef struct pmemoid {
uint64_t pool_uuid_lo;
uint64_t off;
} PMEMoid;
例程:
/*
* layout.h -- example from introduction part 1
*/
#define LAYOUT_NAME "intro_1" //这就是开始的layout命名
#define MAX_BUF_LEN 10 //缓存区大小
struct my_root {
size_t len;
char buf[MAX_BUF_LEN];
};
/*
* writer.c -- example from introduction part 1
*/
#include <stdio.h>
#include <string.h>
#include <libpmemobj.h> // PMDK提供的库
#include "layout.h"
int main(int argc, char *argv[])
{
//这一段if()是要保证在执行时输入正确的命名方式
if (argc != 2) {
printf("usage: %s file-name\n", argv[0]);
return 1;
}
//创建持久化内存池
PMEMobjpool *pop = pmemobj_create(argv[1], LAYOUT_NAME,
PMEMOBJ_MIN_POOL, 0666);
if (pop == NULL) {
perror("pmemobj_create"); //perror用来将上一个函数发生错误的原因输出到标准设备
return 1;
}
//获取持久化内存的根节点并转化为可用的指针
PMEMoid root = pmemobj_root(pop, sizeof(struct my_root));
struct my_root *rootp = pmemobj_direct(root);
//缓存空间初始化,并接收九个字符
char buf[MAX_BUF_LEN] = {0};
if (scanf("%9s", buf) == EOF) {
fprintf(stderr, "EOF\n");
return 1;
}
//将接收到字符串的缓存区转入持久性内存,实现本文要求的持久化
rootp->len = strlen(buf);
pmemobj_persist(pop, &rootp->len, sizeof(rootp->len));
pmemobj_memcpy_persist(pop, rootp->buf, buf, rootp->len);
pmemobj_close(pop);
return 0;
}
然后 reader.c 中的代码同理,在此不注释。
这是输出结果: