mmap()
sys/mman.h
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
把文件或匿名内存映射进进程地址空间,用指针方式访问,避免显式读写调用。
# mmap · 内存映射
## 头文件
`sys/mman.h`
## 函数原型
`void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);`
## 说明
mmap 把文件(或匿名页)映射到进程地址空间,之后可以像访问数组一样用指针读写,内核负责按页把数据换入换出。成功返回映射起始地址,失败返回 MAP_FAILED。
关键参数:
- prot:PROT_READ / PROT_WRITE / PROT_EXEC / PROT_NONE
- flags:MAP_SHARED(改动写回文件,其他进程可见)/ MAP_PRIVATE(写时复制,不影响文件);MAP_ANONYMOUS 时不依赖 fd
- length 可以大于文件实际大小,但超出部分访问会触发总线错误
## 最小示例
```c
#include <stdio.h>
#include <sys/mman.h>
int main(void) {
char *p = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (p == MAP_FAILED) { return 1; }
p[0] = 'A';
munmap(p, 4096);
return 0;
}
```
## 常见坑
- 忘记 munmap,地址空间持续增长
- 用指针越界访问映射区,直接段错误或总线错误
- MAP_SHARED 的文件映射没有同步就退出,改动可能没落盘
- 映射长度按文件大小算而没按页对齐,最后一页数据被漏掉
## 相关函数
munmap、msync、mprotect、madvise