由于在操作系统层面,各个进程所看到的虚拟地址空间是独立的,之间没有交集。因此需要通过中间一个关联将多个关联进程的不同虚拟地址映射到相同的物理地址空间中。
MMAP 就是这么一个功能,它把一个文件(也就是在内存中的物理地址空间确定)映射到不同进程的地址空间中。
一、写
值得注意的是由于MMAP需要内存中的物理地址空间,因此在写操作过程中需要将文件加载到内存中才能进行操作,因此在打开文件后需要进行写操作,引起缺页异常,将文件映射到内存中。
- fd = open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
- lseek(fd, 4, SEEK_SET);<span style=“color:#ff0000;”>//这里size最好为共享的结构体的大小,将整个需要的大小都加载到内存中
- </span>write(fd,“”,1);
- p_mmap = (int *) mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd , 0);
- close(fd);
- *(p_mmap) =1;
如果不进行写空操作便直接进行mmap映射,便会造成段错误,因为实际的fd对应的物理内存不存在。
二、读
读进程必须在写进程之后调用mmap,否者会出现段错误,和前面一样的道理。
读进程流程
- fd= open(argv[1], O_CREAT |O_RDWR, 0077);
- p_mmap = (int *) mmap (NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- printf(“data: %d \n”, (*(p_mmap)));