星巡研究院

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