mmap映射方式打开文件
mmap方式操作文件不同于普通的读写文件,直接通过mmap()函数在内存中创建一块对应文件的映射区域,其返回值就是这块内存的char *字符串, 写文件时通过msync同步内存到文件。
优点:
- mmap读文件的读取不再是传统的操作系统的页缓存至内存的模式,二是通过映射直接讲银盘区域映射至内存,减少了大量IO操作。
- 其次:在大规模文件存取读出时,mmap用内存映射的方式通过指针搜寻, 这样提高了程序读取的效率。补充了内存不足的问题。
- 注意:同一个资源文件,不能同时读和写,否则指向文件的指针会乱掉,导致程序异常奔溃。
需要的头文件:
#include <stdio.h>
#include <sys/mman.h> //mmap函数的必要头文件
#include <sys/stat.h> // struct stat 需要的头文件
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define MAX_LEN 128
// mmap映射的3个主要函数
// void mmap(void *addr, size_t len, int prot,int flags, int fildes, off_t off)
// int msync(void *addr, size_t len, int flags);
// int munmap(void *addr, size_t len);
mmap 写文件
int my_mmap_write(const char *path, const char *text)
{
//打开文件
int fd;
if( (fd = open(path, O_RDWR)) < 0) {
perror("open\n");
return -1;
}
//获取文件属性
struct stat sb;
if(fstat(fd, &sb) == -1) perror("fstat");
//映射地址空间
char *mmapped;
if( (mmapped = mmap(NULL, sb.st_size, PROT_READ|\
PROT_WRITE, MAP_SHARED, fd, 0)) == (void*)-1) perror("mmap\n");
close(fd);
//修改同步文件内容的磁盘文件
mmapped[20] = '6';
if((msync((void*)mmapped, sb.st_size, MS_SYNC)) == -1) perror("msync");
//映射区释放
if((munmap((void *)mmapped, sb.st_size)) == -1) perror("munmap\n");
}
mmap 读文件
void my_mmap_read(char *path)
{
char buf[MAX_LEN] = {0};
int fd;
if( (fd = open(path, O_RDWR)) < 0) {
perror("open\n");
return;
}
close(fd);
struct stat sb;
if(fstat(fd, &sb) == -1) perror("fstat");
char *mmapped;
if((mmapped = mmap(NULL, sb.st_size, PROT_READ,
MAP_SHARED, fd, 0)) == (void*)-1) perror("mmap\n");
close(fd);
printf("[sxd]------buf:%s\n", mmapped);
}
调用方法:
int main(int argc, char **argv)
{
if (argc != 3) {
printf("param number:%d\n", argc);
printf("need two paramters\n");
return -1;
}
// argv[0] 是运行程序本身的命令
my_mmap_write(argv[1], argv[2]);
my_mmap_read(argv[1]);
return 0;
}