天天看点

PMDK libpmem 例程2 数组写入持久化内存

数组写入持久化内存

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/