mmap是什么?
可以把文件映射到内存,也可以把内存写到文件
接下来我们看看用C++如何写入吧:
#ifndef MMAP_MMMAP_H
#define MMAP_MMMAP_H
#include <string>
#include <sys/mman.h>
#include <unistd.h>
#include <string>
#include <fcntl.h>
using namespace std;
class MMAPOperation{
public:
//把文件映射到内存
void readFile();
//通过mmap把内容写到文件里
void writeFile(string data);
};
#endif //MMAP_MMMAP_H
接着看看CPP:
#include "mmmap.h"
void MMAPOperation::readFile() {
printf("readFile\n");
// 打开文件
int fd = open("output.txt", O_RDONLY);
// 读取文件长度
int len = lseek(fd, 0, SEEK_END);
// 建立内存映射
char *addr = (char *) mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
// malloc一个长度和文件长度相同的char数组
char *data = (char *)malloc(sizeof(char)*len);
// 复制过来
memcpy(data, addr, len);
printf("readFile content is %s \n",data);
// 解除映射
munmap(addr, len);
//释放内存
free(data);
}
void MMAPOperation::writeFile(string data) {
printf("writeFile %s\n",data.c_str());
int len = data.length();
// 打开或者创建文件
int fd = open("output.txt", O_RDWR | O_CREAT, 00777);
// lseek将文件指针往后移动file_size-1位
len = lseek(fd, len, SEEK_END);
// 从指针处写入一个空字符;mmap不能扩展文件长度,这里相当于预先给文件长度,准备一个空架子
write(fd, "", 1);
// 使用mmap函数建立内存映射
char *addr = (char *) mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// 内存映射建立好了,此时可以关闭文件了
close(fd);
// 把data复制到addr里
memcpy(addr, data.c_str(), len);
// 解除映射
munmap(addr, len);
}
接着我们写main方法跑一下:
#include <iostream>
#include "mmmap.h"
int main() {
std::cout << "Hello, World!" << std::endl;
auto* mmapOperation = new MMAPOperation();
mmapOperation->writeFile("hello world");
mmapOperation->readFile();
delete mmapOperation;
return 0;
}
print结果:
Hello, World!
writeFile hello world
readFile
readFile content is hello world