现在的位置: 首页 > 综合 > 正文

Linux访问内存映射的对象

2013年11月23日 ⁄ 综合 ⁄ 共 1168字 ⁄ 字号 评论关闭
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>

#define  FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
#define	min(a,b)	((a) < (b) ? (a) : (b))
#define	max(a,b)	((a) > (b) ? (a) : (b))

int main(int argc, char** argv)
{
    int fd, i;
    char*   ptr;
    size_t  filesize, mmapsize, pagesize;

    if(argc != 4)
    {
        printf("usage: test1 <pathname> <filesize> <pagesize>");
    }
    filesize = atoi(argv[2]);
    pagesize = atoi(argv[3]);

    fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, FILE_MODE);
    lseek(fd, filesize - 1, SEEK_SET);
    write(fd, "", 1);

    ptr = mmap(NULL, mmapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);

    pagesize = sysconf(_SC_PAGESIZE);
    printf("PAGESIZE = %ld\n", (long)pagesize);

    for(i = 0; i < max(filesize, mmapsize); i += pagesize)
    {
        printf("ptr[%d] = %d\n", i, ptr[i]);
        ptr[i] = 1;
        printf("ptr[%d] = %d\n", i + pagesize - 1, ptr[i + pagesize - 1]);
        ptr[i + pagesize - 1] = 1;
    }
    printf("ptr[%d] = %d\n", i, ptr[i]);

    exit(0);
}

输出结果:

chanlp@chanlp-Presario-V3700-Notebook-PC:~/Desktop/shm$ od -x -A d foo 
0000000 0001 0000 0000 0000 0000 0000 0000 0000
0000016 0000 0000 0000 0000 0000 0000 0000 0000
*
0004080 0000 0000 0000 0000 0000 0000 0000 0100
0004096 0001 0000 0000 0000 0000 0000 0000 0000
0004112 0000 0000 0000 0000 0000 0000 0000 0000
*
0004992 0000 0000 0000 0000
0005000

注:od命令   -x选项指定以十六进制输出各字节  -A d选项指定以十进制输出地址

抱歉!评论已关闭.