创建内存映射区:
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同上
代码:
#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==NULLperror("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;
}