mmap映射文件
目录
一、前言
二、解决方法
三、mmap模拟
3.1代码
3.2过程
3.3mmap返回值
一、前言
在上文进程间通信一文最后我们提到了c结构上的多态是结构体套结构体,其中对于共享内存来说其结构体struct shm中含有一个struct *file的成员,表明共享内存本质上是个文件,那么它就含有inode和block指向它的缓冲区进行IPC,但它并没有文件fd进行文件操作,这就要提到文件映射了。
二、解决方法
其本质还是在虚拟地址空间上将共像内存这文件的起始和结束建立虚拟和物理地址间的映射,通过虚拟地址进行内存访问从而达到IPC。
三、mmap模拟
我们可以通过mmap来模拟通过文件地址映射来进行文件操作,内存映射文件避免了传统 I/O 的用户空间和内核空间的数据拷贝,提高了大文件操作效率,特别适合随机访问场景。
3.1代码
#include <iostream>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>int main() {const char* filename = "test.txt";const char* message = "Hello, mmap!";const size_t size = 13;// 创建并写入测试文件int fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open");return 1;}lseek(fd, size - 1, SEEK_SET);write(fd, "", 1);// 内存映射文件char* map = static_cast<char*>(mmap(nullptr, // 让系统选择映射地址size, // 映射大小PROT_READ | PROT_WRITE, // 可读可写MAP_SHARED, // 更改会写回文件fd, // 文件描述符0 // 从文件起始位置开始映射));if (map == MAP_FAILED) {perror("mmap");close(fd);return 1;}// 写入数据到映射区域memcpy(map, message, size);// 同步到磁盘if (msync(map, size, MS_SYNC) == -1) {perror("msync");}// 解除映射if (munmap(map, size) == -1) {perror("munmap");}close(fd);std::cout << "文件映射完成,内容已写入 " << filename << std::endl;return 0;
}