An introduction to pmemobj (part 1) - accessing the persistent memory
阿新 • • 發佈:2018-12-28
參考連結: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 中的程式碼同理,在此不註釋。
這是輸出結果: