码迷,mamicode.com
首页 > 其他好文 > 详细

mmap学习

时间:2015-04-22 20:17:23      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

rocksdb的WAL文件的具体的实现方式是linux的mmap,如果要主备同步的话,就需要在另一个进程里面读取这个文件,下面记录一下另一个进程查看mmap(MAP_SHARED)的文件的情况。

 

最终的结果是,mmap并且对内存赋值后,其他进程通过read等读文件的方法就可以看到这个文件的内容。这样就可以非常简单从另一个进程的读rocksdb的WAL文件。

实验代码:

#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int fd = open("text.txt", O_CREAT | O_RDWR | O_TRUNC, 0644);
    printf("before fallocate\n");
    char c = getchar();
    int iret = fallocate(fd, 0, 0, 1 << 15);
    if (iret != 0) {
        printf("fallocate error %d\n", iret);
        return 1;
    }
    printf("before mmap\n");
    c = getchar();
    void *ptr = mmap(NULL, 1 << 15, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) {
        printf("mmap failed\n");
        return 1;
    }
    printf("before write\n");
    c = getchar();
    char *tptr = (char *)ptr;
    tptr[0] = a;
    tptr[1] = b;
    printf("before sync\n");
    close(fd);
    c = getchar();
    printf("test end\n");
}

结果是fallocate之前文件大小是0,fallocate之后文件大小是32k,内容全为0,mmap之后不会有什么变化,write之后,不用msync其他进程就可以读到数据。

mmap学习

标签:

原文地址:http://www.cnblogs.com/jfwang/p/4448215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!