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;
}
相关推荐
qwy7152292581633 小时前
1-Docker Engine 安装前置环境配置
运维·docker·容器
W23035765734 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
菜菜艾4 小时前
基于llama.cpp部署私有大模型
linux·运维·服务器·人工智能·ai·云计算·ai编程
重生的黑客4 小时前
Linux开发工具:条件编译、动静态库与 make/makefile 入门
linux·运维·服务器
minji...5 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
.柒宇.5 小时前
nginx入门教程
运维·nginx
w6100104665 小时前
cka-2026-ConfigMap
java·linux·cka·configmap
cc_yy_zh5 小时前
Win10 家庭版找不到Device Guard; 无法处理 VMware Workstation与Device Guard不兼容问题
linux·vmware
航Hang*5 小时前
VMware vSphere 云平台运维与管理基础——第2章(扩展):VMware ESXi 5.5 安装、配置与运维
运维·服务器·github·系统安全·虚拟化
嵌入式吴彦祖5 小时前
Luckfox Pico Ultra W WIFI
linux·嵌入式硬件