Linux系统编程之mmap实现父子进程通信

mmap实现父子进程通信

原理:
在映射了映射区之后,父子都可以拿到映射的内存区域的内存地址,如果一个进程改变了内存区域的内容,另外一个去读的时候会有变化。
先创建映射区在fork
所以,应该先创建映射区再fork。

#include<stdio.h>
#include<unistd.h>
#include<sys/typrs.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<sys/wait.h>

int main(0
{
   //打开文件
   int fd =open("mem.txt",O_RDWR);
   //创建映射区
   int *mem=mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHRES,0);
   if(mem==MAP_FAILD)
   {
      perror("mmap err");
      return -1;
   }
   //fork子进程
   pid_t pid =fork();
   //父子进程交替修改数据
   if(pid==0)
   {
     //son
     *mem=100;
     printf("child,*mem=%d\n",*mem);
     sleep(3);
     printf("child,*mem=%d\n",*mem);
   }
   else if(pid>0)
   {
     //parent
     sleep(1);;
     printf("parent,*mem=%d\n",*mem);
     *mem=1001;
     printf("parent,*mem=%d\n",*mem);
     wait(NULL);//回收子进程
   }
   munmap(mem,4);
   close(fd);
   return 0;
}

输出

在这里插入图片描述
注意:mem.txt作用仅仅是打开一个文件。

结论:父子进程共享:1、打开文件描述符,2、mmap建立映射区(但是必须使用MAP_SHARED)

如果MAP_SHARED改位MAP_PRIVATE时,父进程没有读到子进程的数据,子进程也没有读到父进程的数据,结果如图所示

在这里插入图片描述
所以进程要通信的话,flags必须设为MAP_SHARED

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值