函数原型
// 创建内存映射区
#include <sys/mman.h>
void * mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
// 释放内存映射区
int munmap(void *addr, size_t len);
形参:
- addr:指定映射区域的首地址。通常传入NULL,表示让系统自动分配
- length: 共享内存映射区的大小(小于等于文件的实际大小)
- prot:共享内存映射区的读写属性, PROT_READ, PROT_WRITE
- PROT_READ | PROT_WRITE 读写权限
- flags:标注共享内存的共享属性。MAP_SHARED/ MAP_PRIVARE
- fd:用于创建共享内存映射区那个文件描述符
- offset:默认是0,表示映射文件全部。偏移位置 4K的整数倍
返回值:
- 成功: 返回映射区的首地址
- 失败:MAP_FAILED, 和 errno
mmap的使用例子
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
void my_mmap(){
char *p = NULL;
int fd;
// 需要先打开一个文件
fd = open("testmap", O_RDWR|O_CREAT|O_TRUNC, 0644);
if (fd==-1){
sys_err("open error");
}
// 需要拓展文件大小, 这样可以拓展文件大小为11
lseek(fd, 10, SEEK_END);
write(fd, "