内存映射实现父子进程通信

简介: 内存映射实现父子进程通信

创建内存映射区:

void *mmap(void *addr ,size_t length,int prot,int flags,int fd,off_t offset);

参数:

  • addr  指定映射区的首地址。通常NULL,表示让系统自动分配
  • length  共享内存映射区的长度
  • prot  共享内存的读写属性  PROT_READ  PROT_WRITE
  • flags  标注共享内存的共享属性  MAP_SHARED  MAP_PRIVATE
  • fd  用于创建共享内存映射区的那个文件的文件描述符
  • offset 默认为0 表示映射文件全部  偏移位置 需是4k的整数倍

返回值

  • 成功:映射区的首地址
  • 失败:MAP_FAILED(void*(-1)),error

int munmap(void *addr,size_t length)    释放映射区

  • addr  mmap的返回值
  • length 大小

实验结果:

*p是共享内存  两者一致

那为什么全局变量var的值不一样呢?

因为两个进程所占的内存相互独立,所以子进程只改变了自己内存中的var值

读时共享,写时复制  读的时候读取共享内存,写的时候复制共享内存

此时flags的状态是MAP_PRIVATE,所以内存对互相都是私有

子进程改变*p,父进程不会受影响

var同上

实现任意进程间通信:内存映射实现无血缘关系进程间通信-CSDN博客

代码:

#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;
}
相关文章
|
1月前
|
安全
【进程通信】信号的捕捉原理&&用户态与内核态的区别
【进程通信】信号的捕捉原理&&用户态与内核态的区别
|
1月前
|
Shell
【进程通信】利用管道创建进程池(结合代码)
【进程通信】利用管道创建进程池(结合代码)
|
4天前
|
存储 缓存 运维
深入理解操作系统:从进程管理到内存分配
在数字时代的心脏,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心机制,包括进程管理、内存分配和文件系统,揭示它们如何协同工作以支持现代计算需求。通过技术深度解析和实际应用示例,我们将一窥操作系统的复杂性与优雅,理解其在软件开发和系统性能优化中的重要性。
|
16天前
|
存储 安全 Python
进程通信 , 信号量 , 队列 , 管道 , 共享内存
进程通信 , 信号量 , 队列 , 管道 , 共享内存
|
24天前
|
消息中间件 Linux C语言
进程通信:管道与队列
进程通信:管道与队列
|
29天前
|
存储 安全 调度
【操作系统】进程控制与进程通信
【操作系统】进程控制与进程通信
29 3
|
1月前
|
NoSQL Linux Shell
【进程通信】了解信号以及信号的产生
【进程通信】了解信号以及信号的产生
|
24天前
|
存储 缓存 监控
深度解析操作系统中的核心组件:进程管理与内存优化
【5月更文挑战第29天】 在现代计算技术的心脏,操作系统扮演着至关重要的角色。它不仅管理和控制计算机硬件资源,还为应用程序提供了一个运行环境。本文将深入探讨操作系统中的两个核心组件——进程管理和内存管理,并分析它们对系统性能的影响以及如何通过技术手段实现优化。通过对操作系统内部机制的剖析,我们将揭示这些组件是如何相互作用,以及它们如何共同提升系统的响应速度和稳定性。
|
1月前
|
消息中间件 存储 安全
【Linux 系统】进程间通信(共享内存、消息队列、信号量)(下)
【Linux 系统】进程间通信(共享内存、消息队列、信号量)(下)

热门文章

最新文章

相关实验场景

更多