zoukankan      html  css  js  c++  java
  • 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("
    ");
          printf("%x ", pc[i]);
       }
       printf("p=%p
    ", p);
       sleep(20);
       munmap(p, 4);
      // while(1);
    }

  • 相关阅读:
    Ubuntu软件工具推荐
    利用Github Actions自动同步博客园最新内容到GitHub首页
    vscode 使用zsh powerline主题乱码解决方案
    搜索插入位置
    判断二分图
    ~~并发编程(十三):信号量,Event,定时器~~
    ~~并发编程(十二):死锁和递归锁~~
    ~~并发编程(十一):GIL全局解释锁~~
    ~~并发编程(十):线程方法~~
    ~~并发编程(九):多线程与多进程~~
  • 原文地址:https://www.cnblogs.com/linuxnewbie/p/3885447.html
Copyright © 2011-2022 走看看