系统相关
首页 > 系统相关> > 内存映射区mmap函数

内存映射区mmap函数

作者:互联网

mmap - 创建内存映射

作用: 将磁盘文件的数据映射到内存, 用户通过修改内存就能修改磁盘文件

函数原型

void *mmap(
void *adrr, // 映射区首地址,传NULL
size_t length, // 映射区的大小
® 100byte - 4k
® 不能为0
® 一般文件多大,length就指定多大
int prot, // 映射区权限
PROT_READ – 映射区必须 要有读权限
PROT_WRITE
PROT_READ | PROT_WRITE
int flags, // 标志位参数
® MAP_SHARED
◊ 修改了内存数据会同步到磁盘
® MAP_PRIVATE
◊ 修改了内存数据不会同步到磁盘
int fd, // 文件描述符
® 干嘛的文件描述符?
◊ 要映射的文件对应fd
® 怎么得到?
◊ open()
off_t offset // 映射文件的偏移量
® 映射的时候文件指针的偏移量
◊ 必须是4k的整数倍
◊ 0
);
返回值:
§ 映射区的首地址 - 调用成功
§ 调用失败:MAP_FAILED

munmap - 释放内存映射区

	 int munmap(void *addr, size_t length);	
		 addr - -mmap的返回值,映射区的首地址
		 length -- mmap的第二个参数,映射区的长度

:

相关问题

1、 如果对mmap的返回值(ptr)做++操作(ptr++), munmap是否能够成功?
不能

2、 如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样?
报错,打开文件时指定的权限需要大于等于mmap设置的权限。

3、 如果文件偏移量为1000会怎样?
报错

4、 mmap什么情况下会调用失败?
各个参数的传参有问题,需要具体分析。

5、 可以open的时候O_CREAT一个新文件来创建映射区吗?
可以

6、 mmap后关闭文件描述符,对mmap映射有没有影响?
没有

测试源码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>


int main(int argc, const char* argv[])
{
    int fd = open("aa.txt", O_RDWR);
    if(fd == -1)
    {
        perror("open error");
        exit(1);
    }

    // get file length
    // len > 0
    int len = lseek(fd, 0, SEEK_END);

    void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if(ptr == MAP_FAILED)
    {
        perror("mmap error");
        exit(1);
    }
    close(fd);
 
    char buf[4096];
    // 从内存中读数据
    printf("buf = %s\n", (char*)ptr);
    strcpy(ptr, "你是我儿子吗?");


    int ret = munmap(ptr, len);
    if(ret == -1)
    {
        perror("munmap error");
        exit(1);
    }

    return 0;
}

测试结果

在这里插入图片描述

关键代码分析

其实mmap和malloc函数功能有点类似,使用它可以提供一种新的创建内存块的方法。

标签:映射,int,mmap,PROT,内存,include
来源: https://blog.csdn.net/zxy131072/article/details/89517030