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

【Linux之进程间通信】06.Linux进程通信 - 共享内存

 
【Linux之进程间通信】

项目代码获取:https://gitee.com/chenshao777/linux-processes.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)

06.共享内存

共享内存是Linux进程间的通信方式之一

创建共享内存函数

int shmget(key_t key, size_t size, int shmflg);
参数含义
keyIPC_PRIVATE或ftok()函数获取
size共享内存大小
shmflg权限

返回值:
成功返回共享内存描述符
失败返回-1

需要包含头文件

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

共享内存和管道一样
有的共享内存只能在亲缘关系的进程间通信
有的可以在任意进程间通信
这取决于第一个参数 key


共享内存的创建(用于亲缘关系进程间)
参数 key 赋值为IPC_PRIVATE,表示用于亲缘关系进程
实例代码:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>/*创建一个共享内存int shmget(key_t key, size_t size, int shmflg);参数:key : 用户给定的键值,IPC对象的名字size: 共享内存的大小shmflg: 共享内存的权限返回值:成功返回有效的共享内存标识符,失败返回-1查看内核中IPC对象: ipcs -m删除IPC对象: ipcrm  -m shmid
*/
int main(int argc, char *argv[])
{int shm_id;//创建共享内存(亲缘进程)shm_id = shmget(IPC_PRIVATE, 100, 0777);if(shm_id < 0){printf("共享内存创建失败\n");}printf("共享内存创建成功,shm_id = %d\n",shm_id);//查看所有IPC对象system("ipcs -m");//删除IPC对象char cmd[50] = {0};sprintf(cmd, "ipcrm -m %d", shm_id);system(cmd);//查看所有IPC对象system("ipcs -m");return 0;
}

运行结果(创建内存段后再删除内存段):

共享内存创建成功,shm_id = 32778------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     连接数  状态      
0x00000000 32768      hc         600        524288     2          目标       
0x00000000 32769      hc         600        524288     2          目标       
0x00000000 32772      hc         600        524288     2          目标       
0x00000000 6          hc         600        134217728  2          目标       
0x00000000 32776      hc         600        524288     2          目标       
0x00000000 32778      hc         777        100        0                       
0x00000000 15         hc         600        524288     2          目标       
0x00000000 16         hc         600        524288     2          目标       
0x00000000 19         hc         600        524288     2          目标       ------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     连接数  状态      
0x00000000 32768      hc         600        524288     2          目标       
0x00000000 32769      hc         600        524288     2          目标       
0x00000000 32772      hc         600        524288     2          目标       
0x00000000 6          hc         600        134217728  2          目标       
0x00000000 32776      hc         600        524288     2          目标       
0x00000000 15         hc         600        524288     2          目标       
0x00000000 16         hc         600        524288     2          目标       
0x00000000 19         hc         600        524288     2          目标

可以看到通过 ipcs -m 命令获取到当前共享内存段中有

0x00000000 32778      hc         777        100        0   

它的键值为 0,这表示它只能用于亲缘进程通信


共享内存的创建(任意进程间)

参数 key 值通过 ftok(const char *pathname, int proj_id) 函数获取
ftok(const char *pathname, int proj_id) 函数的第一个参数是文件路径,当前路径就可以,第二个参数是一个int类型的值,可实际上只有8位(1~127)
成功返回Key值,失败返回-1

示例代码:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>/*创建一个共享内存int shmget(key_t key, size_t size, int shmflg);参数:key : 用户给定的键值,IPC对象的名字size: 共享内存的大小shmflg: 共享内存的权限返回值:成功返回有效的共享内存标识符,失败返回-1查看内核中IPC对象: ipcs -m删除IPC对象: ipcrm  -m shmid
*/
int main(int argc, char *argv[])
{int shm_id;int key;key = ftok(".", 1);if(key < 0 ){printf("创建key失败\n");return -1;}shm_id = shmget(key, 100, IPC_CREAT | 0777);if(shm_id < 0){printf("共享内存创建失败\n");}printf("共享内存创建成功,shm_id = %d\n",shm_id);//查看所有IPC对象system("ipcs -m");//删除IPC对象char cmd[50] = {0};sprintf(cmd, "ipcrm -m %d", shm_id);system(cmd);//查看所有IPC对象system("ipcs -m");return 0;
}

注意的是,shmget函数第一个参数要换为key变量,第三个参数要加上IPC_CREAT宏

