在创建映射区时,我们创建了一个文件,后面又需要unlink删除,然后munmap释放内存映射区,所以一开始就没必要创建。
匿名映射区是指创建的映射区域不与任何文件关联,而是由操作系统分配的匿名内存。
mmap 内存映射里所谓的内存其实指的是虚拟内存,在调用 mmap 进行匿名映射的时候(比如进行堆内存的分配),是将进程虚拟内存空间中的某一段虚拟内存区域与物理内存中的匿名内存页进行映射,当调用 mmap 进行文件映射的时候,是将进程虚拟内存空间中的某一段虚拟内存区域与磁盘中某个文件中的某段区域进行映射。
优势:代码简洁了,不易出错,系统分配内存
局限性:匿名映射只能用于有血缘关系的进程之间,因为之间共享内存,其他进程因为没有指定名字,那没法通信
实验结果:和前面的分享结果一样
采用匿名映射区代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h> int var=100; int main(){ int *p; pid_t pid; p=(int *)mmap(NULL,40,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); if(p==MAP_FAILED){ //注意不是p==NULL perror("mmap error"); exit(1); } pid=fork(); // 创建子进程 if(pid==0){ *p=2000; //写共享内存 var=1000; printf("child,*p=%d,var=%d\n",*p,var); } else{ sleep(1); printf("parent,*p=%d,var=%d\n",*p,var); wait(NULL); int ret=munmap(p,4); //释放映射区 if(ret==-1){ perror("munmap error"); exit(1); } } return 0; }
之前的代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h> int var=100; int main(){ int *p; pid_t pid; int fd; fd=open("temp",O_RDWR|O_CREAT|O_TRUNC,0664); if(fd<0){ perror("open error"); exit(1); } unlink("temp"); ftruncate(fd,4); //p=(int *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); p=(int *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0); if(p==MAP_FAILED){ //注意不是p==NULL perror("mmap error"); exit(1); } close(fd); //映射区建立完毕,即可关闭文件 pid=fork(); // 创建子进程 if(pid==0){ *p=2000; //写共享内存 var=1000; printf("child,*p=%d,var=%d\n",*p,var); } else{ sleep(1); printf("parent,*p=%d,var=%d\n",*p,var); wait(NULL); int ret=munmap(p,4); //释放映射区 if(ret==-1){ perror("munmap error"); exit(1); } } return 0; }