关键词: Linux内存映射、mmap函数、共享内存、文件映射 —— 本文带你从零掌握mmap的核心用法。
在Linux系统编程中,内存映射(Memory Mapping)是一种高效的I/O机制,它允许将文件或设备映射到进程的地址空间,从而像访问内存一样读写文件。mmap函数正是实现这一功能的核心系统调用。无论你是想实现高效的文件映射,还是进程间的共享内存,mmap都是不可或缺的工具。
mmap(memory map)即内存映射,它可以将一个文件或其它对象映射到进程的虚拟地址空间。映射后,进程可以通过指针直接读写这段内存,而系统会自动将内存的改动写回文件(若使用共享映射)。这种方式避免了传统的read/write系统调用带来的用户态与内核态之间的数据拷贝,极大提升了I/O效率。mmap常用于大文件处理、进程间通信(共享内存)以及动态加载库等场景。
mmap函数原型如下:
#include void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 返回值:成功返回映射区域的首地址,失败返回MAP_FAILED(即(void *)-1)。
下面通过一个简单的示例演示如何将文件映射到内存并修改其内容。假设我们有一个文本文件"data.txt",我们希望将其前10个字节改为大写。
#include #include #include #include #include #include #include #include int main() { int fd = open("data.txt", O_RDWR); if (fd == -1) { perror("open"); exit(1); } struct stat sb; if (fstat(fd, &sb) == -1) { perror("fstat"); exit(1); } // 映射整个文件 size_t length = sb.st_size; char *addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (addr == MAP_FAILED) { perror("mmap"); exit(1); } close(fd); // 文件描述符可以立即关闭,不影响映射 // 将前10个字符转为大写(如果文件长度足够) int n = (length < 10) ? length : 10; for (int i = 0; i < n; i++) { addr[i] = toupper(addr[i]); } // 同步到磁盘(可选) msync(addr, length, MS_SYNC); // 解除映射 munmap(addr, length); return 0;} 该程序打开文件,获取大小,使用mmap函数建立文件映射(MAP_SHARED),然后直接操作内存,最后通过msync确保修改写回磁盘,并用munmap解除映射。整个过程高效简洁。
除了文件映射,mmap还可以创建匿名映射(flags指定MAP_ANONYMOUS,fd传-1),用于在父子进程间共享内存。例如,fork之前创建匿名映射,之后父子进程都能访问同一块内存,实现进程间通信。这种基于共享内存的方式比管道等传统IPC速度更快。
mmap是Linux/Unix系统编程中非常强大的工具,掌握它能够让你在处理大文件、实现高效IPC时游刃有余。无论是Linux内存映射的基础概念,还是mmap函数的实际运用,本文都给出了清晰的指引。希望这篇教程能帮助你顺利上手mmap,开启高性能编程的大门。
本文由主机测评网于2026-02-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260226904.html