mmap()与munmap()的小例子

mmap() 和 munmap() - Unix的系统函数,更贴近底层

void* mmap(void* addr,size_t size,int prot,int flags,
                       int fd, off_t offset)


参数addr可以指定映射的首地址,一般为0 交给内核指定。
size 就是分配内存的大小,映射时以 页 为单位。
prot是分配内存的权限,一般用PROT_READ|PROT_WRITE   

  flags是标识,通常包括以下三个:
         MAP_SHARED   MAP_PRIVATE : 二选一 ,指明映射的内存是否共享,MAP_SHARED只对 映射文件有效。
         MAP_ANONYMOUS : 映射物理内存,默认映射文件。
fd是文件描述符,在映射文件时有用。
offset是文件的偏移量,指定 映射文件时从哪里开始。
映射物理内存时,fd和offset 给 0 即可。
返回  成功返回首地址,失败返回 MAP_FAILED==(void*)-1
//mmap.c
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   /*映射一片内存*/
   void* p = mmap(0,//让系统指定映射内存的首地址(虚拟地址)
        4,//映射4bytes的空间,其实会映射一页内存
        PROT_READ|PROT_WRITE,//权限,有读写权限
        MAP_PRIVATE|MAP_ANONYMOUS,/*MAP_ANONYMOUS:匿名映射,当映射到内存时,只能使用匿名映射。MAP_SHARED和MAP_PRIVATE必选其一。*/ 
        0,//文件描述符,用于映射到文件,内存映射中会忽略
        0);//文件偏移量,用于文件,内存映射也会忽略
   if(p==MAP_FAILED){
      perror("映射失败");
      exit(-1);
   }
   int* pi = p+500;
   int i;
   for(i=10; i<60; i++){
      pi[i] = i;  
   }
   strcpy(p+750, "ABCDEFGHIJKLMN");
   char* pc = p;
   for(i=0; i<800; i++){
      if(i%10==0)printf("\n");
      printf("%x ", pc[i]);
   }
   printf("p=%p\n", p);
   sleep(20);
   munmap(p, 4);
  // while(1);
}

posted @ 2014-08-01 17:12  linuxnewbie  阅读(1750)  评论(0编辑  收藏  举报