數組寫入持久化記憶體
libpmem是一個低層次持久化記憶體的庫,當需要持久化存儲的時候,需要手到flush,是以通常開發者采用libpmemobj更友善。
Key:
addr pmem_map_file() // 建立持久化記憶體的檔案,并将檔案映射,得到指向檔案的指針
pmem_memcpy_persist() // 若位址是指向持久化記憶體的數組,則采用pmem_memcpy_persist進行持久化
pmem_msync() // 若位址指向普通易失性記憶體的數組,則采用memcpy() 和 pmem_msync()進行持久化
pmem_unmap() // 解除映射關系
此處使用pmem_memcpy_persist(),不僅僅隻是針對數組,還可以針對長字串等大内容的資料。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <libpmem.h>
/* just copying 4k to pmem for this example */
#define BUF_LEN 4096
int main(int argc, char *argv[])
{
char buf[BUF_LEN];
char *pmemaddr;
size_t mapped_len;
int is_pmem;
/* create a pmem file and memory map it */
if ((pmemaddr = pmem_map_file(argv[], BUF_LEN,
PMEM_FILE_CREATE|PMEM_FILE_EXCL,
, &mapped_len, &is_pmem)) == NULL) {
perror("pmem_map_file");
exit();
}
printf("mapped_len: %d\n", (int)mapped_len);
printf("BUF_LEN : %d\n", BUF_LEN);
for (unsigned int i = ; i < mapped_len; ++i) {
buf[i] = ;
}
/* write it to the pmem */
if (is_pmem) {
pmem_memcpy_persist(pmemaddr, buf, mapped_len);
} else {
memcpy(pmemaddr, buf, mapped_len);
pmem_msync(pmemaddr, mapped_len);
}
pmem_unmap(pmemaddr, mapped_len);
exit();
}
運作後結果:
$ ./simple_copy pmem.
mapped_len:
BUF_LEN :
參考文獻:http://pmem.io/pmdk/libpmem/