内存的映射
最佳答案 问答题库668位专家为你答疑解惑
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
功能:将一个文件或者设备的数据映射到内存中
参数:
-void *addr:NULL,由内核指定
-length:要映射的数据的长度,这个值不能为0.建议使用文件的长度
可以使用stat、 lseek函数获取文件的长度
-prot:对申请的内存映射区的操作权限
-PROT_EXEC:可执行的权限
-PROT_READ:读权限
-PROT_WRITE:写权限
-PROT_NULL:没有权限
要操作映射内存,必须要有读的权限
PROT_WRITE | PROT_READ、PROT_READ
-flags:
-MAP_SHARED:映射区的数据会自动和磁盘文件进行同步,进程间通信,必须要设置这个选项
_PRIVATE:不同步,内存映射区的数据变了,对原来的文件不会修改,会重新创建一个新的文件。(copy on write)
-fd:文件描述符,通过open得到 注意:文件的大小不能为0 open指定的权限不能喝prot参数有冲突
-offset:偏移量,一般不用,必须是4K的整数倍,0表示不偏移
返回值:成功返回创建的内存的首地址,失败返回(void *) -1
int munmap(void *addr, size_t length);
功能:释放内存映射
参数:
-addr:要释放的内存的首地址
-length:要释放的内存大小,要和mmap函数length参数一致
注意
使用内存映射实现进程间通信:
1.有关系的进程(父子进程)
-还没有子进程的时候
-通过唯一的父进程,先创建内存映射区,有了内存映射区以后,创建子进程,父子进程共享创建的内存映射区
2.没有关系的进程间通信
-准备一个大小不是0的磁盘文件
-进程1 通过磁盘文件创建内存映射区
-得到一个操作这块内存的指针
-进程2 通过磁盘文件创建内存映射区
-得到一个操作这块内存的指针
使用内存映射区通信
注意:内存映射区通信,是非阻塞
#include<stdio.h>
#include <sys/mman.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#include<wait.h>int main() {//打开一个文件int fd = open("test.txt", O_RDWR);//获取文件大小int size = lseek(fd, 0, SEEK_END);//创建内存映射区void * ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if(ptr == MAP_FAILED) {perror("map");exit(0);}//创建子进程pid_t pid = fork();if(pid > 0) {wait(NULL);//父进程char buf[64];strcpy(buf, (char *) ptr);printf("read data : %s\n", buf);} else if(pid == 0) {//子进程strcpy((char *) ptr, "nihao, son!!! \n");}//关闭内存映射区munmap(ptr, size);return 0;
}
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"内存的映射":http://eshow365.cn/6-12528-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!