mmap可以把磁盘文件的一部分直接映射到内存,这样文件的位置就有对应的地址
对文件的读写可以直接用指针来做而不需要read write
shared 映射
private 映射
修改内存中的数据,磁盘当中跟着修改shared
否则private映射 ,内存当中修改不影响磁盘
man mmap 查看这个函数的使用
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
//addr 映射的内存地址 NULL:在传递的地址附近找一块空闲内存空间分配 NULL:0地址
//length:映射磁盘文件的长度
//prot: PROT_READ PRO_WRITE PROT_EXEC 页面是否有读写执行权限
//flags MAP_SHARED MAP_PRIVATE
//fd 文件描述符 映射的磁盘文件必须打开
//off_t offse 偏移量 从哪个位置开始偏移4096的整数倍(页面)
//void*返回值:返回申请内存的首地址 失败返回宏
//失败原因:内存不够 或者传入无效的文件描述符
//文件只有读权限 映射时分配写权限.....
int munmap(void* addr,size_t length)//没有munmap 内存泄露
打开文件描述符 没有关闭 也会导致内存泄露
//写进程
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>
#define MAPLEN 0x1000
void sys_err(char* str,int exitno){
perror(str);
exit(exitno);
}
int main(int argc,char* argv[]){
char*mm;
int fd;
int i;
if(argc < 2){
printf("%s filename\n",argv[0]);
exit(1);
}
fd=open(argv[1],O_RDWR|O_CREAT,0777);//文件不存在 创建
if(fd < 0)
sys_err("Open error",1);
lseek(fd,MAPLEN-1,SEEK_SET);//拓展一个文件
if(lseek < 0 )
sys_err("lseek",3);
if(write(fd,"\0",1)<0)
sys_err("write error",4);
mm=mmap(NULL,MAPLEN-1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(mm == MAP_FAILED)
sys_err("mmap error",2);
close(fd);
while(1){
sprintf(mm,"hello%d",i++);
sleep(1);
}
munmap(mm,MAPLEN);
return 0;
}
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>
#define MAPLEN 0x1000
void sys_err(char* str,int exitno){
perror(str);
exit(exitno);
}
int main(int argc,char* argv[]){
char*mm;
int fd;
int i;
if(argc < 2){
printf("%s filename\n",argv[0]);
exit(1);
}
fd=open(argv[1],O_RDWR);
if(fd < 0)
sys_err("Open error",1);
mm=mmap(NULL,MAPLEN-1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(mm == MAP_FAILED)
sys_err("mmap error",2);
close(fd);
while(1){
printf("%s\n",mm);
sleep(1);
}
munmap(mm,MAPLEN);
return 0;