首页 > 系统相关 >Linux系统System V机制共享内存基础用法C++代码示例

Linux系统System V机制共享内存基础用法C++代码示例

时间:2024-11-02 15:18:57浏览次数:6  
标签:共享内存 return 示例 System C++ key shmid include ptr

写数据进程代码

// writer.cpp

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cstring>
#include <unistd.h>

int main()
{
    // 使用ftok()生成一个唯一的键用来标识共享内存,shmfile需要是一个存在的文件,也可以用其他方法来生成用来标识共享内存的key,但是要确保这个key是唯一的
    key_t key = ftok("shmfile", 16);
    if (key == -1)
    {
        perror("ftok()");
        return -1;
    }
    
    // 创建共享内存
    int shmid = shmget(key, 1024, 0666 | IPC_CREAT);
    if (shmid < 0)
    {
        perror("shmget()");
        return -1;
    }
    
    // 将共享内存连接到当前进程地址空间
    void *ptr = shmat(shmid, nullptr, 0);
    if (ptr == (void *)-1)
    {
        perror("shmat()");
        return -1;
    }
    
    // 写入数据
    char buf[] = "System V Shared Memory test";
    memcpy(ptr, buf, sizeof(buf));
    
    // 等待输入,只是为了读进程能来得及读数据
    getchar();
    
    // 关闭共享内存到当前进程地址空间的连接
    shmdt(ptr);
    
    // 删除共享内存
    shmctl(shmid, IPC_RMID, nullptr);
    
    return 0;
}

读数据进程代码

// reader.cpp

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>

int main()
{
    // key需要和写进程保持一致
    key_t key = ftok("shmfile", 16);
    if (key == -1)
    {
        perror("ftok()");
        return -1;
    }
    
    // 获取共享内存
    int shmid = shmget(key, 1024, 0666);
    if (shmid < 0)
    {
        perror("shmget()");
        return -1;
    }
    
    // 将共享内存连接到当前进程地址空间
    void *ptr = shmat(shmid, nullptr, 0);
    if (ptr == (void *)-1)
    {
        perror("shmat()");
        return -1;
    }
    
    // 读出数据
    std::cout << "data:" << (char *)ptr << std::endl;
    
    // 关闭共享内存到当前进程地址空间的连接
    shmdt(ptr);
    
    return 0;
}

标签:共享内存,return,示例,System,C++,key,shmid,include,ptr
From: https://blog.csdn.net/2401_85919417/article/details/143312921

相关文章

  • 【C++】布隆过滤器的概念与特点解析
    目录00.引入01.布隆过滤器的概念特点1:极低的内存消耗特点2:快速查询特点3:假阳性误判(禁止删除)02.布隆过滤器的底层实现00.引入上一篇博客介绍了位图这一数据结构,它可以在大量整数中快速查找某一数据是否存在,并且内存占用率很低(例如,查找40亿个整数只需0.5G空间)。博客链......
  • 打卡信奥刷题(161)用C++信奥P1451[普及组/提高] 求细胞数量
    求细胞数量题目描述一矩形阵列由数字000到999组成,数字......
  • 如何学好C++
    如何学好C++对于零基础想要学学C++的同学,我希望你们要先明白一件事:C++是一门极难掌握的编程语言,内容多且杂且难懂。所以如果你想要想要学好C++,你要花很多的时间和精力。当然这件事我也想告诉你:如果你在刚开始学或者学了很短的一段时间,发现自己学不会,默默告诉自己“......
  • Microsoft Entity Framework Core 8 示例
            微软于2023年11月发布了最新版本的EntityFrameworkCore,该版本与EntityFrameworkCore7相比有很大变化。        要查看新增内容,请查看Microsoft文档EFCore8中的新增功能以及EFCore8文档中的重大变更。        每次发布E......
  • 华为OD机试-(E卷,100分) - 热点网站统计(Java & Python& JS & C++ & C )
    最新华为OD机试题目描述企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URLtopN。请设计一个算法,可以高效动态统计TopN的页面。输入描述每一行都是一个URL或一个数字,如果是URL,代表一段时间内的网页访问;如果是一个数字N,代表本次需要输出的TopN个URL......
  • CPP学习 用栈容器解决问题示例,判断括号是否成对出现
    #include<string>#include<iostream>#include<stack>usingnamespacestd;boolisbalanced(conststring&str){intlen=str.size();stack<char>mystack;for(inti=0;i<len;i++){if(str[i]==&......
  • Java和C++有什么区别?JVM不是跨平台的?JVM是用什么语言编写的?
    Java和C++有什么区别?编译解释型vs编译型程序跨平台vs源代码跨平台带GCvs无GC类库丰富vs自己造轮子JVM不是跨平台的?JVM不是跨平台的?Java语言是跨平台的语言,因为同一份代码,可由不同平台javac......
  • C++ 逆向之 move 函数
    众所周知,在C++11后,增加了右值引用类型,那么函数参数传递一共有三种方式,分别是非引用类型传递(值传递)、左值引用传递和右值引用传递,其中值传递会对实参进行一份拷贝传递给函数,左值引用和右值引用则直接引用实参传递给函数,这就是它们最大的区别。为什么要区分值传递和引用传递呢?对......
  • C++17 折叠表达式
    折叠表达式C++17之前处理参数包C++17折叠表达式的出现让我们不必再用递归实例化模板的方式来处理参数包。在C++17之前,实现必须分成两个部分:终止条件递归条件这样的实现不仅写起来麻烦,对C++编译器来说也很难处理。C++17折叠表达式能显著的减少程序员和编译器的工作量......
  • 低功耗4G模组:Air780E发送SMS短消息示例
    大家好,今天一起来学习使用合宙低功耗4G模组Air780E发送SMS短消息:一、SMS简介SMS(短消息服务,ShortMessageService)功能主要用于在蜂窝网络中传输短消息。移动,联通卡不需开通VOLTE可以支持短信功能。在4G网络中,短信可以在数据传输的同时进行,不会因数据业务占用网络资源而被延迟或阻塞。......