一、函数原型
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
二、mmap函数
函数功能:
- 用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中
返回值:
- 成功:返回目标内存区域的指针;
- 失败:MAP_FAILED((void*)-1)
参数说明:
- addr:允许用户使用某个特定的地址作为这段内存的起始地址(如果设置为NULL,则系统自动分配一块地址)
- length:指定内存段的长度
- port:用来设置内存段的访问权限,它可以取一下几个值的按位或
- PROT_READ:内存段可读
- PROT_WRITE:内存段可写
- PROT_EXEC:内存段可执行
- PROT_NONE:内存段不能被访问
- flags:控制内存段内容被修改后程序的行为,它可以被设置为下表的某些值的按位或(只列出了部分,其中MAP_SHARED和MAP_PRIVATE不能同时指定)
常用值 含义 MAP_SHARED 在进程间共享这段内存,对该内存段的修改将反映到被映射的文件中。它提供了进程间共享内存的POSIX方法 MAP_PRIVATE 内存段为调用进程所私有。对该内存段的修改不会反映到被映射的文件中 MAP_ANONYMOUS 匿名映射。这段内存不是从文件映射而来的。其内容被初始化为全0。这种情况下,mmap函数的最后两个参数将被忽略。可以当malloc()函数使用。 MAP_FIXED 内存段必须位于addr参数指定的地址处。start必须是内存页面大小(4096字节)的整数倍 MAP_HUGETLB 按照“大内存页面”来分配内存空间。“大内存页面”的大小可通过/proc/meminfo文件来查看
- fd:是被映射文件对应的文件描述符。可以通过open调用获得
- offset:设置从文件的何处开始映射
三、munmap函数
函数功能:
- 释放由mmap创建的这段内存空间
返回值:
- 成功:0
- 失败:-1并设置errno
伪码:
munmap(addr, size);
四、代码实现
mmap()当malloc()实现
struct student_st { char name[1024]; int math; int chinese; }; /*****************************************************************************/ //1、mmap操作方式: struct student_st *me_mmap; me_mmap = mmap(NULL, sizeof(struct student_st),PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (me_mmap == MAP_FAILED) { perror("mmap()"); exit(1); } /*****************************************************************************/ //2、malloc操作方式: stuct student_st *me_malloc me_malloc = malloc(sizeof(*me_malloc)); if (me_malloc == NULL) { perror("malloc()"); exit(1); }