system_v

news2024/11/16 11:49:10

共享内存

请添加图片描述

创建共享内存

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

使用相同的pathname和proj_id可以得到相同的key_t


pathname必须是一个存在的目录
在这里插入图片描述


int shmget(key_t key, size_t size, int shmflg);

需要使用ftok获取key_t

IPC_CREAT——不存在就创建,存在就获取
IPC_EXCL——一般和IPC_CREAT组合使用。不存在创建,存在错误返回;保证了共享内存是最新的
size最好是4096整数倍

错误代码

    int shmid=shmget(key,4096,IPC_CREAT);

在这里插入图片描述

    int shmid=shmget(key,4096,IPC_CREAT|0644);

在这里插入图片描述

创建共享内存也是需要权限的,如果不给权限,能创建出来,但是在链接的时候会失败

挂接

void *shmat(int shmid, const void *shmaddr, int shmflg);
//     char* shm_block =(char*)shmat(shmid,nullptr,0);
//     if(*(int*)shm_block==-1)
//     {
//         puts("不接受链接");
//         exit(-1);
//     }
//     puts("链接共享内存");

标识将shmid进行挂接,挂接位置,挂接方式为默认

解除挂接

int shmdt(const void *shmaddr);

删除共享内存

一共有3种选项,这里就说两种方法

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctl(shmid, IPC_RMID, nullptr);

删除不需要属性


获取属性

    struct shmid_ds ds;
    shmctl(shmid,IPC_STAT,&ds);
    std::cout<<ToHex(ds.shm_perm.__key)<<std::endl; // key

获取属性需要在创建成功之后和释放成功之前获取
在这里插入图片描述

删除

在这里插入图片描述

  1. key:表示共享内存的key
  2. shmid:表示共享内存编号
  3. owner:表示创建共享内存的用户
  4. perms:表示共享内存的的使用权限
  5. bytes:表示共享内存的大小
  6. nattch:表示连接到共享内存的的进程数
  7. status:表示共享的状态(不显示则为正常使用,显示“dest”表示共享内存已被删除,但仍有用户使用)

ipcs -m 查看所有共享内存
ipcrm -m shmid = unlink + 管道名
key 旨在内核中标识shm的唯一性
shmid 用户使用;类似于fd(编号)


注意
共享内存不提供同步机制,需要控制控制同步——管道

通过管道控制同步

#include<iostream>
using namespace std;
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>

const char* pathname="/home/yao/test/test1/shm";
const char* filename="/home/yao/test/test1/shm/tem.txt";
const int proj_id=0x3f3f3f3f;
int main()
{
    // 需要一个存在的文件或者目录
    key_t key=ftok(pathname,proj_id);
    if(key==-1) 
    {
        perror("ftok failure:>");
        exit(-1);
    }
    int shmid=shmget(key,4096,IPC_CREAT);
    if(shmid==-1)
    {
        perror("shmget failure:>");
        exit(-1);
    }
    char* ret=(char*)shmat(shmid,nullptr,0);
    if(*(int*)ret==-1)
    {
        perror("shmat failure:>");
        exit(-1);
    }

    // 写入并控制
    // 控制应该是管道,但是一个普通的文件不能当成管道
    // 需要一个有名管道
    int fd=open(filename,O_WRONLY); // 需要一个已经存在的文件或者目录
    if(fd==-1)
    {
        perror("open failure:>");
        exit(-1);
    }
    int cnt=0;
    for(int i=0;i<=32;i++)
    {
        int code=0;
        ssize_t t=write(fd,&code,sizeof(code));
        ret[i]='a'+i;
        ret[i+1]=0;
        sleep(2);
    }
    

    shmdt(ret);
    return 0;
}
#include<iostream>
using namespace std;
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>

const char* pathname="/home/yao/test/test1/shm";
const char* filename="/home/yao/test/test1/shm/tem.txt";

