存储映射IO
mmap函数
!
其中文件的大小是小于等于真实文件大小,一般是等于。
权限一般是shared,private的话不会反应到磁盘上。
offset,默认0表示文件全部, 必须是4k的整数倍。
mmap基本使用
/*************************************************************************
> File Name: pipe_test.c
> Author: shaozheming
> Mail: 957510530@qq.com
> Created Time: 2022年02月27日 星期日 11时19分51秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/mman.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char* argv[])
{
char *p = NULL;
int fd;
int ret;
fd = open("testMap", O_RDWR | O_CREAT | O_TRUNC, 0644);
if(fd == -1)
sys_err("open error\r\n");
/* 扩展文件大小,因为0大小的文件不能用mmap */
ftruncate(fd, 20); //扩展大小为10
int len = lseek(fd, 0, SEEK_END); //使用lseek获取文件的长度
//void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
p = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(p == MAP_FAILED) {
sys_err("map error\r\n");
}
//使用p进行文件读写操作
strcpy(p, "hello mmap!"); //相当于写操作
printf("----%s----\r\n",p);
ret = munmap(p, len);
if(ret == -1)
sys_err("munmap error\r\n");
return 0;
}