文章目录
- 磁盘映射
- 相关函数
- mmap函数
- 作用:
- munmap函数
- 作用:
- truncate 函数
- 作用:
- 语法:
- 使用步骤:
磁盘映射
概述:
> 存储映射 I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。
于是当从缓冲区中取数据,就相当于读文件中的相应字节。
于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。
这样,就可在不使用 read 和write 函数的情况下,使用地址(指针)完成 I/O 操作。
使用存储映射这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
优点:
相对于文件的读写,速度较快
相关函数
mmap函数
作用:
建立映射
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
参数:
1 addr:
生成的映射的地址,填NULL 因为你自己写的可能地址不够大 给NULL 让系统自动找合适的地址
2 length:
开启的内存大小
3 port:权限
PROT_READ :可读
PROT_WRITE :可写
4 flags:标志位
MAP_SHARED 共享的 -- 对映射区的修改会影响源文件 【基本就用这个】
MAP_PRIVATE 私有的
5 fd: 映射的文件的文件描述符
6 offset: 偏移量, 【一般写0】
返回值:
开启的映射的首地址
munmap函数
作用:
释放映射
#include <sys/mman.h>
int munmap(void *addr, size_t length);
参数:
1 addr: 要释放的映射的地址
2 length: 释放的长度 不是内存没了 只是断开连接
// 注意: 该函数只是断开了 该进程与映射区之间 的 链接
truncate 函数
注意:
如果文件大小 大于 扩展部分 则会删除 多出部分
要是 文件大小 小于 扩展部分 就扩展
也就是说 扩展的时候 给大扩 扩小了 要比你的文件大小 还小 就删你文件了
作用:
扩展内存
语法:
int truncate(const char *path, off_t length);
参数:
path:文件地址
length:长度
使用步骤:
- 1 ,打开文件获取文件描述符
- 2,扩展映射的缓存区大小
- 3 , 建立映射
- 4 , 读或写
- 5 , 断开映射
写入:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>
#define BUFFSIZE 5
// 磁盘映射 写入
int main(int argc, char const *argv[])
{
// - 1 ,打开文件获取文件描述符
int fd = open("./tt.txt", O_CREAT | O_RDWR, 0666);
// - 2,扩展映射的缓存区大小
truncate("tt.txt", BUFFSIZE);
// - 3 , 建立映射
char *buf =(char *)mmap(NULL, BUFFSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// - 4 ,写入
char *str = "hello";
strcpy(buf, str);
// - 5 , 断开映射
munmap(buf, BUFFSIZE);
return 0;
}
// 优势 不用 read write
读取:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>
#define BUFFSIZE 5
// 磁盘映射 读取
int main(int argc, char const *argv[])
{
// - 1 ,打开文件获取文件描述符
int fd = open("./tt.txt", O_CREAT | O_RDWR, 0666);
// - 2,扩展映射的缓存区大小
truncate("tt.txt", BUFFSIZE);
// - 3 , 建立映射
char *buf = (char *)mmap(NULL, BUFFSIZE, PROT_READ , MAP_SHARED, fd, 0);
// - 4 , 读
printf("buf = %s\n",buf);
// - 5 , 断开映射
munmap(buf, BUFFSIZE);
return 0;
}
// 优势 不用 read write