当前位置: 首页 > news >正文

学习笔记第二十九天

IPC 进程间通信方式:共享内存

原理

共享内存是最高效的进程间通信方式之一,因为它允许两个或多个进程直接访问同一块物理内存区域。这种机制避免了数据在用户空间和内核空间之间的频繁拷贝,从而显著提高了数据传输的效率。

在Linux系统中,共享内存区域由内核管理,但可以由多个进程映射到它们各自的地址空间中。这样,进程就可以像访问本地内存一样直接读写这块共享内存区域。

操作流程
  1. 产生Key值
    使用ftok函数根据给定的路径名和项目ID生成一个唯一的键值(key),这个键值将用于后续的IPC对象操作。

  2. 申请共享内存
    使用shmget函数根据键值申请一块共享内存区域。如果申请成功,该函数会返回一个共享内存标识符(shmid)。

  3. 映射共享内存
    使用shmat函数将共享内存区域映射到进程的地址空间中,以便进程可以直接访问这块内存。

  4. 访问共享内存
    进程通过映射得到的地址直接读写共享内存中的数据。

  5. 解除映射
    使用shmdt函数解除共享内存与进程地址空间的映射关系。

  6. 销毁共享内存
    当不再需要共享内存时,可以使用shmctl函数并指定IPC_RMID命令来删除这块共享内存。

1. ftok - 生成key值
#include <sys/types.h> 
#include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
  • 功能:将路径名pathname和工程IDproj_id转换为唯一的key值。
  • 参数
    • pathname:一个路径名。
    • proj_id:工程ID,通常是ASCII字符。
  • 返回值:成功时返回唯一的key值,失败时返回-1。
2. shmget - 申请共享内存
#include <sys/ipc.h> 
#include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);
  • 功能:使用唯一键值key向内核提出共享内存使用申请。
  • 参数
    • key:唯一键值。
    • size:要申请的共享内存大小。
    • shmflg:访问权限和创建标志(如IPC_CREAT、IPC_EXCL)。
  • 返回值:成功时返回共享内存ID,失败时返回-1。
3. shmat - 映射共享内存
#include <sys/types.h> 
#include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 功能:将指定shmid对应的共享内存映射到本地内存。
  • 参数
    • shmid:共享内存ID。
    • shmaddr:本地地址,通常为NULL表示由系统自动分配。
    • shmflg:访问权限(如0表示读写,SHM_RDONLY表示只读)。
  • 返回值:成功时返回映射的地址,失败时返回(void*)-1。
4. shmdt - 撤销共享内存映射
#include <sys/types.h> 
#include <sys/shm.h> int shmdt(const void *shmaddr);

  • 功能:将本地内存与共享内存断开映射关系。
  • 参数shmaddr:要断开的映射地址。
  • 返回值:成功时返回0,失败时返回-1。
5. shmctl - 控制共享内存
#include <sys/ipc.h> 
#include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 功能:修改共享内存属性或删除共享内存对象。
  • 参数
    • shmid:共享内存ID。
    • cmd:操作命令(如IPC_RMID表示删除对象)。
    • buf:指向shmid_ds结构的指针,用于传递信息或NULL(仅删除对象时)。
  • 返回值:成功时返回0,失败时返回-1。
6.示例

假设我们有两个进程a.outb.out,它们需要通过共享内存交换一个pid_t类型的进程ID。

a.out(写进程)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
#include <unistd.h> int main() 
{ key_t key = ftok("/tmp", 'A'); int shmid = shmget(key, sizeof(pid_t), IPC_CREAT | 0666); if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); } void *shmaddr = shmat(shmid, NULL, 0); if (shmaddr == (void *)-1) { perror("shmat"); exit(EXIT_FAILURE); } pid_t *pid_ptr = shmaddr; *pid_ptr = getpid(); // 将当前进程的PID写入共享内存 shmdt(shmaddr); shmctl(shmid, IPC_RMID, NULL); return 0; 
}


