创建内存映射区:
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; }