参考博客:
- 什么是mmap?
- Linux mmap
- MAP_PRIVATE和MAP_SHARED之间的区别
linux关于文件空间映射的常见函数原型
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void *addr, size_t length);
int msync(void *addr, size_t length, int flags);
创建内存映射
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
@param addr:指定起始地址,一般都置为NULL,由系统选择映射的起始地址
@param length:指定期望的映射内存大小,实际大小往往以页大小边界左右(具体未知),但是肯定大于等于你期望大小。
@param prot:PROT_EXEC ,PROT_READ ,PROT_WRITE ,PROT_NONE
@param flags:常用的MAP_SHARED和MAP_PRIVATE
- MAP_PRIVATE:映射的更新对映射相同文件的其他进程不可见,并且不更新底层文件
- MAP_SHARED:映射的更新对映射此文件的其他进程可见,并更新到底层文件。在调用msync(2) 或munmap()之前,文件可能不会实际更新。
@parma offset:映射文件的偏移地址,必须是page(sysconf(_SC_PAGESIZE))的整数倍。
映射完成之后就可以关闭文件了。
下面创建一个完整的内存映射,并且查看内容
int main()
12 {
13 int f = open("a.txt",O_CREAT|O_RDWR,S_IRUSR|S_IWUSR);
14 if (f < 0)
15 {
✹ 16 printf(strerror(errno));
17 printf("file open failed\n");
18 return 0;
19 }
20
21 int page_size = sysconf(_SC_PAGESIZE);
22 printf("page size:%d\n",page_size);
23
24 char *ptext =(char *) mmap(NULL,20,PROT_READ|PROT_WRITE,MAP_SHARED,f,page_size);
25 close(f);//映射完成之后就可以关闭文件了
26 if(ptext != (void *)-1)
27 {
✹ 28 printf("content len:%d\n",strlen(ptext));
29 // printf("content:%s\n",ptext);
30 }
31 else
32 {
33 printf("mmap error:%s\n",strerror(errno));
34 return 0;
35 }
36
37 strcpy(ptext,"wwwwwww");
38
39 int ival = msync(ptext,20,0);
40 printf("msync ret:%d\n",ival);
41
42 ival = munmap(ptext,20);
43 printf("munmap ret:%d\n",ival);
44 return 0;
45 }
上面demo中我们实际期望数据是20,但是实际远远大于(demo使用的是文本文件方便测试)。