内存映射-

news2024/12/24 8:51:42

 

内存映射区不会堵塞

父子进程之间通信

/*
    #include <sys/mman.h>
    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
    作用:将一个文件或者设备的数据映射到内存中
    参数:
        - addr:NULL
        - length:要映射的数据的长度,这个值不能为0,建议使用文件的长度
                    获取文件的长度:stat lseek
        - prot: 对申请的内存映射区的操作权限
            -PROT_EXEC:可执行的权限
            -PROT_READ:可读的权限
            -PROT_WRITE:可写的权限
            -PROT_NONE:没有权限
            要操作映射区,必须要有读的权限。PROT_READ或者PROT_READ | PROT_WRITE
        -flags:
            - MAP_SHARED:映射区的数据自动和磁盘文件进行同步,进程间通信,必须设置这个选项
            - MAP_PRIVATE:不同步,文件映射区的数据改变了,对原来的文件不会修改,会重新创造一个文件。
        -fd:需要映射的那个文件的文件描述符 (通过open得到,大小不能为0,open的权限不能和prot有冲突)
        -offset:偏移量,一般不用
    返回值:返回创建的内存的首地址,失败返回MAP_FAILED

    int munmap(void *addr, size_t length);
    功能:释放内存映射区
    参数:
        - addr:要释放的内存的首地址
        - length:要释放的内存的大小 与mmap的length一样大小

*/

/*
    使用内存映射实现进程间的通信:
    1.有关系的进程(父子进程)
        -还没有子进程的时候
            -通过唯一的父进程创建映射区
        -有了内存映射区之后,创建子进程
        -父子进程共享创建的内存映射区
    2.没有关系的进程之间的通信
        -准备一个大小不是0的磁盘文件
        -进程1:通过磁盘文件创建内存映射区
            - 得到一个操作这个内存的指针
        进程2:通过磁盘文件创建内存映射区
            - 得到一个操作这块内存的指针
        - 使用内存映射区通信
*/
#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<wait.h>
int main() {
    int fd = open("test.txt", O_RDWR);
    int size = lseek(fd, 0, SEEK_END);
    void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if(ptr == NULL) {
        perror("mmap");
        exit(0);
    }
    pid_t pid = fork();
    if(pid > 0) {
        wait(NULL);
        char buf[128];
        strcpy(buf, (char*)ptr);
        printf("read : %s\n", buf);
        
    } else if(pid == 0) {
        strcpy((char*)ptr, "nihao, parent!");
    }

    munmap(ptr, size);

    return 0;
}

注意事项:

一:如果对mmap的返回值(ptr)做++操作(ptr++),munmap是否能成功?

void* ptr = mmap(.....);

ptr++;可以进行++操作

munmap(ptr,len) //错误,要保存地址

二:如果open时O_RDONLY,mmap时prot参数指定PROT_READ | PROT_WRITE会怎么样?

错误,返回MAP_FAILED

open()函数中的权限建议和prot参数的权限一样

三:如果文件的偏移量为1000?

偏移量必须为1024的整数倍

四:mmap什么情况下会调用失败?

        -第二个参数length = 0

        -第三个参数prot

                -只规定了写权限

                -open的权限小于prot的权限

        -第四个参数偏移量不是1024的整数倍

五:可以open的时候O_CREATE创建一个新文件来创建映射区吗?

可以,但是文件大小如果为0 肯定不行   可以对新的文件进行扩展(lseek   truncate)

六:mmap后关闭文件操作符,对mmap映射有没有影响?

不会有问题,此时的映射区还在

七:ptr越界操作怎么样?

越界操作的是非法内存,段错误

通过这个实现文件拷贝

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<string.h>
int main() {
    int fd = open("english.txt", O_RDWR);
    if(fd == -1) {
        perror("open");
        exit(0);
    }
    int length = lseek(fd, 0, SEEK_END);
    int fd1 = open("cpy.txt", O_RDWR | O_CREAT, 0664);
    if(fd1 == -1) {
        perror("open");
        exit(0);
    }
    truncate("cpy.txt", length);
    write(fd1, " ", 1);

    void* ptr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    void* ptr1 = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0);

    memcpy(ptr1, ptr, length);
    munmap(ptr1, length);
    munmap(ptr, length);
    close(fd1);
    close(fd);
    
}

