An introduction to pmemobj (part 1) - accessing the persistent memory

参考链接: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 
#include 
#include  // 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 中的代码同理,在此不注释。

这是输出结果:

 

 

 

 

 

 

 

你可能感兴趣的:(An introduction to pmemobj (part 1) - accessing the persistent memory)