没有血缘关系的进程如何通过映射区mmap进行通信?
- 不能使用匿名的映射方式
- 只能借助磁盘文件创建有名映射区
- 缺点:不阻塞
创建有名内存映射区
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<stdio.h>
int main(){
int fd=-1;
int ret=-1;
void *addr=NULL;
//打开文件
fd=open("test",O_RDWR);
if(-1==fd){
perror("open");
return 1;
}
//映射到内存
addr=mmap(NULL,1024,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
if(addr==MAP_FAILED){
perror("mmap");
return 1;
}
printf("mmap success\n");
//关闭文件
close(fd);
//写文件
memcpy(addr,"abc123",6);
//断开映射
munmap(addr,1024);
return 0;
}
创建匿名内存映射区
- 创建匿名映射区非常简单,只需要加上MAP_ANONYMOUS即可,参数len长度可以随便大小,fd没有传-1即可。open这些函数可以不需要了,并且匿名映射实际上就是解决中间创建的文件问题。
- 并且,匿名映射区只能用于有血缘关系的进程,因为没有血缘关系的话,两个进程是没有共同的介质通信。并且之前我们也讲过进程间共享文件描述符和mmap映射区。
#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(void)
{
int *p;
pid_t pid;
p = (int *)mmap(NULL, 400, PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);//fd没有传-1即可
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, 400); //释放映射区
if (ret == -1) {
perror("munmap error");
exit(1);
}
}
return 0;
}
https://www.cnblogs.com/huxiao-tee/p/4660352.html