-------根据网上视频整理
1、mmap():
所谓的存储映射IO是指将某一块内存或文件存储内容映射到当前进程中来。
其实,malloc不也是这种作用嘛。。。
效果:进程中访问一段char* 类型就像访问那段内存一样。
作用:做共享内存
#include <sys/mman.h>
void *mmap(void*addr,size_t length,int prot,int flags,int fd,off_t offset);
参数:
1)addr:映射到进程空间的起始位置
可以置为NULL,意为由mmap为我们找一块可用的地址空间。
2)length: 指要将多长的内容映射进来。内存大小。
3)prot:完成了内存映射,当前的内存是什么样的属性。也就是要对当前映射过来的内存做什么操作。
4)flags: 位图 ,对映射空间的特殊要求
必选项:以下二选一
MAP_SHARED :对内存空间所做的修改,别人都能看到
MAP_PRIVATE :对内存的修改,只有自己能看到
非必选项:有好多
比如:
MAP_ANONYMOUS :匿名映射,作用相当于 malloc
此时fd,可以置为-1.
5)fd,文件描述符,即如果要对文件进行映射的话,需要先将文件打开。
6)offset:偏移量,fd中内容偏移量。一般置为0,因为我们一般从文件的其实位置开始。
故:mmap函数的意思:将fd中从偏移量offset开始的length长度字节的内存空间映射到addr这块地址中来,权限是prot,特殊要求是flags.
返回值:
成功:内存空间映射的起始位置。
失败:返回MAP_FAILED 即( (void*) -1),有宏的我们要使用宏,而不是宏值。设置errno.
2、munmap()
对映射过来的空间解除映射
int munmap(void *addr,size_t length);
如果mmap时,flags使用了MAP_ANONYMOUS 表示,此时的munmap其实就是free()函数。
返回值:
成功返回0;
失败返回-1,设置errno(可能是 EINVAL).
3、示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char*arg[])
{
int fd;
struct stat statres;
char *str;
int i;
int count = 0;
if(argc<2)
{
fprintf(stderr,"argc error...\n");
exit(1);
}
fd = open(argv[1],0_RDONLY);
if(fd<0)
{
perror("open()");
exit(1);
}
if(fstat(fd,&statres)<0)
{
perror("fstat");
exit(1);
}
str = mmap(NULL,statres.st_size,PROT_READ,MAP_SHARED,fd,0);
if(str == MAP_FAILED)
{
perror("mmap()");
exit(1);
}
close(fd);//可以在此处就关闭文件描述符,因为已经映射过来了,而且是只读。
for(i = 0;i<ststres.st_size;i++)
{
if(str[i]=='a')
count++:
}
printf("%d\n",count);
munmap(str,statres.st_size);
exit(0);
}