shmget(key, 100, IPC_CREAT | 0777);

运行结果:

共享内存创建成功,shm_id = 32802------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     连接数  状态      
0x00000000 32768      hc         600        524288     2          目标       
0x00000000 32769      hc         600        524288     2          目标       
0x00000000 32772      hc         600        524288     2          目标       
0x00000000 6          hc         600        134217728  2          目标       
0x00000000 32776      hc         600        524288     2          目标       
0x00000000 15         hc         600        524288     2          目标       
0x00000000 16         hc         600        524288     2          目标       
0x00000000 19         hc         600        524288     2          目标       
0x01011451 32802      hc         777        100        0                       ------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     连接数  状态      
0x00000000 32768      hc         600        524288     2          目标       
0x00000000 32769      hc         600        524288     2          目标       
0x00000000 32772      hc         600        524288     2          目标       
0x00000000 6          hc         600        134217728  2          目标       
0x00000000 32776      hc         600        524288     2          目标       
0x00000000 15         hc         600        524288     2          目标       
0x00000000 16         hc         600        524288     2          目标       
0x00000000 19         hc         600        524288     2          目标

发现这一行中,键值不为0了,代表此共享内存可以用于任意进程间通信

0x01011451 32802      hc         777        100        0  

key值 具体如何生成?
key 31-24 proj_id 低8位
key 23-16 pathname的st_dev属性的低8位
key 15-0 pathname的st_ino属性的低16位

32位组合而成一个int值,就是我们的ftok的返回值了

相关文章:

【Linux之进程间通信】06.Linux进程通信 - 共享内存

【Linux之进程间通信】 项目代码获取&#xff1a;https://gitee.com/chenshao777/linux-processes.git &#xff08;麻烦点个免费的Star哦&#xff0c;您的Star就是我的写作动力&#xff01;&#xff09; 06.共享内存 共享内存是Linux进程间的通信方式之一 创建共享内存函数…...

oracle安装

服务端安装&#xff08;公司中不需要&#xff0c;只安装客户端就行&#xff09; 1、挂载一个Windows系统 双击vmx文件 启动 2、网络配置 添加一个网络 自己电脑看控制面板是否添加虚拟网卡 查看连接的网络&#xff0c;ip地址不能为1&#xff0c;为1就自己修改&#xff0c;…...

CSS样式的三种引入方式及优先级

说明&#xff1a;网页开发有三种技术&#xff0c;分别是html、css和js&#xff0c;分别对应页面的结构、表现和动作。css样式引入&#xff0c;是指把对页面的渲染作用到html上&#xff0c;有以下三种方式&#xff1a;行内式、内嵌式和外联式。 第一种&#xff1a;行内式&#…...

Linux第二天

上传 scp -r 本地文件路劲 用户名目标主机地址&#xff1a;路径 下载&#xff1a;scp -r 用户名目标主机地址&#xff1a;路径 本地目录 ls -A /root //查看root文件下所有的隐藏文件 命令&#xff1a;ls 选项&#xff1a; -l&#xff1a;查看文件属性 -h&#xff1a;文…...

微服务和领域驱动

一、微服务 1.1 什么是微服务 微服务就是一些协同工作的小而自治的服务。 关键词&#xff1a; 小而自治 -- 小 “小”这个概念&#xff0c;一方面体现在微服务的内聚性上。 内聚性也可以称之为单一职责原则&#xff1a;“把因相同原因而变化的东西聚合到一起&#xff0c;…...

Redis如何做到内存高效利用?过期key删除术解析!

大家好&#xff0c;我是小米&#xff0c;一个热衷于分享技术的小伙伴。今天我要和大家探讨一个关于 Redis 的话题&#xff1a;删除过期key。在使用 Redis 进行数据存储和缓存时&#xff0c;我们经常会遇到过期数据的处理问题。接下来&#xff0c;我将为大家介绍为什么要删除过期…...

EFDC模型教程

详情点击链接&#xff1a;EFDC建模方法及在地表水环境评价、水源地划分、排污口论证 一&#xff0c;软件安装 1.1 EFDC安装 1.2 EFDC-Explorer安装 1.3 Delft3D安装 1.4 Google Earth安装二&#xff0c;EFDC模型 2.1 EFDC模型 2.2 EFDC-DSI模型 2.3 EFDC的…...

URLConnection(三)

