——大文件操作,防止频繁读,效率低,所以映射到内存。映射到内存,再次操作文件就相当于操作内存,效率很高,操作完解除映射,文件也相应改变了;
mmap 将一个文件或者其它对象(主要指设备)映射进内存。文件被映射到多个页上(每页4K),如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零;mmap在用户空间映射调用系统中作用很大。
#include<sys/mman.h>
void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset); //失败返回(char*)-1
int munmap(void* start, size_t length); //解除内存映射:用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。
成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED,其值为(void *)-1,munmap返回-1
start:映射区的开始地址,设置为NULL时表示由系统决定映射区的起始地址。
length:映射区的长度。//长度单位是 以字节为单位,不足一内存页按一内存页处理(常用映射文件大小)
prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个的组合体 (常用MAP_SHARED)
fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射
off_toffset:被映射对象内容的起点。(相对于内存映射页的偏移)(常用0)
|
prot: PROT_READ|PROT_WRITE (页内容可读可写)
flags: MAP_SHARED (与其他所有映射这个对象的进程共享映射空间)
openmode: RDWR
test.c | |
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<sys/mman.h>
#include<string.h>
int main(int argc,char **argv)
{
int fd = open(argv[1],O_RDWR);
struct stat buf;
bzero(&buf,sizeof(struct stat));
fstat(fd,&buf);
char *p = (char *)mmap(NULL,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
printf("p=%s\n",p);
char tmp[5]="world";
for(int i=0;i<strlen(tmp);i++)
{
p[i]=tmp[i];
}
printf("------after change------\n%s\n",p);
munmap(NULL,buf.st_size);
return 0;
}
|
mmap
1、文件必须有大小,映射后不能改变文件大小
2、让系统帮我们选择起始地址,第一个参数问NULL
3、用完后要解除映射munmap
#include<unistd.h>
#include<sys/mman.h>
int munmap(void *start,size_t length); //接触映射;解除映射成功则返回0,否则返回-1
|