一个mmap的简单实验

分享实验CLinuxmmap by 达达 at 2011-06-07

昨天晚上实验了一mmap的用法,在网上搜了一些资料,拿来都不能直接用,下面是在MacOS和Ubuntu都测试过可正确执行的代码。

实验过程中我一开始使用private模式映射文件,结果对内存的修改不会被同步到文件,具体原因有待研究。另外代码里面使用lseek和write来扩展文件大小,网上的资料还显示可以通过ftruncate函数来扩展文件大小,我挺好奇这两个函数哪个效率更高,以后有机会测试看看。

下面是实验代码(用--std=c99参数编译):

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/mman.h> 
 
#define FILE_LEN 1024 
#define LDB_ERROR(where) { printf("%s: %s", where, strerror(errno)); exit(1); } 
 
int main(int argc, char* argv[])
{
    int file = open("./data.bin", O_RDWR | O_CREAT);
 
    if (file == 0) {
        LDB_ERROR("init file");
    }
 
    lseek(file, FILE_LEN, SEEK_SET);
    write(file, "", 1);
 
    //ftruncate(file, FILE_LEN); 
 
    void* pointer = mmap(NULL, FILE_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0);
 
    if (pointer == MAP_FAILED) {
        LDB_ERROR("map file");
    }
 
    close(file);
 
    memcpy(pointer, "Hello World", 11);
 
    msync(pointer, FILE_LEN, MS_SYNC);
 
    if (munmap(pointer, FILE_LEN) < 0) {
        LDB_ERROR("unmap file");
    }
 
    return 0;
}