当前位置:

首页 > 编程开发 > C++在Linux中如何使用共享内存

C++在Linux中如何使用共享内存

在Linux环境下,C++与共享内存的交互,其实主要就是两条路:POSIX共享内存API,以及System V那一套。今天咱们先拿POSIX讲个基础例子,手把手带大家走一遍流程。 首先,头文件得备齐。别嫌麻烦,这几个是标配: #include #include // 文件控制常量,比如O_CREAT

本文目录

    在Linux环境下,C++与共享内存的交互,其实主要就是两条路:POSIX共享内存API,以及System V那一套。今天咱们先拿POSIX讲个基础例子,手把手带大家走一遍流程。

    C++在Linux中如何使用共享内存

    首先,头文件得备齐。别嫌麻烦,这几个是标配:

    #include 
    #include    // 文件控制常量,比如O_CREAT
    #include  // mmap核心
    #include   // close
    #include    // memset、memcpy
    

    接下来,创建共享内存对象。这里用shm_open,名字得是“/”开头,比如"/my_shm"。权限0666,读写都开,O_CREAT表示没有就新建。注意错误处理,别偷懒:

    const char* shm_name = "/my_shm";
    int shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0666);
    if (shm_fd == -1) {
        perror("shm_open");
        exit(EXIT_FAILURE);
    }
    

    光有对象不行,还得给它定个大小。这里用ftruncate设置1KB,也就是1024字节。如果失败,同样得处理:

    size_t shm_size = 1024; // 1KB
    if (ftruncate(shm_fd, shm_size) == -1) {
        perror("ftruncate");
        exit(EXIT_FAILURE);
    }
    

    然后,最关键的一步:把共享内存映射到进程的地址空间。用mmap,参数分别是:NULL让系统选地址,长度1024,读写权限,MAP_SHARED表示其他进程也能看到(这才是共享的关键),文件描述符,偏移0。返回值是MAP_FAILED就说明挂了:

    void* ptr = mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(EXIT_FAILURE);
    }
    

    映射到手,就能往里面读写数据了。比如,我们写个字符串,“Hello, shared memory!”,注意加个空字符结尾:

    std::string message = "Hello, shared memory!";
    memcpy(ptr, message.c_str(), message.size() + 1);
    
    // 读出来看看
    std::cout << "Message from shared memory: " << static_cast(ptr) << std::endl;
    

    用完之后,记得清理。先munmap解除映射,再close文件描述符。如果想彻底删除这个共享内存对象,可以调用shm_unlink,不过这不是必须的,看场景:

    if (munmap(ptr, shm_size) == -1) {
        perror("munmap");
        exit(EXIT_FAILURE);
    }
    if (close(shm_fd) == -1) {
        perror("close");
        exit(EXIT_FAILURE);
    }
    // 可选:删除共享内存对象
    if (shm_unlink(shm_name) == -1) {
        perror("shm_unlink");
        exit(EXIT_FAILURE);
    }
    

    这个例子虽然简单,但已经把核心流程跑通了——创建、设置大小、映射、读写、清理。实际项目中,往往还需要考虑同步,比如用信号量或者互斥锁来防止竞态条件,否则多进程同时读写会乱套。另外,错误处理不能只写个exit,生产环境得做更细致的日志和恢复。

    最后提一句,POSIX共享内存API是Linux原生支持,而System V那一套也广泛存在于各种UNIX-like系统上。如果代码需要跨平台,最好用Boost.Interprocess这类库来统一封装,省得在不同系统上改来改去。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Linux
    相关文章 更多
    linux删除用户与用户组的方法及命令教程
    linux删除用户与用户组的方法及命令教程

    掌握Linux中删除用户和用户组的正确方法,避免残留文件和进程冲突。本文深入解析userdel和groupdel命令的参数用法,提供处理“用户仍在使用”等常见错误的实战方案。

    Linux如何开启端口号?开放端口命令详解
    Linux如何开启端口号?开放端口命令详解

    详细讲解Linux如何开启端口号以及常用的开放端口命令。

    crossover卸载软件下载及重新安装教程
    crossover卸载软件下载及重新安装教程

    遇到CrossOver运行错误或需要更新版本时,如何彻底卸载旧版并干净重装?本教程详解macOS和Linux下的卸载步骤、残留文件清理方法及官方下载渠道,确保软件环境纯净稳定。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。