Openssl数据安全传输平台007:共享内存及代码的实现 ——待完善项目具体代码和逻辑

news2024/9/21 18:48:31

文章目录

  • 0. 代码仓库
  • 1. 使用流程
    • 案例代码:
  • 2. API解析
    • 2.1 创建或打开一块共享内存区
    • 2.2 将当前进程和共享内存关联到一起
    • 2.3 将共享内存和当前进程分离
    • 2.4 共享内存操作 -( 删除共享内存 )
  • 3. 思考问题
  • 3. ftok函数
  • 4. 共享内存API封装-以本项目为例

0. 代码仓库

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform

1. 使用流程

  1. 向内核申请一块内存 -> 指定大小
  2. 如果有两个进程, 需要通信, 可以使用这块共享内存来完成, 先创建出这两个进程
    • 进程A
    • 进程B
  3. 进程A和进程B分别和共享内存进行关联
    • 拿到共享内存的地址 -> 首地址
  4. 两个进程可以通过这个首地址对共享内存进行读/写操作
  5. 如果这个进程不再使用这块共享内存, 需要和共享内存断开关联
    • 进程退出, 对共享内存是没有任何影响的
  6. 当不再使用共享内存的时候, 需要将共享内存销毁

案例代码:

https://github.com/Chufeng-Jiang/Linux-System-Programming/tree/main/0110%20Shared%20Memory

在这里插入图片描述

2. API解析

2.1 创建或打开一块共享内存区

// 创建共享内存
// 共享内存已经存在, 打开共享内存
// 可以创建多块共享内存

int shmget(key_t key, size_t size, int shmflg);
    参数:
        - key: 通过这个key记录共享内存在内核中的位置, 需要是一个>0的整数, ==0不行
            随便指定一个数就可以, 后边会介绍一个函数ftok
        - size: 创建共享内存的时候, 指定共享内存的大小
            - 如果是打开一个已经存在的共享内存, size写0就可以
        - shmflg: 创建共享内存的时候使用, 类似于open函数的flag
            - IPC_CREAT: 创建共享内存
                - 创建的时候需要给共享内存一个操作权限
                    - IPC_CREAT | 0664
            - IPC_CREAT | IPC_EXCL: 检测共享内存是否存在
                - 如果存在函数返回-1
                - 不存在, 返回0
    返回值:
        成功: 创建/打开成功, 得到一个整形数 -> 对应这块共享内存
        失败: -1

// 应用
// 1. 创建共享内存
int shmid = shmget(100, 4096,  IPC_CREAT | 0664);
int shmid = shmget(200, 4096,  IPC_CREAT | 0664);
// 2. 打开共享内存
int shmid = shmget(100, 0, 0);  

2.2 将当前进程和共享内存关联到一起

// 进程和共享内存产生关系
void *shmat(int shmid, const void *shmaddr, int shmflg);
    参数:
        - shmid: 通过这个参数访问共享内存, shmget()函数的返回值
        - shmaddr: 指定共享内存在内核中的位置, 写NULL -> 委托内核区指定
        - shmflg: 关联成功之后对共享内存的操作权限
            - SHM_RDONLY: 只读
            - 0: 读写
    返回值:
        成功: 共享内存的地址 (起始地址)
        失败:  (void *) -1
        
// 函数调用:
void* ptr = shmat(shmid, NULL, 0);
// 写内存
memcpy(ptr, "xxxx", len);
// 读内存
printf("%s", (char*)prt);

2.3 将共享内存和当前进程分离

// 进程和共享内存分离 -> 二者就没有关系了
int shmdt(const void *shmaddr);
    参数: 共享内存的起始地址, shmat()返回值
    返回值:
        - 成功: 0
        - 失败: -1

2.4 共享内存操作 -( 删除共享内存 )

// fcntl
// setsockopt
// getsockopt
// 对共享内存进程操作
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    参数: 
        - shmid: 通过这个参数访问共享内存, shmget()函数的返回值
        - cmd: 对共享内存的操作
            - IPC_STAT: 获取共享内存的状态
            - IPC_SET: 设置共享内存状态
            - IPC_RMID: 标记共享内存要被销毁
        - buf: 为第二个参数服务的
            cmd==IPC_STAT: 获取共享内存具体状态信息
            cmd==IPC_SET: 自定义共享内存状态, 设置到内核的共享内存中
            cmd==IPC_RMID: 这个参数没有用了, 指定为NULL
    返回值:
        成功: 0
        失败: -1
        
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);

