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