通过mmap实现匿名映射

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

int main() {
    int len = 4096;
    void* ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    pid_t pid = fork();
    if(pid > 0) {
        strcpy((char*)ptr, "hello, world");
        wait(NULL);
    } else if(pid == 0) {
        sleep(1);
        printf("%s\n", (char*) ptr);
    }
    int ret = munmap(ptr, len);
    exit(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

双喜临门 | 开源网安SFuzz在谷歌FuzzBench中夺魁,并获得CWE国际认证

​近日&#xff0c;开源网安模糊测试平台SFuzz于上半年推出的“灰盒代码模糊测试系统”&#xff0c;经过数月的不断调优&#xff0c;在谷歌的FuzzBench基准测试中脱颖而出&#xff0c;荣登榜首。此外&#xff0c;SFuzz还成功获得了CWE国际兼容性认证&#xff0c;进一步巩固了其…

警报:新的 Kubernetes 漏洞可对 Windows 端点实施远程攻击

不久前&#xff0c;研究人员在 Kubernetes 中发现的三个可被利用并相互关联的高危安全漏洞&#xff0c;这些漏洞可在集群内的 Windows 端点上以提升权限的方式实现远程代码执行。 这些漏洞被标记为 CVE-2023-3676、CVE-2023-3893 和 CVE-2023-3955&#xff0c;CVSS 评分为 8.8…

第73步 时间序列建模实战:多步滚动预测 vol-1(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上一期&#xff0c;我们讲了单步滚动预测&#xff0c;一次只预测一个值。 既然有单步&#xff0c;有没有多步呢&#xff1f;那肯定有&#xff0c;这一期来介绍多步滚动预测。 然而&#xff0c;多步滚动模型也可以有不同的步骤&#x…

Mac电脑运行太卡怎么办?

许多小伙伴使用Mac后都反馈电脑不如想象中的流畅&#xff0c;甚至有点卡顿的现象&#xff0c;原因可能是因为无用的应用占据了过多的内存&#xff0c;或者是系统盘垃圾过多&#xff0c;导致的电脑卡顿现象。 今天小编教给大家几招&#xff0c;让自己的Mac能够一键重生&#xf…

创造性地解决冲突

1、冲突的根本原因是矛盾双方存在不可调和的目标冲突。 2、要知己知彼&#xff1a; 知己&#xff1a;就是对自己的问题、需求进行客观定义&#xff0c;说明需求和问题的意义或价值、阐述解决方案和期望效果&#xff1b; 知彼&#xff1a;站在对方立场&#xff0c;深挖对方真…

探索AIGC人工智能(Midjourney篇)(四)

文章目录 Midjourney模特换装 Midjourney制作APP图标 Midjourney网页设计 Midjourney如何生成IP盲盒 Midjourney设计儿童节海报 Midjourney制作商用矢量插画 Midjourney设计徽章 Midjourney图片融合 Midjourney后缀参数 Midjourney模特换装 关键词生成模特照片 中国女性模特的…

虚拟机Ubuntu操作系统常用终端命令(3)(详细解释+详细演示)

本篇概要 本篇讲述了Ubuntu操作系统常用的几个功能&#xff0c;即修改文件权限、修改文件属性、可执行脚本、虚拟机网络、FTP服务器、SSH服务器、VIM等方面的知识。希望能够得到大家的支持。 文章目录 本篇概要1.修改文件权限2.修改文件属主3.可执行脚本3.1要点与细节3.2shell…

河北吉力宝打造步力宝智能康养鞋,助力健康中国行

据国家统计局数据&#xff0c;2022年我国总人口减少85万人&#xff0c;正式迈入人口负增长时代。人口老龄化程度的进一步加深令劳动力愈加不足&#xff0c;加之“421”的家庭结构&#xff0c;仅依靠政府性养老事业已难以支撑。 当老年群体对品质消费越来越看重时&#xff0c;康…

9万多条执业医师资格考试题库ACCESS数据库

《9万多条执业医师资格考试题库ACCESS数据库》搜集了大量执业医师资格考试试题&#xff0c;包括临床执业医师资格考试试题、口腔执业医师资格考试试题、中医执业医师资格考试试题、中西医结合执业医师资格考试试题、公卫执业医师资格考试试题等。 分类情况包含&#xff1a;临床…

MT4深受投资者喜欢,anzo capital昂首资本认为这几个特点必不可少

MT4为什么深受投资者喜欢&#xff0c;anzo capital昂首资本总结这几个特点&#xff0c;一起分享给各位投资者。 一.专业性 MT4平台是专门为外汇投资交易而设计的。投资者可以在指数、股票、债券、商品和各种货币上交易货币和差价合约。 二.兼容性 MT4不仅可用于32位操作系统…

对于每种情况分别统计概率来计算期望+树上连通块统计:ARC165E

https://atcoder.jp/contests/arc165/tasks/arc165_e 考虑一个常见套路&#xff0c;我们对每个连通块统计其概率&#xff0c;设为 p ( T ) p(T) p(T)&#xff0c;则答案为 ∑ ∣ T ∣ > k p ( T ) \sum_{|T|>k} p(T) ∣T∣>k∑​p(T) 可以想成对于每个大小大于 k …

RockyLinux安装MariaDB

文章目录 1 前言2 参考3 开始安装3.1 运行官方脚本 添加 MariaDB 的源3.2 安装 MariaDB Server3.3 启动 MariaDB 4 SSH 登录 MariaDB4.1 ssh 上使用 root 账号登录4.2 新建管理员账号并授权 5 放行端口 33065.1 VirtualBox 上设置端口转发5.2 Rocky Linux 防火墙放行 3306 端口…

nacos服务端--切换数据源

nacos服务端版本&#xff1a;2.3.0-SNAPSHOT 在nacos的服务端&#xff0c;需改application.properties文件 #*************** Config Module Related Configurations ***************# ### Deprecated configuration property, it is recommended to use spring.sql.init.platf…

BK698CPA15B0 创建了通用电气数字工业发展指数

BK698CPA15B0 创建了通用电气数字工业发展指数 基于调查研究&#xff0c;通用电气创建了通用电气数字工业发展指数&#xff0c;以跟踪数字化转型的实际进展——从对IIoT的展望到准备好转型。该创始指数在100分制中的总得分为63&#xff0c;表明尽管工业互联网的前景非常强劲&a…

3.2-3.4 Qt样式表使用补充说明

本期内容 3.2 设置样式的几种方式—— 3.2.1 不同方式使用介绍—— 3.2.2 不同方式的优缺点3.3 样式表使用过程中产生的冲突-分析及解决3.4 各控件中常用样式讲解及说明3.2 设置样式的几种方式 我们通常在使用Qt开发的过程中都会使用样式表来美化我们的界面,关于如何使用样式…

input修改checkbox复选框默认选中样式

问题描述&#xff1a; <input type"checkbox" /> input修改checkbox默认选中样式&#xff0c;直接设置选中后的样式不生效&#xff0c;需要先给复选框设置-webkit-appearance: none&#xff08;取消默认样式&#xff09;&#xff0c; 再设置样式才会生效。 …

Vue中的路由懒加载:提高性能和用户体验

Vue中的路由懒加载&#xff1a;提高性能和用户体验 在现代Web应用程序中&#xff0c;性能和用户体验是至关重要的。为了加速页面加载速度和提高用户感知的响应性&#xff0c;Vue提供了一种路由懒加载的方法。本文将详细介绍Vue中如何进行路由懒加载&#xff0c;并提供代码示例…

充分利用学习平台,提升个人职业竞争力

在当今竞争激烈的职场环境中&#xff0c;个人职业竞争力的提升变得至关重要。而充分利用学习平台成为了我们提升竞争力的一种有效途径。学习平台不仅可以提供丰富多样的学习资源&#xff0c;还能提升个人技能和知识水平&#xff0c;让我们更具竞争力。 学习平台提供了丰富的学…

图扑邀您共聚 IOTE 国际物联网展·深圳站 | 展会预告

参展时间&#xff1a;9 月 20 日- 22 日 图扑展位&#xff1a;9 号馆 9B 35-1 参展地址&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; IOTE 2023 第二十届国际物联网展深圳站&#xff0c;将于 9 月 20 日- 22 日在深圳国际会展中心&#xff08;宝安&#xff0…