3. 思考问题

  • 问题1: 操作系统如何知道一块共享内存被多少进程关联?

    • 共享内存维护了一个结构体struct shmid_ds这个结构体中有一个成员shm_nattch
    • shm_nattch中记录了关联的进程的个数
  • 问题2: 是不是可以对共享内存进行多次删除 -> 多次调用shmctl

    • 可以多次操作
  • 因为shmctl函数是标记删除共享内存, 部署直接删除

    • 什么时候被真正删除了?
    • 当关联这块共享内存进程个数 == 0 的时候, 真正被删除了
      • shm_nattch== 0

3. ftok函数

ftok函数是IPC中常用的一个函数,它是由Unix系统提供的一个应用程序编程接口(API)。它的作用是根据一个指定的文件名和一个整数,生成一个不重复的键值(key)。

key_t ftok(const char *pathname, int proj_id);

首先根据一个任意存在的pathname绝对路径提取其所属文件系统的特有信息,包括设备号(stat.st_dev)和inode号(stat.st_ino),其获取方法参见上述程序中的sata结构,然后再结合ftok()函数的proj_id参数,按照如下规则计算key:

key1 = stat.st_ino & 0xffff;   // 保留低16位
key2 = stat.st_dev & 0xff;     // 保留低8位
key2 << = 16;                  // 左移16位
key3 = proj_id & 0xff;         // 保留低8位
key3 << = 24;                  // 左移24位
key = key1|key2|key3;          // 三者进行或运算

本例中,pathname=’/tmp‘,ftok()函数提取的设备号为0x804,inode号为0x280001,proj_id为0x01,根据以上运算过程,key1=0x01,key2=0x40000,key3=0x1000000,三者求或得到key=0x1040001,与程序输出的结果一致。

4. 共享内存API封装-以本项目为例

//shmget
int shmget(key_t key, size_t size, int shmflg);
class BaseShm
{
public:
    BaseShm(int key);    // 根据key打开共享内存
    BaseShm(string path);    // 根据string path-> int key 打开共享内存
    BaseShm(int key, int size);    // 根据key创建共享内存
    BaseShm(string path, int size);    // 根据string path-> int key 创建共享内存

    void* mapshm()
    {
        m_ptr = shmat(shmid);
        return m_ptr;
    }
    int unmapshm()
    {
           shmdt(m_ptr);
    }
    int delshm()
    {
        shmctl(shmid);
    }

private:
    int m_shmid;    // shmget返回值
    void* m_ptr;
}

在这里插入图片描述

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

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

相关文章

rust学习——栈、堆、所有权

文章目录 栈、堆、所有权栈(Stack)与堆(Heap)栈堆性能区别所有权与堆栈 所有权原则变量作用域所有权与函数返回值与作用域 栈、堆、所有权 栈(Stack)与堆(Heap) 栈和堆是编程语言最核心的数据结构&#xff0c;但是在很多语言中&#xff0c;你并不需要深入了解栈与堆。 但对于…

互联网Java工程师面试题·Java 面试篇·第五弹

目录 79、适配器模式和装饰器模式有什么区别&#xff1f; 80、适配器模式和代理模式之前有什么不同&#xff1f; 81、什么是模板方法模式&#xff1f; 82、什么时候使用访问者模式&#xff1f; 83、什么时候使用组合模式&#xff1f; 84、继承和组合之间有什么不同&#…

【BIGRU预测】基于双向门控循环单元的多变量时间序列预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

改进YOLO系列 | YOLOv5/v7 引入 Dynamic Snake Convolution | 动态蛇形卷积

准确分割拓扑管状结构,如血管和道路,在各个领域中至关重要,可以确保下游任务的准确性和效率。然而,许多因素使任务复杂化,包括细小的局部结构和可变的全局形态。在这项工作中,我们注意到管状结构的特殊性,并利用这一知识来引导我们的DSCNet,以在三个阶段同时增强感知:…

1 Go的前世今生

概述 Go语言正式发布于2009年11月&#xff0c;由Google主导开发。它是一种针对多处理器系统应用程序的编程语言&#xff0c;被设计成一种系统级语言&#xff0c;具有非常强大和有用的特性。Go语言的程序速度可以与C、C相媲美&#xff0c;同时更加安全&#xff0c;支持并行进程。…

