【Linux】mmap内存映射

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

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

在这里插入图片描述



一、mmap()函数

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

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

#include <sys/mman.h> 
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 <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <stdio.h>
#include <sys/mman.h>
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
映射后:
image.png

通信示例:
image.png

三、映射权限问题

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


在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值