文章目录 1. 配置连接2. protected URL url3. protected boolean connected4. protected boolean allowUserInteraction5. protected boolean doInput5. protected boolean doOutput6. protected boolean isModifiedSince7. protected boolean useCaches8. 超时 1. 配置连接 U…...

针对KF状态估计的电力系统虚假数据注入攻击研究(Matlab代码实现)

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

2023-05-25 LeetCode每日一题(差值数组不同的字符串)

2023-05-25每日一题 一、题目编号 差值数组不同的字符串 二、题目链接 点击跳转到题目位置 三、题目描述 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 …...

MI小米验厂知识点

【MI小米验厂知识点】 小米科技有限责任公司成立于2010年3月3日&#xff0c;是专注于智能硬件和电子产品研发、智能手机、智能电动汽车、互联网电视及智能家居生态链建设的全球化移动互联网企业、创新型科技企业。小米公司创造了用互联网模式开发手机操作系统、发烧友参与开发改…...

损失函数——交叉熵损失(Cross-entropy loss)

交叉熵损失&#xff08;Cross-entropy loss&#xff09;是深度学习中常用的一种损失函数&#xff0c;通常用于分类问题。它衡量了模型预测结果与实际结果之间的差距&#xff0c;是优化模型参数的关键指标之一。以下是交叉熵损失的详细介绍。 假设我们有一个分类问题&#xff0…...

电商ERP接口erp进销存接口

电商API详情接口在ERP中的重要性 电商行业的发展已经改变了人们的消费方式。作为一种连续不断涌现并不断发展的新型销售方式&#xff0c;电商具有开创新市场、大众化消费、商业模式的多样化、效率的提高等优势&#xff0c;对传统零售业产生了极大的冲击。而ERP作为企业资源规划…...

leetcode 922. 按奇偶排序数组 II

题目描述解题思路执行结果 leetcode 922. 按奇偶排序数组 II. 题目描述 按奇偶排序数组 II 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#…...

Unity四叉树地图

当使用Unity构建大规模的游戏地图或场景时&#xff0c;使用四叉树数据结构可以提高性能和效率。四叉树是一种基于分割的数据结构&#xff0c;将空间划分为四个相等的子区域&#xff0c;并以递归方式构建树结构。在游戏开发中&#xff0c;四叉树常用于空间分区、碰撞检测和可视化…...

【unity插件】OpenFracture插件实现物体破裂和切割

插件地址 https://github.com/Mustenaka/OpenFracture 使用注意事项 1.如果要导入自定义网格,则必须在导入设置中将“启用读/写”设置为 true。否则,您将收到错误。 2.网格必须是非相交和封闭的。否则,重新三角测量将失败。 上面描绘的是凳子的线框模型。注意横杆如何与…...

Spring Security实现登录

前言 Spring Security是Spring框架下的一个用于身份验证和授权的框架&#xff0c;它可以帮忙管理web应用中的用户认证、授权以及安全性问题。本文将介绍如何使用Spring Security实现用户登录功能&#xff0c;本文主要包括以下内容&#xff1a; 环境准备Spring Security核心概…...

小狐狸ChatGPT付费创作系统1.9.7独立版 + H5端 + 小程序前端增加AI绘画+GPT4接口

小狐狸ChatGPT 1.9.7独立版经播播资源测试了版本比较&#xff0c;本版核心增加了GPT4.0接口功能&#xff0c;小程序端内置了AI绘画功能。体验下来问答速度感觉体验更好。小程序端有更新请对应开发工具更新上传&#xff0c;本版无开源端。播播资源提供的安装教程详见下方&#x…...

双目测距联合YOLOv8 项目总结

代码贴&#xff1a;双目测距--5 双目相机 联合 YOLOv8_爱钓鱼的歪猴的博客-CSDN博客 0、图片筛选 可以用matlab,对双目图像做个一个筛选&#xff0c;也就是做双目标定。 熟悉matlab的小伙伴完全可以用matlab做双目标定&#xff0c;我是没咋接触过不知道怎么导出标定结果&#…...

Windows提权:利用MSSQL数据库,Oracle数据库

目录 MSSQL提权&#xff1a;使用xp_cmdshell进行提权 MSSQL&#xff1a;使用sp_OACreate进行提权 MSSQL&#xff1a;使用沙盒提权 Oracle提权&#xff1a;工具一把梭哈 总结 MSSQL在Windows server类的操作系统上&#xff0c;默认具有system权限。 MSSQL提权&#xff1a;使…...

从裸机开发到RTOS:嵌入式系统进阶指南

1. 裸机开发的本质与局限性裸机开发&#xff0c;顾名思义就是在没有任何操作系统支持下直接对硬件进行编程。这种方式在嵌入式系统入门阶段非常普遍&#xff0c;尤其适合资源极其有限的8位单片机&#xff08;如51系列&#xff09;或简单应用场景。但当我们面对STM32这类性能强大…...

霸王餐外卖接口对接中的签名校验、加密传输 Java 后端实现细节

霸王餐外卖接口对接中的签名校验、加密传输 Java 后端实现细节 在霸王餐&#xff08;免费试吃&#xff09;及外卖CPS分销系统的开发中&#xff0c;数据的安全性是核心命脉。由于涉及用户的隐私信息&#xff08;如手机号、OpenId&#xff09;以及核心的佣金计算逻辑&#xff0c;…...

紧急预警!Vim惊现远程代码执行漏洞CVE-2026-34714,开发者必看防护指南

紧急预警&#xff01;Vim惊现远程代码执行漏洞CVE-2026-34714&#xff0c;开发者必看防护指南 作为天天和代码打交道的你&#xff0c;有没有想过&#xff1a;打开一个“普通文本文件”的瞬间&#xff0c;系统可能已经被植入后门&#xff1f;2026年3月&#xff0c;Vim官方披露的…...

天梯赛L2-006 树的遍历

L2-006 树的遍历 给定一棵二叉树的后序遍历和中序遍历&#xff0c;请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤30&#xff09;&#xff0c;是二叉树中结点的个数。第二行给出其后序遍历序…...

Emby高级功能完全解锁指南:emby-unlocked让媒体服务器焕发新生

Emby高级功能完全解锁指南&#xff1a;emby-unlocked让媒体服务器焕发新生 【免费下载链接】emby-unlocked Emby with the premium Emby Premiere features unlocked. 项目地址: https://gitcode.com/gh_mirrors/em/emby-unlocked 你是否厌倦了Emby Premiere的高级功能需…...

AI技术原理--Transformer详解:搞懂AI核心架构

你可能用过GPT&#xff0c;但你知道GPT的全称是什么吗&#xff1f; GPT Generative Pre-trained Transformer Generative&#xff1a;生成式Pre-trained&#xff1a;预训练Transformer&#xff1a;网络结构 Transformer可以说是目前AI最重要的网络架构&#xff0c;它让GPT真正…...

7B、14B、80B大模型参数量解析:性能、成本与选择全攻略!

本文解析了7B、14B、80B大模型参数量代表的含义及其对模型能力、资源消耗、训练与推理成本的影响。参数量越大&#xff0c;模型表达能力越强&#xff0c;但资源需求与成本也越高。7B适合轻量级任务与低预算场景&#xff0c;14B兼顾性能与成本&#xff0c;80B适用于追求顶尖性能…...

回表为什么慢:二级索引到聚簇索引、覆盖索引与“延迟关联”

目标&#xff1a;你能把“回表”解释成一个可量化的成本模型&#xff0c;并掌握两类实战优化&#xff1a;覆盖索引与延迟关联&#xff08;先查主键再回表&#xff09;。1. 先把概念说透&#xff1a;InnoDB 的两棵树 聚簇索引&#xff08;主键 B 树&#xff09;&#xff1a;叶子…...

AI 短剧变现的 4 大合规赛道 新手低门槛可切入

当下AI短剧成为内容领域的热门风口&#xff0c;不少人想入局分一杯羹&#xff0c;却因担心踩坑违规、找不准变现方向而犹豫不决。其实新手入局无需焦虑&#xff0c;只要选对合规赛道&#xff0c;低门槛也能轻松切入。本文将详细拆解4个核心变现路径&#xff0c;全程贴合平台审核…...

社交媒体 SEO 优化应该注意哪些

社交媒体 SEO 优化的核心要点 在当今数字化时代&#xff0c;社交媒体已经成为品牌营销和用户互动的重要平台。单靠社交媒体上的粉丝数量不能保证品牌的成功。为了在众多用户中脱颖而出&#xff0c;社交媒体 SEO 优化显得尤为重要。社交媒体 SEO 优化应该注意哪些关键点呢&…...