const int proj_id=0x3f3f3f3f;
int main()
{
    key_t key=ftok(pathname,proj_id);
    if(key==-1) 
    {
        perror("ftok failure:>");
        exit(-1);
    }
    int shmid=shmget(key,4096,IPC_CREAT|0666);
    if(shmid==-1)
    {
        perror("shmget failure:>");
        exit(-1);
    }
    char* ret=(char*)shmat(shmid,nullptr,0);
    if(*(int*)ret==-1)
    {
        perror("shmat failure:>");
        exit(-1);
    }
    mkfifo(filename,0666);

    int fd=open(filename,O_RDONLY);
    if(fd==-1)
    {
        perror("open failure:>");
        exit(-1);
    }
    for(int i=0;i<=33;i++)
    {
        int code=0;
        ssize_t t = read(fd,&code,sizeof(code));
        // if(t==0)
        // {
        //     puts("写端关闭");
        //     break;
        // }
        cout<<"读取字符串 "<< ret <<endl;
        sleep(1);
    }


    shmdt(ret);
    shmctl(shmid,IPC_RMID,nullptr);
    remove(filename);
    return 0;
}

在这里插入图片描述

  1. server两秒写一个,client是每秒度一个,但是client需要等server1秒,这就是同步机制
  2. 同时验证了内存是拷贝出去的,并不会清空

system_v参考

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

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

相关文章

鸿蒙DevEco Service开发准备与使用

DevEco低代码是一个基于Serverless和ArkUI的端云一体化低代码开发平台&#xff0c;可通过拖拽式开发&#xff0c;可视化配置构建元服务。打通HarmonyOS云侧与端侧能力&#xff0c;轻松实现HMS Core和AGC Serverless能力的调用。通过与元服务生态、HMS Core、AGC Serverless平台…

论文阅读:Ground-Fusion: A Low-cost Ground SLAM System Robust to Corner Cases

前言 最近看到一篇ICRA2024上的新文章&#xff0c;是关于多传感器融合SLAM的&#xff0c;好像使用了最近几年文章中较火的轮式里程计。感觉这篇文章成果不错&#xff0c;代码和数据集都是开源的&#xff0c;今天仔细读并且翻译一下&#xff0c;理解创新点、感悟研究方向、指导…

政安晨:【机器学习基础】(一)—— 泛化:机器学习的目标

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简述 泛化是机器学习中的基本概念之一。它指的是通过学习…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

嵌入式按键处理驱动(easy_button)

简介 在嵌入式裸机开发中&#xff0c;经常有按键的管理需求&#xff0c;GitHub上已经有蛮多成熟的按键驱动了&#xff0c;但是由于这样那样的问题&#xff0c;最终还是自己实现了一套。本项目地址&#xff1a;bobwenstudy/easy_button (github.com)。 项目开发过程中参考了如…

了解 JavaScript 中的重放攻击和复现攻击

在网络安全领域&#xff0c;重放攻击&#xff08;Replay Attack&#xff09;和复现攻击&#xff08;Playback Attack&#xff09;是一些可能导致安全漏洞的攻击形式。这两种攻击类型涉及在通信过程中再次发送已经捕获的数据&#xff0c;以达到欺骗系统的目的。本文将介绍 JavaS…

Linux之JAVA环境配置Tomcat离线安装与启动

目录 一.前提 二.Linux安装JDK 1.解压 2.配置环境变量 3.设置环境变量生效 三.Tomcat安装&#xff08;开机自启动&#xff09; 1.解压 2.启动Tomcat 3.设置防火墙 四.MySQL安装&#xff08;开机自启动&#xff09; 1.删除固有数据库 2.将MySQL安装包解压到指定目录…

【Linux】部署单机项目(自动化启动)---(图文并茂详细讲解)

目录 一 准备工作 1.1 连接服务器拷贝文件 1.2 解压 二 JDK安装 2.1 配置坏境变量 2.2 查看版本 三 Tomcat(自启动) 3.1 复制启动命令的位置 3.2 添加命令相关配置文件 3.2.1 配置jdk及tomcat目录 3.2.2 添加优先级 3.3 设置自启动命令 3.4 开放端口 四 My…

CSP-J 2023 复赛第4题:旅游巴士

