1. 程式人生 > >An introduction to pmemobj (part 1) - accessing the persistent memory

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 <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 中的程式碼同理,在此不註釋。

這是輸出結果: