mmap匿名映射区

在创建映射区时,我们创建了一个文件,后面又需要unlink删除,然后munmap释放内存映射区,所以一开始就没必要创建。
匿名映射区是指创建的映射区域不与任何文件关联,而是由操作系统分配的匿名内存。

mmap 内存映射 里所谓的内存其实指的是虚拟内存,在调用 mmap 进行匿名映射的时候(比如进行堆内存的分配),是将进程虚拟内存空间中的某一段虚拟内存区域与物理内存中的匿名内存页进行映射,当调用 mmap 进行文件映射的时候,是将进程虚拟内存空间中的某一段虚拟内存区域与磁盘中某个文件中的某段区域进行映射。

优势:代码简洁了,不易出错,系统分配内存

局限性:匿名映射只能用于有血缘关系的进程之间,因为之间共享内存,其他进程因为没有指定名字,那没法通信

实验结果:和前面的分享结果一样

采用匿名映射区代码:

cpp 复制代码
#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;
}

之前的代码:

cpp 复制代码
#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;
}
相关推荐
Eric.Lee202121 分钟前
数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall
python·深度学习·算法·目标检测·计算机视觉·数据集·螃蟹检测
C++忠实粉丝29 分钟前
Linux环境基础开发工具使用(2)
linux·运维·服务器
林辞忧31 分钟前
算法修炼之路之滑动窗口
算法
￴ㅤ￴￴ㅤ9527超级帅41 分钟前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
liuyang-neu42 分钟前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
penguin_bark1 小时前
LCR 068. 搜索插入位置
算法·leetcode·职场和发展
康熙38bdc1 小时前
Linux 环境变量
linux·运维·服务器
存储服务专家StorageExpert1 小时前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
_GR1 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
ROBIN__dyc1 小时前
表达式
算法