【Linux】mmap内存映射

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡><)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
Linux系列专栏:Linux基础

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


目录

  • 一、mmap()函数
  • 二、代码示例:
  • 三、映射权限问题

一、mmap()函数

mmap内存映射是一种可以用于进程间通信的技术,通过mmap,多个进程之间可以直接读取和修改磁盘上的文件内容,从而实现进程通信。

同时也不需要像传统方式那样先将文件读入到用户空间,然后再从用户空间写入内核空间。这种映射机制提高了文件访问的效率。(相比于read()减少了一次拷贝开销)

#include  
void* mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);	

函数参数:

  • addr: 映射区的首地址。通常传NULL,表示让系统自动选择一个合适的地址
  • length:要映射的字节数
  • prot:内存映射区的读写权限。可以分为PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
  • flags:映射的属性,可以分为 MAP_PRIVATE(对映射内容的修改不写入 拷贝映射)或 MAP_SHARED(对映射内容的修改写入 Sync同步
  • fd:要映射的文件的文件描述符
  • offset:文件中的偏移量,表示从文件的哪个位置开始映射,默认为0代表整个文件,需要是页大小的倍数(例如4K、8K…)

函数返回值:

  • 如果映射成功:返回一个指向映射区首地址的泛型指针,可以使用不同数据类型访问数据
  • 如果映射失败:返回MAP_FAILED,为(void *) -1

释放映射区:

int munmap(void *addr, size_t length);	

函数参数:

  • addr:映射区首地址,mmap函数中的返回值
  • length:映射的字节数大小

二、代码示例:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main()
{
	int* ptr = NULL;
	//获取文件大小
	int fd,FileSize;
	fd = open("file",O_RDWR);
	FileSize = lseek(fd,0,SEEK_END);
	if(FileSize == 0)
	{
		perror("file is NULL");
		exit(0);
	}
	//mmap内存映射
	if((ptr = mmap(NULL,FileSize,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)) == MAP_FAILED)
	{
		perror("mmap failed");
		exit(0);
	}
	close(fd);
	//通过sync同步机制 修改内存,同步到文件中
	ptr[0] = 0x34333231;  //将前4个字节修改为1234
	//释放内存映射区
	munmap(ptr,FileSize);
	return 0;
}

映射前:
image.png
映射后:
【Linux】mmap内存映射_第1张图片

通信示例:
【Linux】mmap内存映射_第2张图片

三、映射权限问题

映射的成功与否与用户本身的权限无关,而是取决于open()函数打开时的权限。
open打开时的权限需要小于映射时的权限


大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

你可能感兴趣的:(【Linux】,linux,笔记,学习,ubuntu)