【在Linux世界中追寻伟大的One Piece】System V共享内存
目录
1 -> System V共享内存
1.1 -> 共享内存数据结构
1.2 -> 共享内存函数
1.2.1 -> shmget函数
1.2.2 -> shmot函数
1.2.3 -> shmdt函数
1.2.4 -> shmctl函数
1.3 -> 实例代码
2 -> System V消息队列
3 -> System V信号量

1 -> System V共享内存
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。
示意图:

1.1 -> 共享内存数据结构
struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kernel_time_t shm_ctime; /* last change time */__kernel_ipc_pid_t shm_cpid; /* pid of creator */__kernel_ipc_pid_t shm_lpid; /* pid of last operator */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_unused; /* compatibility */void* shm_unused2; /* ditto - used by DIPC */void* shm_unused3; /* unused */
};
1.2 -> 共享内存函数
1.2.1 -> shmget函数
功能:用来创建共享内存原型int shmget(key_t key, size_t size, int shmflg);参数key:这个共享内存段名字size:共享内存大小shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
1.2.2 -> shmot函数
功能:将共享内存段连接到进程地址空间原型void *shmat(int shmid, const void *shmaddr, int shmflg);参数shmid: 共享内存标识shmaddr:指定连接的地址shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1
说明:
shmaddr为NULL,核心自动选择一个地址shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr -(shmaddr % SHMLBA)shmflg=SHM_RDONLY,表示连接操作用来只读共享内存
1.2.3 -> shmdt函数
功能:将共享内存段与当前进程脱离原型int shmdt(const void *shmaddr);参数shmaddr: 由shmat所返回的指针返回值:成功返回0;失败返回-1注意:将共享内存段与当前进程脱离不等于删除共享内存段
1.2.4 -> shmctl函数
功能:用于控制共享内存原型int shmctl(int shmid, int cmd, struct shmid_ds *buf);参数shmid:由shmget返回的共享内存标识码cmd:将要采取的动作(有三个可取值)buf:指向一个保存着共享内存的模式状态和访问权限的数据结构返回值:成功返回0;失败返回-1
| 命令 | 说明 |
| IPC_STAT | 把shmid_ds结构中的数据设置为共享内存的当前关联值 |
| IPC_SET | 在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值 |
| IPC_RMID | 删除共享内存段 |
1.3 -> 实例代码
测试代码结构
# lsclient.c comm.c comm.h Makefile server.c# cat Makefile.PHONY:allall:server clientclient:client.c comm.cgcc -o $@ $^server:server.c comm.cgcc -o $@ $^.PHONY:cleanclean:rm -f client server
comm.h
#ifndef COMM_H
#define COMM_H
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PATHNAME "."
#define PROJ_ID 0x6666
int createShm(int size);
int destroyShm(int shmid);
int getShm(int size);
#endif
comm.c
#include "comm.h"static int commShm(int size, int flags)
{key_t _key = ftok(PATHNAME, PROJ_ID);if (_key < 0) {perror("ftok");return -1;}int shmid = 0;if ((shmid = shmget(_key, size, flags)) < 0) {perror("shmget");return -2;}return shmid;
}int destroyShm(int shmid)
{if (shmctl(shmid, IPC_RMID, NULL) < 0) {perror("shmctl");return -1;}return 0;
}int createShm(int size)
{return commShm(size, IPC_CREAT | IPC_EXCL | 0666);
}int getShm(int size)
{return commShm(size, IPC_CREAT);
}
server.c
#include "comm.h"int main()
{int shmid = createShm(4096);char* addr = shmat(shmid, NULL, 0);sleep(2);int i = 0;while (i++ < 26) {printf("client# %s\n", addr);sleep(1);}shmdt(addr);sleep(2);destroyShm(shmid);return 0;
}
client.c
#include "comm.h"int main()
{int shmid = getShm(4096);sleep(1);char* addr = shmat(shmid, NULL, 0);sleep(2);int i = 0;while (i < 26) {addr[i] = 'A' + i;i++;addr[i] = 0;sleep(1);}shmdt(addr);sleep(2);return 0;
}
ctrl+c终止进程,再次重启。
2 -> System V消息队列
System V消息队列是一种进程间通信(IPC)机制,它允许进程通过消息的形式进行数据交换。消息队列由内核管理,可以存储多种类型的消息,并且支持消息的有序存取。每个消息都有一个类型字段,接收进程可以根据消息类型来接收特定的消息。
消息队列的关键数据结构
消息队列的状态和配置信息存储在struct msqid_ds数据结构中,它包含了队列的权限、消息计数、最大消息大小、队列字节数、最近操作进程的PID等信息。
消息队列的创建与操作
- 创建或打开消息队列使用msgget函数,该函数接受一个键值(key)和标志(msgflg)作为参数。如果消息队列不存在且msgflg包含IPC_CREAT标志,则会创建一个新的消息队列。
- 向消息队列发送消息使用msgsnd函数,接收消息使用msgrcv函数。这些函数允许进程指定消息的类型和大小,以及接收消息时的行为(例如阻塞或非阻塞)。
- 控制消息队列的状态,如删除消息队列或获取消息队列的统计信息,使用msgctl函数。
消息队列的编程示例
在编程实践中,可以通过创建发送进程和接收进程来演示消息队列的使用。发送进程将数据封装成消息并发送到队列,接收进程则从队列中取出消息进行处理。这种模式适用于生产者-消费者场景,其中一个或多个进程产生数据(生产者),另一个或多个进程消费数据(消费者)。
消息队列的实际应用
消息队列不仅限于简单的数据传递,它们还可以用于更复杂的通信模式,如实现信号量或实现更高级的同步机制。在多进程或多线程的应用程序中,消息队列提供了一种灵活且高效的通信手段。
3 -> System V信号量
System V信号量是一种进程间同步机制,它允许多个进程通过对共享资源的访问计数来进行协调。信号量可以是二元的(用于互斥),也可以是非负整数(用于资源计数)。System V信号量由内核管理,并通过一系列系统调用来创建、操作和销毁。
System V信号量的关键数据结构
System V信号量的核心数据结构是semid_ds,它包含了信号量集的权限、信号量的值、信号量的状态信息等。每个信号量集中的信号量由sem结构表示,其中包含信号量的当前值和相关的进程计数信息。
System V信号量的创建与操作
创建信号量集使用semget函数,该函数接受一个键值(key)、信号量的数量(nsems)和标志(semflg)作为参数。操作信号量集使用semop函数,该函数接受信号量集的标识符、指向sembuf结构数组的指针以及操作的数量作为参数。sembuf结构定义了对信号量执行的具体操作,如等待(P)或信号(V)操作。
System V信号量的编程示例
在编程中,可以通过定义信号量集、初始化信号量值、执行P和V操作以及最终销毁信号量集来实现进程间同步。例如,一个生产者-消费者问题可以通过信号量来确保生产者不会超过消费者的消费速度,防止缓冲区溢出。
System V信号量的实际应用
System V信号量广泛应用于操作系统中,用于实现进程间的同步和互斥。它们可以用于控制对共享资源的访问,管理进程的执行顺序,以及实现更复杂的同步算法。
感谢各位大佬支持!!!
互三啦!!!
相关文章:
【在Linux世界中追寻伟大的One Piece】System V共享内存
目录 1 -> System V共享内存 1.1 -> 共享内存数据结构 1.2 -> 共享内存函数 1.2.1 -> shmget函数 1.2.2 -> shmot函数 1.2.3 -> shmdt函数 1.2.4 -> shmctl函数 1.3 -> 实例代码 2 -> System V消息队列 3 -> System V信号量 1 -> Sy…...
【大数据】Spark弹性分布式数据集RDD详细说明
文章目录 整体介绍一、定义与特性二、操作与转换三、存储级别与持久化四、依赖关系与容错机制五、优化与性能调优 常见操作支持的数据格式1.文本文件 (Text Files)2. CSV 文件3. JSON 文件4. Parquet 文件5. Sequence Files6.Hadoop文件读取A. 读取HDFS上的文本文件B. 使用Hado…...
人参玉桂膏简介
一、产品基本信息 产品名称:人参玉桂膏 产品类别:植物饮料(专为特定体质设计) 配料:精选薏苡仁、荷叶、玉米须、赤小豆等纯然植物成分,辅以麦芽糖醇液、低聚果糖调节口感,陈皮、肉桂、人参&…...
消费者Rebalance机制
优质博文:IT-BLOG-CN 一、消费者Rebalance机制 在Apache Kafka中,消费者组 Consumer Group会在以下几种情况下发生重新平衡Rebalance: 【1】消费者加入或离开消费者组: 当一个新的消费者加入消费者组或一个现有的消费者离开消费…...
消息队列介绍
一、ActiveMQ 优点:性能单台(6000)成熟,已经在很多公司得到应用。各种协议支持好,有多个语言的成熟客户端 缺点:性能较弱,缺乏大规模吞吐的场景的应用,有江河日下之感 二、RabbitMQ…...
告别@Value,Spring Boot 3.3更优雅的配置注入方案
在Spring Boot的早期版本中,我们常使用Value注解来注入配置文件中的属性值。然而,这种方式虽然简单直接,却存在一些局限,比如它只能注入基本类型的值,并且需要显式地在每个需要注入的字段上使用注解。随着Spring Boot的…...
甲虫身体图像分割系统源码&数据集分享
甲虫身体图像分割系统源码&数据集分享 [yolov8-seg-EfficientRepBiPAN&yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…...
Qt - QMenu
QMenu 1、menu转string输出 //GlobalEnum.h #include <QObject> #include <QMetaEnum> class GlobalEnum : public QObject {Q_OBJECT public:EnumTest();enum Enum_Test{ZhangSan 0,WangWu,};Q_ENUM(Enum_Test) };#define EnumToString(e) \ QMetaEnum::fromTy…...
舵机驱动详解(模拟/数字 STM32)
目录 一、介绍 二、模块原理 1.舵机驱动原理 2.引脚描述 三、程序设计 main.c文件 servo.h文件 servo.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 舵机(Servo)是在程序的控制下,在一定范围内连续改变输出轴角度并保持的电机系统。即舵机只支持…...
dvwa:文件包含、文件上传
文件包含 本地文件包含(敏感信息泄露)和远程文件包含(命令执行) 本地文件包含一般包含一些本地的敏感文件,如:/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行,如包含黑客vps的…...
基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务
目录 引言 1. 创建一个新的Windows服务项目 2. 添加WCF服务 2.1 添加服务接口和实现 2.2 添加服务配置 3. 实现Windows服务 3.1 修改Service1类 3.2 在项目中添加ServiceInstaller 4. 安装和运行Windows服务 4.1 编译项目 4.2 使用InstallUtil.exe安装服务 …...
【ArcGIS/C#】调用控制台处理代码
代码示例 private static string[] run_conda_process(string command, Action<string> on_msg, CancellationTokenSource cancel){if (string.IsNullOrEmpty(command)){return new string[]{null,ArcGIS.Desktop.Internal.Core.Conda.Resources.Error_Unexpected + &qu…...
06_23 种设计模式之《适配器模式》
文章目录 一、适配器模式基础知识实例 一、适配器模式基础知识 适配器模式定义:将一个类的接口转换成客户希望的另一个接 口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可 以一起工作。 Client:客户端,调用自已需要的领域接口…...
Go语言--快速入门
Go语言特点 我们先看一下简单的Go语言程序 package mainimport "fmt"func main() { // 错误,{ 不能在单独的行上fmt.Println("Hello, World!") }我们可以看到外型非常像我们的JAVA,但是不需要;作为结尾,…...
京东云主机怎么用?使用京东云服务器建网站(图文教程)
京东云主机怎么用?非常简单,本文京东云服务器网jdyfwq.com使用以使用京东云服务器搭建WordPress博客网站为例,来详细说下京东云主机的使用方法。使用京东云服务器快速搭建WordPress网站教程,3分钟基于应用镜像一键搞定,…...
Linux 基础入门操作-实验七 进程的介绍
实验七 进程的介绍 7.1 进程基础概念 Linux进程在内存中包含三部分数据:码段、堆栈段和数据段。代码段存放了程序的代码。代码段可以为机器中运行同一程序的数个进程共享。堆栈段存放的是子程序的返回地址、子程序的参数及程序的局部变量。而数据段则存放程序的全…...
SQL进阶技巧:SQL中的正则表达式应用?
目录 0 引言 1. 正则表达式函数 1.1 regexp_extract 1.2 regexp_replace 1.3 regexp_like 2. 在WHERE子句中使用正则表达式 3. 在GROUP BY中使用正则表达式 4. 性能考虑 5. 高级正则表达式技巧 5.1 使用正则表达式进行数据清洗 5.2 使用正则表达式处理JSON 6. 正则…...
算法数组面试理论
数组是存放在连续内存空间内的相同类型数据的集合 (所以在删除添加元素的时候需要移动其他的元素的地址) 数组的元素是不能删除的,只能覆盖。(因为内存地址是连续的,所以不能删除。或者可以这么理解:在一…...
ASP.NET Zero是什么?适合哪些业务场景?
一、ASP.NET Zero是什么? ASP.NET Zero 是一个基于 ASP.NET Boilerplate (ABP) 框架的模板项目,它提供了预建的页面和强大的基础设施架构,以便开发者能够快速开发应用层。它的特点包括但不限于: 多合一解决方案:提供多…...
获取期货股票分钟级别数据以及均线策略
【数据获取】 银河金融数据库(yinhedata.com) 能够获取国内外金融股票、期货历史行情数据,包含各分钟级别。 【搭建策略】 均线策略作为一种广泛应用于股票、期货等市场的技术分析方法,凭借其简单易懂、操作性强等特点…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
