MAP_PRIVATE:私有映射,父子进程各自独占映射区
MAP_SHARED:共享映射区,父子进程共享映射区
父子等有血缘关系的进程之间也可以通过mmap 建立的映射区来完成数据通信,但对应的要在创建映射区的时候指定对应的额标志位参数flags;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>
int var=100;
/*父子进程共享*/
/*1-打开文件*/
/*mmap 建立的映射区*/
int main(void)
{
int *p;
__pid_t pid; //进程号
int fd; //文件描述符号
fd=open("/home/zjl/source.c",O_RDWR|O_TRUNC|O_CREAT,0644);//文件执行 d
if(fd<0){
perror("open error");
exit(1);//文件异常退出进程
}
//删除临时文件
unlink("/home/zjl/source.c");
ftruncate(fd,4); //改变文件的大小
//开辟文件内存
p=(int*) mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(p==MAP_FAILED){
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("parenr,*p=%d,var=%d\n",*p,var);
wait(NULL); //避免野指针
int ret=munmap(p,4);
if(ret ==-1){
perror("mumap error");
exit(1);
}
}
}