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