文章目录
- 磁盘映射
- 相关函数
- 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