mmap()与munmap()的小例子

本文深入解析了Unix系统中用于动态内存映射的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);
}

转载于:https://www.cnblogs.com/linuxnewbie/p/3885447.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值