b.out(读进程)

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
#include <unistd.h> int main() 
{ key_t key = ftok("/tmp", 'A'); int shmid = shmget(key, sizeof(pid_t), 0666); if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); } void *shmaddr = shmat(shmid, NULL, 0); if (shmaddr == (void *)-1) { perror("shmat"); exit(EXIT_FAILURE); } pid_t *pid_ptr = shmaddr; printf("Received PID: %d\n", *pid_ptr); shmdt(shmaddr); return 0; 
}
7.总结
  1. 共享内存数据的存储方式是拷贝还是剪切?
    答:在共享内存的情况下,数据是直接访问的,不涉及拷贝或剪切操作。进程直接通过映射的地址访问物理内存区域。

  2. 共享内存的数据如果多次不同进程读写会怎么样?
    答:如果多个进程读写同一块共享内存区域,并且没有适当的同步机制(如信号量),那么可能会出现数据竞争和覆盖的情况

相关文章:

学习笔记第二十九天

IPC 进程间通信方式&#xff1a;共享内存 原理 共享内存是最高效的进程间通信方式之一&#xff0c;因为它允许两个或多个进程直接访问同一块物理内存区域。这种机制避免了数据在用户空间和内核空间之间的频繁拷贝&#xff0c;从而显著提高了数据传输的效率。 在Linux系统中&…...

Apache Paimon走在正确的道路上|一些使用体验和未来判断

Apache Paimon这个框架大家应该都不陌生了。 在实际工作中大家应该多多少少都用到&#xff0c;这个文章是一个简单的使用体会。不涉及湖框架的拉踩&#xff0c;我们的着眼点是解决实际问题。 我来结合自身体会跟大家说说Paimon这个框架和对未来的一些判断。大家可以参考&#x…...

安装MySQL入门基础指令

一.安装MySQL(以5.7版本为例) 1.一路默认安装&#xff0c;截图供大家参考 修改自己window安装名字即可 2.配置环境变量 C:\Program Files\MySQL\MySQL Server 5.7\bin 写入系统环境变量即可在window窗口使用其服务了 3.登录MySQL服务 进入控制台输入命令 mysql -u root …...

搜维尔科技:【研究】Haption Virtuose外科手术触觉视觉学习系统的开发和评估

Haption面临挑战 除此之外&#xff0c;外科医生有时会对骨组织进行非常复杂的手术&#xff0c;其中一个例子是人工耳蜗的手术植入。重要的是要避免神经或血管等危险结构受伤&#xff0c;并尽可能轻柔地进行手术。在外科医生能够安全、无差错地进行此类手术之前&#xff0c;需要…...

达梦表字段、字段类型,精度比对及更改字段SQL生成

达梦表字段、字段类型&#xff0c;精度比对及更改字段SQL生成&#xff1a; 依赖 <!-- 达梦 Connector --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.62</version>&l…...

2.pandas--读取文件夹中所有excel文件进行合并

文章目录 代码对应的本地文件文件夹目录三个文件夹中的内容test01.xlsxtest02.xlsxtest03.xlsx 三个文件合并后得到merge.xlsx文件文件内容 生成result.xlsx文件内容 代码 import glob import pandas as pddf_merge pd.DataFrame() # 创建一个空的DataFramefolder_path &qu…...

WPS Office两个严重漏洞曝光,已被武器化且在野利用

WPS Office作为一款用户基数超过2亿的广泛使用的办公套件&#xff0c;被发现存在两个关键漏洞&#xff08;CVE-2024-7262和CVE-2024-7263&#xff09;&#xff0c;这些漏洞可能导致用户遭受远程代码执行攻击。这两个漏洞的CVSS评分为9.3&#xff0c;表明它们的严重性很高&#…...

基于Java爬取微博数据(五) 补充微博正文列表图片 or 视频 内容

基于Java爬取微博数据五 补充微博正文列表图片 or 视频 内容 数据分析补充图片 or 视频执行结果 在通过对微博正文内容中的图片 or 视频内容进行分析后&#xff0c;图片 or 视频 链接是可以直接通过 Java 代码下载或者转存的&#xff0c;那么这样就可以补充我们在 【基于Java爬…...

反射异常捕获 | InvocationTargetException 要用e.getCause()打印才能看到具体异常

背景&#xff1a;线上某段和反射相关的代码报错了&#xff0c;但是异常信息打印只看到了 InvocationTargetException&#xff0c;没打印具体的异常。就像这样&#xff1a;java.lang.reflect.InvocationTargetException: null 查阅资料后发现要用e.getCause()才能打印具体异常&a…...

【计算机网络】网络版本计算器

此前我们关于TCP协议一直写的都是直接recv或者read&#xff0c;有了字节流的概念后&#xff0c;我们知道这样直接读可能会出错&#xff0c;所以我们如何进行分割完整报文&#xff1f;这就需要报头来解决了&#xff01; 但当前我们先不谈这个话题&#xff0c;先从头开始。 将会…...

使用 Python 爬虫进行网站流量分析:Referer 头的利用

在互联网时代&#xff0c;网站流量分析是了解用户行为、优化网站结构和提升用户体验的重要手段。本文将介绍如何使用 Python 爬虫技术结合 HTTP Referer 头进行网站流量分析&#xff0c;以及如何实现这一过程。 什么是 HTTP Referer 头&#xff1f; HTTP Referer 头是一个请求…...

梧桐数据库(WuTongDB):数据库技术中LL算法详解

LL 算法是一种自顶向下的语法分析算法&#xff0c;广泛用于构建解析器。LL 分析器逐个读取输入符号&#xff0c;从左到右分析&#xff08;Left-to-Right&#xff09;&#xff0c;并使用最左推导&#xff08;Leftmost Derivation&#xff09;来生成语法树。因此&#xff0c;LL 分…...

【秋招笔试】8.18大疆秋招(第一套)-后端岗

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…...

CSS 的text-size-adjust属性

text-size-adjust 属性在CSS中用于控制用户是否可以调整网页中文字的字体大小。这个属性主要针对移动设备上的浏览器&#xff0c;尤其是那些允许用户通过捏合&#xff08;pinch&#xff09;手势来缩放整个页面的浏览器。 语法 text-size-adjust: none; text-size-adjust: aut…...

阿里MAXCOMPUTE数据专辑信息读取并同步数据表

阿里MAXCOMPUTE数据专辑信息读取并同步数据表 在阿里云大数据体系中&#xff0c;我们可以使用数据地图的数据专辑&#xff0c;对数据的类别等进行一个管理 那么管理后的数据&#xff0c;我们想要落表进行相关的数据分析&#xff0c;如何做呢&#xff1f; 查看阿里云官方文档…...

rufus制作ubantu的U盘安装介质时,rufus界面上的分区类型选什么?

rufus制作ubantu的U盘安装介质时&#xff0c;rufus软件界面上的分区类型选什么(如下图&#xff09;&#xff1f; 在使用Rufus制作Ubuntu的U盘安装介质时&#xff0c;分区类型的选择取决于我们的计算机的引导方式。 以下是具体的选择建议&#xff1a; 1、查看计算机的引导方式…...

【系统架构设计师-2018年】案例分析-答案及详解

试题一&#xff08;25分&#xff09; 阅读以下关于软件系统设计的叙述&#xff0c;在答题纸上回答问题1至问题3。 【说明】 某文化产业集团委托软件公司开发一套文化用品商城系统&#xff0c;业务涉及文化用品销售、定制、竞拍和点评等板块&#xff0c;以提升商城的信息化建设…...

linux驱动入门实验班——平台总线设备驱动模型和设备树

目录 前言 一、重要结构体 二、编程思路 1.platform_driver结构体 2.probe 三、使用设备树 1.步进电机 2.红外遥控 四、代码示例 前言 在这里主要记录学习韦东山老师Linux驱动人入门实验班的笔记&#xff0c;韦东山老师的驱动课程讲的非常好&#xff0c;想要学习驱动…...

零基础学习Python(六)

1. 元类的应用 使用元类给对象添加一个固有属性author: 对类名进行限定&#xff0c;要求类名必须是大写字母开头&#xff1a; class MetaC(type):def __init__(cls, name, bases, attrs):if not name.istitle():raise TypeError("类名必须是大写字母开头~")return …...

微信小程序--31(todolist案例)

一.功能 输入待办事件添加代办事件删除代办事件 二、步骤 1.添加输入框 .wxml代码&#xff1a; <!-- 1.输入框 --><input type"text" bindinput"handleInput" value"{{text}}" /> .wxss代码&#xff1a; /* 1.输入框样式 */ i…...