微信小程序设计之主体文件app-json-tabBar

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

LeetCode讲解篇之40. 组合总和 II

文章目录 题目描述题解思路题解代码 题目描述 题解思路 按升序排序candidates&#xff0c;然后遍历candidates&#xff0c;目标数减去当前candidates的数&#xff0c;若该结果小于0&#xff0c;因为candidates的元素大于0&#xff0c;所以后续不会再出现让计算结果等于0的情况…

021-Qt 配置GitHub Copilot

Qt 配置GitHub Copilot 文章目录 Qt 配置GitHub Copilot项目介绍 GitHub Copilot配置 GitHub CopilotQt 前置条件升级QtGitHub Copilot 前置条件激活的了GitHub Copilot账号安装 Neovim 启用插件&#xff0c;重启Qt配置 GitHub Copilo安装Nodejs下载[copilot.vim](https://gith…

Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

MySQL-DML【数据操作语言】(图码结合)

目录 &#x1f6a9;DML的定义 &#x1f449;DML-添加数据 &#x1f393;给指定的字段添加数据 &#x1f576;️查询表数据的方式 ❗疑惑点一【Affecter rows:行数】 ❗疑惑点二【字符集问题】 &#x1f393;给全部字段添加数据 &#x1f393;批量添加数据 &#x1f…

System Design现代系统设计概论

1. 什么是系统设计&#xff1f; 系统设计是定义组件及其集成、API 和数据模型以构建满足一组指定功能和非功能需求的大型系统的过程。 系统设计使用计算机网络、并行计算和分布式系统的概念来设计可扩展且高性能的系统。分布式系统本质上具有良好的可扩展性。然而&#xff0c…

antd组件onChange回调,需要立即执行改变value与防抖节省接口开销。

文章目录 普通使用使用防抖节省开销页面功能复杂需要value受控回调需要部分代码立即执行&#xff0c;部分代码防抖延时执行useRefuseCallback 小结 普通使用 当我们使用Antd的input或者select进行搜索时&#xff0c;onChange回调会即时执行。 import { Input } from "an…

R155法规有没有要求上Secure Boot功能?

标签&#xff1a; R155法规有没有要求上Secure Boot功能&#xff1f;&#xff1b; R155法规有没有要求上安全启动功能&#xff1f;&#xff1b;R155法规与Secure Boot关系&#xff1f;R155法规可以不上Secure Boot吗&#xff1f; R155法规有没有要求一定要上Secure Boot&#…

Node学习笔记之Express框架

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs. com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&…

基于卷积优化优化的BP神经网络(分类应用) - 附代码

基于卷积优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于卷积优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.卷积优化优化BP神经网络3.1 BP神经网络参数设置3.2 卷积优化算法应用 4.测试结果…

codeforces (C++ Chemistry)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、n组数据&#xff0c;每组输入两个数t,k和一个字符串&#xff0c;删除k个字符&#xff0c;剩下的字符能组成回文&#xff0c;则输出YES&#xff0c;否则输出NO。 2、用map记录字符串中每个字符出现的次数&#xff0c;su…

Unity学习shader笔记[二百]仿马赛克效果碎片画思路

最近看到个场景的图片&#xff0c;对他的生成有点兴趣&#xff0c;就想了解。 清晰的画面经过后处理后变成这种。思路和马赛克基本一样。 美术处理 这种图片处理 本身ps就有&#xff0c;美术方便的话&#xff0c;可以让美术给图&#xff0c;然后给出的网格里面uv分布是0到1&…

Spark内核调度

目录 一、DAG &#xff08;1&#xff09;概念 &#xff08;2&#xff09;Job和Action关系 &#xff08;3&#xff09;DAG的宽窄依赖关系和阶段划分 二、Spark内存迭代计算 三、spark的并行度 &#xff08;1&#xff09;并行度设置 &#xff08;2&#xff09;集群中如何规划并…

给Windows文件夹添加备注信息

自己的电脑中文件夹为了安装各种开发环境&#xff0c;基本都是英文字母命名&#xff0c;就导致好多东西猛地一看找不着。此时加个备注会不会就好很多呢&#xff1f;就如以下这种 设置方法&#xff1a; 1、展示备注 右键展示的列表头部&#xff0c;会出现展示项&#xff0c;一…

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…