【题目来源】https://www.luogu.com.cn/problem/P9751https://www.acwing.com/problem/content/description/5313/【题目描述】 小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。 旅游景点的地图共有 n 处地点&#xff0c;在这些地点之间连有 m 条道路。 其中…

【深度学习目标检测】十九、基于深度学习的芒果计数分割系统-含数据集、GUI和源码(python,yolov8)

使用深度学习算法检测芒果具有显著的优势和应用价值。以下是几个主要原因&#xff1a; 特征学习的能力&#xff1a;深度学习&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;能够从大量的芒果图像中自动学习和提取特征。这些特征可能是传统方法难以手动…

每日五道java面试题之spring篇(五)

目录&#xff1a; 第一题. 使用 Spring 有哪些方式&#xff1f;第二题. 什么是Spring IOC 容器&#xff1f;第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么&#xff1f;第五题. BeanFactory 和 ApplicationContext有什么区别&#xff1f; 第一题. 使用 Spring 有哪…

数据湖技术方案

围绕数据人工智能计算实现材料研发全流程加速需要&#xff0c;面向“数字反应堆”需要的数据湖服务&#xff0c;“数据湖”是统一存储池&#xff0c;可对接多种数据输入方式&#xff0c;可以存储任意规模的结构化、半结构化、非结构化数据。 数据湖可无缝对接多种计算分析平台&…

Mac安装Appium

一、环境依赖 一、JDK环境二、Android-SDK环境&#xff08;android自动化&#xff09;三、Homebrew环境四、Nodejs 安装cnpm 五、安装appium六、安装appium-doctor来确认安装环境是否完成七、安装相关依赖 二、重头大戏&#xff0c; 配置wda&#xff08;WebDriverAgent&#x…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义&#xff1a;分布式环境下的事务处理机制 CAP定理&#xff1a;在一个分布式系统中&#xff0c;涉及共享数据问题时&#xff0c;以下三个特性最多只能同时满足两个 一致性&#xff1a;代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…

跨界计算与控制,强化显控和UI, 君正MPU再添新旗舰--Ingenic MPU X2600隆重发布

近日&#xff0c;北京君正隆重发布MPU芯片新产品X2600。该产品以商业和工业应用的数个细分领域为重点目标市场&#xff0c;兼顾通用处理器应用需求。无论从CPU结构的设计&#xff0c;还是专门控制器和接口的配备&#xff0c;都体现了北京君正MPU团队“技术路线上追求自主跨界&a…

unity学习(40)——创建(create)角色脚本(panel)——UI

1.点击不同的头像按钮&#xff0c;分别选择职业1和职业2&#xff0c;create脚本中对应的函数。 2.调取inputfield中所输入的角色名&#xff08;限制用户名长度为7字符&#xff09;&#xff0c;但愿逆向的服务器可以查重名&#xff1a; 3.点击头衔&#xff0c;显示选择的职业&a…

4.寻找两个正序数组的中位数

题目&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解题思路&#xff1a;用二分法查找。使用归并的方式&#xff0c;合并两个有序数组&#xff0c;得到一个大的有序数组。大的…

MongoDB实战 – 用Python访问MongoDB数据库

MongoDB实战 – 用Python访问MongoDB数据库 MongoDB in Action – Access MongoDB Databases with Python By JacksonML Python语言功能强大众所周知&#xff0c;在数据库管理领域也无所不能。MongoDB是文档数据库&#xff0c;属于NoSQL数据库的一种&#xff0c;在业界也非常…

07_html

文章目录 引言前端概述分类 HTML快速入门重要的body标签注释hr标签br标签一些常见的标签标题标签div标签span标签p标签a标签img标签路径问题 ol和ul标签table标签input标签&#xff08;表单元素&#xff09;textarea标签&#xff08;表单元素&#xff09;select标签&#xff08…

记录 | vscode go无法跳转问题解决

go 代码不能跳转 如果是windows下开发linux的一般要用 插件 Remote-ssh,就可以尽情的访问文件和路径了. 1.go代码跳转一方面是你要把所有的 vscode go 插件要安装上, 方法是ctrlshift p,输入Go:Install/Update ,回车之后,把这些都选中安装. 2020年之后的,都会采用go mod的…