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;
}
相关推荐
Wy_编程35 分钟前
Linux-文本搜索工具grep
linux·运维·服务器
qq9989936 分钟前
AAA服务器技术
运维·服务器
xujiangyan_38 分钟前
linux的sysctl系统以及systemd系统。
linux·服务器·网络
Lovyk41 分钟前
Linux Shell 常用操作与脚本示例详解
linux·运维·服务器
iCan_qi1 小时前
【Mac】【Minecraft】关于如何在Mac上搭建基岩版MC服务器的方法
运维·服务器·macos·minecraft
猿究院--王升3 小时前
jvm三色标记
java·jvm·算法
一车小面包3 小时前
逻辑回归 从0到1
算法·机器学习·逻辑回归
ezreal_pan3 小时前
Kubernetes 负载均衡现象解析:为何同一批次请求集中于单个 Pod
运维·云原生·k8s·traefik
朱皮皮呀4 小时前
Spring Cloud——服务注册与服务发现原理与实现
运维·spring cloud·eureka·服务发现·php
xixingzhe24 小时前
多人同时导出 Excel 导致内存溢出
服务器·设计