MMAP文件映射:
mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或System V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
首先用文件空洞和ftruncate改到4k的空间大小,把文件映射到内存里面,可提高多线程或者多进程来进行读写。
Lazy模式,在映射时会耗时;比read,write系统调用的速率高三倍
#include <sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
//从磁盘映射到内存
//start,起始点(文件开头)
//length映射多长,文件映射多少,一般是4096,用stat查看大小
//prot,内存保护标志
//flags是否可以共享的标志
//fd文件描述符
//被映射对象内容起点,相对于start的偏移数
char* pstart = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
//prot与fd属性要保持一致,位权限,rdwr
//MAP_SHARED,默认共享
int munmap(void* addr,size_t length);
//解除映射,文件从内存回归磁盘
//addr必须为共享内存最开始获得的pstart,不能偏移
//length映射的长度大小,初始获取的大小
int ret = munmap(pstart, 4096);
内存管理中,大于4k的用堆空间, 小于4k的用栈空间,MMAP不具备改变文件大小的功能
应用实例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("error args\n");
return -1;
}
int fd;
fd=open(argv[1],O_RDWR);
if(-1==fd)
{
perror("open");
return -1;
}
char *pstart;
pstart=(char*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if((char*)-1==pstart)
{
perror("mmap");
return -1;
}
printf("%s\n",pstart);
pstart[0]='H';
int ret=munmap(pstart,4096);
if(-1==ret)
{
perror("munmap");
return -1;
}
return 0;
}