mmap函数创建匿名映射区

mmap函数创建匿名映射区

mmap一般创建思路

  1. 打开一个文件,得到该文件的文件描述符
int fd = open(char *path,int mode)
  1. 创建该文件的内存映射区
void *mptr = mmap(void *addr,size_t len,int prot,int mode,ssize_t fd,size_t offset);
	addr -------  NULL
	len  -------  4k的整数倍
	prot -------  PROT_READ   PROT_WRITE
	mode -------  MAP_SHARED  MAP_PRIVATE
	fd   -------  文件描述符
	offset------  偏移量(距离映射区首地址的字节数)
  1. 修改内存映射区的内容,用首地址进行操作
  2. 关闭资源
close(fd)        //关闭文件描述符
munmap(void *mptr,size_t len)  		//关闭内存映射区

mmap匿名映射区

思考:既然是兄弟,或者父子进程间进行通信,我们有着一样的数据,为什么一定要靠着打开一个文件,然后映射到内存,来进行通信呢?它们之间也不需要被映射到内存中的文件中的数据呀,这样做是是不是多此一举?于是就想我们可以请求操作系统在内存中,给他们开辟一块固定大小的空间,它们使用这块内存的地址,来作为桥梁进行通信,这就是匿名内存映射区

  1. 直接创建映射区
void *mptr = mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANON,-1,offset);
//注意
mode参数必须要有一个参数是 MAP_ANON
文件描述符可以填-1
len 长度需要指定出来,4k的整数倍
  1. 进行操作
  2. 关闭资源
munmap(void *ptr,int len);

注意:此种内存映射区,存在局限性,只能用于进行有血缘关系之间的进程进行通信

没有血缘关系之间的进程进行通信

  1. 需要一个桥梁,需要打开一个文件,(匿名内存映射区,无法提供同样的地址,即使提供了同样的地址,也属于非法操作内存,)
int fd = open("filename",O_RDWR | O_CREAT,0664)
  1. 如果此文件是空的话,无法映射到内存,所以必须给文件预留空间,即改变文件的大小
    (如果不进行这一步操作,会产生段错误)
truncate(fd,len) //参数是文件描述符和长度
  1. 映射到内存
void *mptr = mmap(void *addr,int len,.......)
  1. 直接用地址操作内存,来达到通信效果
  2. 关闭资源

你可能感兴趣的:(系统函数使用)