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;
}
相关推荐
X journey17 小时前
机器学习进阶(13):支持向量机SVM
算法·机器学习·支持向量机
洛水水18 小时前
【力扣100题】30.二叉树的直径
算法·leetcode·职场和发展
叶帆18 小时前
【YFIOs】Docker方式部署
运维·docker·容器
gihigo199818 小时前
Bezier曲线曲面生成算法
算法
小猿姐19 小时前
Clickhouse Kubernetes Operator 实测:哪种方案更适合生产?
运维·数据库·kubernetes
平行侠19 小时前
024多精度大整数 - 突破硬件精度限制的任意精度运算
数据结构·算法
彩色的黑'''19 小时前
[root@localhost ~]#,Linux系统的命令提示符为啥现在变成-bash-4.2#了,哪里设置的
linux·运维·bash
树下水月19 小时前
文件分片上传接口(Easyswoole)被nginx拦截,并返回状态码400和408的抓包排查过程
运维·nginx
IronMurphy19 小时前
【算法四十五】139. 单词拆分
算法
源远流长jerry20 小时前
Linux 网络发送机制深度解析:从应用到网线
linux·服务器·网络·网络协议·tcp/ip