从PLINK到CMplot:三步绘制高颜值SNP密度图

1. 从PLINK数据到SNP密度图&#xff1a;为什么需要可视化 做基因组分析的朋友都知道&#xff0c;拿到原始数据后的第一件事就是检查数据质量。我刚开始做GWAS研究时&#xff0c;导师问的第一个问题就是&#xff1a;"你的SNP在染色体上分布均匀吗&#xff1f;"当时我就…...

对比按需计费与 Token Plan 在 Taotoken 平台上的长期成本差异感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比按需计费与 Token Plan 在 Taotoken 平台上的长期成本差异感受 在构建和运营依赖大模型能力的应用时&#xff0c;成本控制是一…...

深入理解C/C++混合编程

在工作中&#xff0c;C、C密不可分&#xff0c;做我们嵌入式方面的&#xff0c;当然更多的是C&#xff0c;但&#xff0c;有时候却少不了C&#xff0c;而且是C、C混搭&#xff08;混合编程&#xff09;在一起的&#xff0c;比如&#xff0c;RTP视频传输&#xff0c;live555多媒…...

AI驱动的工业预测性维护技术实践:AI驱动的预测性维护系统通过多传感器融合(振动、温度、电流等)实时监测设备健康状态,结合TSN网络实现毫秒级数据传输

标签:预测性维护 PHM 工业AI 振动分析 TSN 设备管理 引言:设备算命先生的时代来了 “老张,你这台风机轴承怕是撑不过两周了。” 如果有个"设备算命先生"能掐指一算就说出这句话,工厂的设备经理们大概会把他供起来。但在2024年,这个"算命先生"真的出…...

完整掌握yuzu模拟器:专业级Switch游戏体验优化指南

完整掌握yuzu模拟器&#xff1a;专业级Switch游戏体验优化指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器作为目前最成熟的任天堂Switch开源模拟器&#xff0c;为PC玩家提供了在电脑上畅玩Switch游…...

从ValueError到精准评估:解决超分辨率重建中SSIM/PSNR计算的三大实战难题

1. 从报错到理解&#xff1a;新版skimage的SSIM/PSNR计算函数变迁 第一次用skimage计算超分辨率重建指标时&#xff0c;我就被当头一棒——熟悉的compare_ssim和compare_psnr居然报"ImportError"。这就像你习惯去小区东门拿快递&#xff0c;突然发现快递柜搬到了西门…...

Matlab控制建模实战:从开环到闭环的传递函数构建

1. 从零开始认识传递函数 第一次接触控制系统的朋友可能会被"传递函数"这个概念吓到&#xff0c;但其实它就像是我们日常生活中的"快递单号"。想象一下&#xff0c;你在网上购物时&#xff0c;商家把货物&#xff08;输入信号&#xff09;交给快递公司&…...

网络安全新态势与应对策略

网络安全新态势与应对策略 在数字化浪潮席卷全球的今天&#xff0c;网络空间已成为国家竞争的新战场、经济发展的新引擎和社会生活的新空间。然而&#xff0c;伴随技术飞速发展的&#xff0c;是日益严峻和复杂的网络安全挑战。传统的边界防御模式在AI驱动的自动化攻击、无孔不…...

【UEFI实战】GOP协议详解:从模式查询到像素操作

1. GOP协议基础&#xff1a;UEFI图形显示的核心机制 第一次接触UEFI图形编程时&#xff0c;我被屏幕上突然出现的红色进度条震撼到了——原来在系统启动的早期阶段就能实现图形化显示。这背后的关键就是EFI_GRAPHICS_OUTPUT_PROTOCOL&#xff08;简称GOP&#xff09;&#xff0…...

Nordic nRF52832蓝牙串口实战:手把手教你用SDK 15.3.0实现手机与设备双向通信

Nordic nRF52832蓝牙串口开发实战&#xff1a;从SDK配置到双向通信全解析 在嵌入式蓝牙开发领域&#xff0c;Nordic的nRF52832芯片凭借其优异的射频性能和丰富的外设资源&#xff0c;成为物联网设备开发的明星选择。但对于刚接触这款芯片的开发者来说&#xff0c;如何快速实现手…...