码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Linux文件-内存映射mmap


    mmap定义为:Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。

    在LINUX中我们可以使用mmap用来在进程虚拟内存地址空间中分配地址空间,创建和物理内存的映射关系。
    在这里插入图片描述
    mmap() 系统调用的原型
    函数原型:void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
    配套函数原型:int munmap(void *addr, size_t length);
    头文件:#include
    返回值:成功返回创建的映射区的首地址;失败返回宏 MAP_FAILED。

    参数介绍:
    addr: 建立映射区的首地址,由 Linux 内核指定。使用时,直接传递 NULL。
    length: 欲创建映射区的大小。
    prot: 映射区权限 PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE。
    flags: 标志位参数(常用于设定更新物理区域、设置共享、创建匿名映射区);
    MAP_SHARED: 会将映射区所做的操作反映到物理设备(磁盘)上。
    MAP_PRIVATE: 映射区所做的修改不会反映到物理设备。
    fd: 用来建立映射区的文件描述符。
    offset: 映射文件的偏移(4k 的整数倍)。
    munmap 函数:同 malloc 函数申请内存空间类似的,mmap 建立的映射区在使用结束后也应调用类似 free 的函数来释放。

    返回值:成功:0; 失败:-1

    https://blog.csdn.net/chumingqian/article/details/124855768

    使用示例:

    #include
    #include
    //文件映射到内存
    int shareFd = fopen("1.txt");//一个文件  
    unsigned char *srcAddr = NULL;
    uint32_t buffer_size = width * height * sizeof(int32_t);
    srcAddr = (unsigned char *)mmap(NULL, buffer_size, PROT_READ, MAP_SHARED, shareFd, 0);  //将文件映射到地址srcAddr 
    
    //读取1.txt的内容,保存到新的文件
    char dumpPath[100] = "";
    snprintf(dumpPath, sizeof(dumpPath), "/data/dump/buffer_%u_frame_%u_%u_%u.bin", sDumpCount++, width, height,sizeof(int32_t));
    int dumpFd = open(dumpPath, O_WRONLY|O_CREAT|O_TRUNC, 0644);
    if(dumpFd >= 0 && srcAddr != NULL) {
        write(dumpFd, srcAddr, buffer_size);
        // ALOGD("liuxurun dump writing buffer");
        close(dumpFd);
    }
    munmap((void*)srcAddr, buffer_size);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    单例模式的实现方式有哪两种?
    6.typescript类
    iOS开发Swift-9-SFSymbols,页面跳转,view屏幕比例,启动页-和风天气AppUI
    8.系统研发中的领导意志
    【Java】安装JDK开发者工具包并编写第一个程序“Hello World.java”
    【go微服务】gRPC
    云原生系列三:K8s应用安全加固技术
    深入探讨TensorFlow:张量与矩阵
    ESP8266-Arduino编程实例-MS5611气压传感器驱动
    微软修改 MIT 项目原作者版权声明引发争议;白宫为提高开源安全性邀请软件行业者座谈;Ruby 3.1.0 发布 | 开源日报
  • 原文地址:https://blog.csdn.net/qq_40500571/article/details/133772709
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号