systemV的工作原理+原理代码
概念
我们知道进程间的通信有管道的方式进程通信管道制作_云的小站的博客-CSDN博客
但是我们的管道通信其实属于一种取巧的方式,利用了打开的文件可读写的特性上,两个进程对此分别进行读写操作就会产生所谓的通信现象,但是外面的管道依旧得再磁盘上创建一个文件,然后文件打开加载在内存上才可以使用,那么有什么方法可以直接加载在内存,而无需对磁盘操作呢?
---------利用systemV共享内存通信
利用系统函数shmget在内存中开辟一块空间用于进程通信的交互点。因为两个进程之间不可以直接通信,所以需要加一个中间层。


学计算机,当两个东西不通的时候,我们最经常干的事情就是加一个中间层,既保护了独立性,又处理了我们需要完成的事情
工具
shmget(创建共享内存)
shmid_t shmget(key_t key, size_t size, int shmflg);
返回值:
失败返回-1,成功返回一个shmid唯一的共享内存标识符。
key:
唯一值,两个进程需要同一个key值才可以访问到同一共享内存空间。
size:
设置共享内存大小
shmflg
共享内存创建选项,IPC_CREAT | IPC_EXCL|0666
IPC_CREAT:如果内存存在key标识符的共享内存直接使用,如果不存在就创建
IPC_EXCL:如果内存存在key标识符的共享内存直接失败退出。
0666:共享内存的使用权限。
shmctl(操作共享内存)
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
返回值:
如果操作成功返回0,操作失败返回-1;
shmid:
对该shmid的共享内存进行操作;
cmd:
对共享内存的操作选项,一般我们删除共享内存用的使用:IPC_RMID
buf:
获取该共享内存的数据结构地址。(共享内存也需要被描述组织)。
shmat(进程的挂接操作)
void *shmat(int shmid, const void *shmaddr, int shmflg);
返回值:
成功返回共享内存的地址,失败返回-1,并设置errno错误原因。
shmid:
挂接在shmid标识符的共享内存上。
shmaddr:
理论上可以自己设置将共享内存挂接在自己指定的位置,但是不建议。所以一般设置为nullptr,
shmflg
设置访问方式只读、只写等等。设置为0,读写操作。
shmdt(进程的拆除操作)
int shmdt(const void *shmaddr);
返回值:
成功拆除返回0,失败返回-1;
shmaddr:
将进程地址空间shmaddr的共享内存,进行拆除。
ftok(生成一个key值为shmget服务)
key_t ftok(const char *pathname, int proj_id);
返回值:
返回有个随机数字。
pathname:
传一个文件路径,使用文件的inode值,对了文件必须要有访问权限。
proj_id:
项目id,0~255,其实可以随便写,会截断。
ps:ftok不进行系统调用,他只是一个算法
代码
来来来,工具说完了直接上代码:
头文件
日志+需要的接口
日志
1 #ifndef _LOG_H_2 #define _LOG_H_3 #include <ctime>4 #include <iostream>5 6 #define Debug 07 #define Notice 18 #define Warning 29 #define Error 310 11 std::string mgs[] = {12 "Debug",13 "Notice",14 "Warning",15 "Error"};16 17 std::ostream &Log(std::string message, int level)18 {19 std::cout << " | " << (unsigned)time(nullptr)20 << " | " << mgs[level] << " | "<<message;21 return std::cout; 22 }23 24 #endif
~
所需头文件
1 #pragma once 2 #include<iostream>3 #include<cstdio>4 #include<sys/shm.h>5 #include<sys/ipc.h>6 #include<sys/types.h>7 #include"Log.hpp"8 #include<assert.h>9 #include<unistd.h>10 using namespace std;11 #define SIZE 409612 #define PATH_NAME "."13 #define PROJ_ID 0x6614 15 16 string TransToHex(key_t k)17 {18 char buffer[32];19 snprintf(buffer,sizeof(buffer),"0x%x",k);20 return buffer;21 }
接收方代码
#include"comm.hpp"2 3 int main()4 {5 // 1.创建公共key6 key_t k=ftok(PATH_NAME,PROJ_ID);7 assert(k!=-1);8 Log("create key done",Debug)<<" sgmrevice key: "<< TransToHex(k)<<endl;9 sleep(10);10 //2.创建共享内存11 12 int shmid = shmget(k,SIZE,IPC_CREAT | IPC_EXCL|0666 );13 if(shmid==-1)14 {15 perror("shmger fail!!\n");16 exit(-1);17 }18 19 Log("create shm done",Debug)<<" sgmrevice shmid: "<<shmid<<endl;20 21 22 sleep(10);23 //挂接内存24 char*shmaddr=(char*)shmat(shmid,nullptr,0);25 if(*shmaddr==-1)26 {27 perror("shmat fail!\n");28 }29 Log("shmat shm seccese",Debug)<<" sgmrevice shmid: "<<shmid<<endl;30 sleep(10);31 32 //工作33 34 //拆除链接35 int n=shmdt(shmaddr); 36 assert(n!=-1);37 (void)n;38 Log("shmdt shm done",Debug)<<" sgmrevice shmid: "<<shmid<<endl;39 40 sleep(10);41 // n.删除共享内存42 n=shmctl(shmid,IPC_RMID,nullptr);43 assert(n!=-1);44 (void)n;45 Log("delete shm done",Debug)<<" sgmrevice shmid: "<<shmid<<endl;46 47 return 0;48 }
~
发送方代码
1 #include"comm.hpp" 2 int main()3 { 4 //获取k值5 key_t k=ftok(PATH_NAME,PROJ_ID);6 assert(k!=-1); 7 (void)k; 8 Log("create key done 郑建云",Debug)<<"key:"<<TransToHex(k)<<endl;9 sleep(10); 10 //创建共享内存 11 //由于在receive已经创建共享内存,所以我们主要是找到内存挂接12 //IPC_CREAT==0 13 int shmid = shmget(k,SIZE,IPC_CREAT); 14 if(!shmid) 15 { 16 perror("shmget fail!!\n");17 exit(-1); 18 } 19 20 Log("create shm domw",Debug)<<" shmid: "<<shmid<<endl;21 int cnt=10; 22 while(cnt) 23 { 24 printf("time:%d\r",cnt--);25 sleep(1); 26 fflush(stdout); 27 } 28 printf("\n"); 29 //挂接,shmaddr,不要自己写,避免把其他数据覆盖30 char*shmaddr=(char*)shmat(shmid,nullptr,0); 31 if(shmaddr==nullptr) 32 { 33 perror("shmat fail\n");34 exit(-1); 35 } 36 Log("shmat sueecss done",Debug)<<"shmid: "<<shmid<<endl;37 sleep(10); 38 39 //工作 40 41 //拆除共享内存 42 int n=shmdt(shmaddr); 43 printf("n=%d\n",n); 44 assert(n==0); 45 (void)n; 46 Log("shmdt success done",Debug)<<" shmid "<<shmid<<endl; 47 printf("%p\n",shmaddr); 48 return 0; 49 }
执行顺序必须先执行接收代码,因为接收代码必须先创建好共享内存,然后发送方才可以链接。
否者,发送方先建立了,在执行中接收方将检查出内存中已经存在该key的共享内存,直接报错,返回一个-1到shmid。
相关文章:
systemV的工作原理+原理代码
概念 我们知道进程间的通信有管道的方式进程通信管道制作_云的小站的博客-CSDN博客 但是我们的管道通信其实属于一种取巧的方式,利用了打开的文件可读写的特性上,两个进程对此分别进行读写操作就会产生所谓的通信现象,但是外面的管道依旧得…...
Kubeflow--TFJob实现机制学习
2023暑期学习 TF Job实际场景应用Vertex AI TF Job 链接 https://www.kubeflow.org/docs/components/training/tftraining/ https://developer.aliyun.com/article/601779 TFJob实际上遵循Kubernetes标准的API定义. TFJob 对象 apiVersion --> string --> api版本&…...
百度出品,Nature重磅 -- 优化的mRNA设计算法可改善mRNA的稳定性和免疫原性
摘要 尽管mRNA疫苗已用于COVID-19的预防,但仍然面临不稳定和易降解的风险,这是mRNA疫苗存储、配送、效价等面临的重要障碍。先前的研究已表明,增加二级结构可延长mRNA的半衰期,再加上选择优化的密码子,可改善蛋白表达。…...
CKA 01_docker部署Kubernetes 部署docker 使用kubeadm引导集群 安装Pod网络
文章目录 1. 虚拟机步骤2. Docker 部署 Kubernetes2.1 部署 docker2.1.1 环境要求2.1.2 安装 docker 引擎2.1.3 worker 节点对 master 节点免密2.1.4 设定 docker 开机自启2.1.5 打开桥接,查看桥接流量2.1.6 设定 systemd 方式管理 cgroup2.1.7 docker部署完成2.1.8…...
Redis的使用规范小建议
Redis 核心技术与实战 笔记 作者: 蒋德钧 毕竟,高性能和节省内存,是我们的两个目标,只有规范地使用Redis,才能真正实现这两个目标。如果说之前的内容教会了你怎么用,那么今天的内容,就是帮助你用…...
操作受限的线性表——栈
本文主要内容:本文主要讲解栈的基本概念、基本操作和栈的顺序、链式实现。 目录 栈一、栈的基本概念1、基本概念2、基本操作 二、栈的顺序存储结构1、顺序栈的实现2、顺序栈的基本运算1)初始化2)判栈空3)进栈4)出栈5&a…...
C++基类指针或引用指向或引用派生类对象(实现动态多态四种手段)父类指针访问子类成员变量(需要dynamic_cast)
文章目录 背景多态示例:父类指针指向子类对象父类指针指向子类对象,如何通过父类指针访问到子类特定的成员变量实现动态多态的四种手段:基类的指针或引用指向或引用一个派生类对象(new或不new) 背景 比如有父类Animal…...
WTM框架运行报错0308010C:digital envelope routines::unsupported
WTM框架运行报错0308010C:digital envelope routines::unsupported 错误描述报错原因解决方式 错误描述 我所使用WTM搭建的程序是选择的.net5.0Vue前后端分离的方式,项目结构选择的是“各层分离的多个项目”;本人并非初次使用WTM平台框架搭建项目&#…...
(二)CSharp-索引器
1、索引器定义 什么是索引器 索引器(indexer)是这样一种成员:它使对象能够用与数组相同的方式(即使用下标)进行索引 索引器的声明参见 C# 语言定义文档注意:没有静态索引器 索引器是一组 get 和 set 访问…...
配合AI刷leetcode 实现1170
题目如下: 1170. 比较字符串最小字母出现频次 难度中等 75 定义一个函数 f(s),统计 s 中(按字典序比较)最小字母的出现频次 ,其中 s 是一个非空字符串。 例如,若 s "dcce",那么…...
English Learning - L3 作业打卡 Lesson5 Day36 2023.6.9 周五
English Learning - L3 作业打卡 Lesson5 Day36 2023.6.9 周五 引言🍉句1: So next time you are on a train, look around and see what other people are reading, but dont jump to any conclusions.成分划分弱读连读爆破语调 🍉句2: You will probab…...
前端框架笔记
Vue.js的安装 安装Vue.js有两种方法: (1)类似于Bootstrap或jQuery,直接通过HTML文件中的标签引用。为了方便开发者使用,Vue.js提供了相关的CDN,通过如下代码可以引用最新版本的Vue.js: <sc…...
详细设计文档
1. 引言 1.1 目的 1.2 范围 1.3 定义、缩略语和缩写 1.4 参考文献 1.5 概述 2. 系统架构设计 2.1 总体架构 2.2 模块划分 2.3 数据流程设计 2.4 接口设计 3. 模块详细设计 3.1 登录模块详细设计 3.1.1 类设计 3.1.2 方法设计 3.1.3 数据库表设计 3.1.4 界面设计 3.2 文章管理模…...
Java011——Java数据类型转换(基本数据类型)
回顾:Java八大基本数据类型 大类 类型名称 关键字 占用内存 取值范围 --------------------------------------------------------------------------------------------|字节型 byte 1 字节 -128~127 整型 |短整型 short 2 字节 -32768~32…...
mybatis-plus用法(二)
(5条消息) mybatis-plus用法(一)_渣娃工程师的博客-CSDN博客 AR模式 ActiveRecord模式,通过操作实体对象,直接操作数据库表。与ORM有点类似。 示例如下 让实体类User继承自Model package com.example.mp.po; import com.bao…...
SQL笔记-存储过程+循环
存储过程循环使用方法 Oracle Oracle中存储过程的循环使用方法如下: DECLAREi NUMBER; BEGINi : 1;WHILE i < 10 LOOPDBMS_OUTPUT.PUT_LINE(i || i);i : i 1;END LOOP; END;其中,DECLARE用于声明变量,BEGIN和END用于标识存储过程的开始…...
HNU-操作系统OS-作业1(4-9章)
这份文件是OS_homework_1 by计科2102 wolf 202108010XXX 文档设置了目录,可以通过目录快速跳转至答案部分。 第四章 4.1用以下标志运行程序:./process-run.py -l 5:100,5:100。CPU 利用率(CPU 使用时间的百分比)应该是多少?为什么你知道这一点?利用 -c 标记查看你…...
springboot 精华
一、基础 官方文档地址:Spring Boot 注:以下部分例子 有些用到 .properties 方式,有些用 .yml方式,两者可自行学习,这里部分是为了省空间而写 .properties 方式。 1、泛谈 (1)优势 快速构建…...
我用ChatGPT写2023高考语文作文(三):新课标I卷
2023年 新课标I卷 适用地区:山东、福建、湖北、江苏、广东、湖南、河北、浙江 好的故事,可以帮我们更好地表达和沟通,可以触动心灵、启迪智慧;好的故事,可以改变一个人的命运,可以展现一个民族的形象……故…...
HTML 标签的学习
1.HTML 的结构 前端三剑客: HTML CSS JS,本章我们学习的是HTML HTML > 超文本标记语言 HTML代码是由"标签"构成的. 形如 <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. 为开始标签, 为结束标签.少数标签只有开始标签…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
