一、函数介绍 
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
    int fd, off_t offset);
//返回值:成功返回目标内存区域的指针;失败返回MAP_FAILED((void*)-1)

int munmap(void *addr, size_t length);
//返回值:成功返回0;失败返回-1并设置errno
  • mmap:用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中
  • munmap:释放由mmap创建的这段内存空间

mmap函数

  • addr:允许用户使用某个特定的地址作为这段内存的起始地址(如果设置为NULL,则凶自动分配一块地址)
  • length:指定内存段的长度
  • prot:用来设置内存段的访问权限,它可以取一下几个值的按位或
    • PROT_READ:内存段可读
    • PROT_WRITE:内存段可写
    • PROT_EXEC:内存段可执行
    • PROT_NONE:内存段不能被访问
  • flags:控制内存段内容被修改后程序的行为,它可以被设置为下表的某些值的按位或(只列出了部分,其中MAP_SHARED和MAP_PRIVATE不能同时指定)
常用值 含义
MAP_SHARED 在进程间共享这段内存,对该内存段的修改将反映到被映射的文件中。它提供了进程间共享内存的POSIX方法
MAP_PRIVATE 内存段为调用进程所私有。对该内存段的修改不会反映到被映射的文件中
MAP_ANONYMOUS 这段内存不是从文件映射而来的。其内容被初始化为全0。这种情况下,mmap函数的最后两个参数将被忽略
MAP_FIXED 内存段必须位于addr参数指定的地址处。start必须是内存页面大小(4096字节)的整数倍
MAP_HUGETLB 按照“大内存页面”来分配内存空间。“大内存页面”的大小可通过/proc/meminfo文件来查看
  • fd:是被映射文件对应的文件描述符。可以通过open调用获得
  • offset:设置从文件的何处开始映射