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

进程--消息队列和共享内存

目录

消息队列

创建消息队列

删除消息队列

发送消息和接收


消息队列

消息队列就是一个消息的列表,进程可以在消息队列中添加消息和的读取消息
消息队列具有FIFO的特性,具有无名管道与有名管道各自的优势,可以支持任意两个进程的进程间通讯

就可以理解为打电话时,双方专属的通道

创建消息队列

创建消息队列调用 msgget 函数。消息队列需要生成密钥,理解为创建独一的电话线

函数头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

函数原型
int msgget(key_t key, int msgflg);
函数功能
获取System V消息队列标识符
[得到消息队列标识符或创建一个消息队列对象并返回消息队列标识符]
函数参数
key:由ftok函数合成
msgflg:消息队列标志
     [0:取消息队列标识符,若不存在则函数会报错]
     IPC_CREAT 创建标志
     (如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队
列,返回此消息队列的标识符)
     [IPC_CREAT|IPC_EXCL: 如果消息队列存在,则报错, errno设置为EEXIST]
     权限控制标志
     IPC_CREAT | 0666

函数返回值
成功:返回消息队列id
失败:返回-1,并设置errno

代码:

#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define PATHNAME "."
#define PROJ_ID 106
int main()
{key_t key = ftok(PATHNAME,PROJ_ID);if(key==-1){perror("ftok");exit(EXIT_FAILURE);}int msgid = msgget(key,IPC_CREAT | 0664);if(msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msgid=%d\n",msgid);return 0;
}

删除消息队列

删除消息队列需要调用 msgctl 函数

函数原型
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

函数参数
msqid:消息队列 id
cmd:命令字
 IPC_STAT:获取消息队列属性
 IPC_SET:设置消息队列属性
 IPC_RMID:删除消息队列,用此命名时,第三个参数为NULL
buf:消息队列属性结构体对象指针

int msgid = msgget(key,IPC_CREAT | 0664);if(msgid == -1){perror("msgget");exit(EXIT_FAILURE);}printf("msgid=%d\n",msgid);// 删除消息队列int ret = msgctl(msgid,IPC_RMID,NULL);if(ret == -1){perror("msgctl");exit(EXIT_FAILURE);}printf("delete msg successful.\n");

发送消息和接收

发送消息队列需要调用 msgsnd 函数

函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

msqid:消息队列ID
 msgp:消息结构体指针
 msgsz:消息内容的长度
 msgflg:消息队列标志,默认可以填0,IPC_NOWAIT,可以设置非阻塞

// 发送消息struct msgbuf msg;struct msgbuf* p_msg=&msg;p_msg->mtype=MSG_TYPE;strcpy(p_msg->msgtext,"Hello,first msg.");int ret = msgsnd(msgid,(const void*)p_msg,strlen(p_msg-
>msgtext)+1,0);

 

接收消息调用 msgrcv 函数

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

msqid:消息队列id
 msgp:消息结构指针
 msgsz:最大读取的字节数
 msgtyp:消息类型
 msgflg:消息队列标志,默认可以填0,IPC_NOWAIT,可以设置非阻塞

//接收消息struct msgbuf msg;struct msgbuf* p_msg=&msg;ssize_t rbytes = msgrcv(msgid,(void*)p_msg,MSG_SZ,MSG_TYPE,0);

 

 共享内存

什么是共享内存

共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中,减少数据在内核空间缓存
共享内存是一种效率较高的进程间通讯的方式

在 Linux 系统中通过 ipcs -m 查看所有的共享内存

 创建共享内存

创建共享内存调用 shmget() 函数

函数原型
int shmget(key_t key, size_t size, int shmflg);
函数功能
创建一个共享内存,并返回ID
函数参数
 key:由 ftok() 函数返回
 size:共享内存的大小

shmflg:共享内存标志

#define PATH_NAME "."
#define PROJ_ID 110
#define SHM_SZ 1024
int main()
{key_t key = ftok(PATH_NAME,PROJ_ID);if(key == -1){perror("ftok");exit(EXIT_FAILURE);}int shmid = shmget(key,SHM_SZ,IPC_CREAT|0644);

共享内存的删除

删除共享内存调用shmctl函数

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

函数功能
共享内存控制函数,功能由具体的功能命令字决定

shmid:共享内存id
 cmd:控制命令字
 IPC_STAT:获取消息队列属性
 IPC_SET:设置消息队列属性
 IPC_RMID:删除消息队列属性,用此命名时,第三个参数为NULL
 buf:共享内存属性结构体指针

#define PATH_NAME "."
#define PROJ_ID 110
#define SHM_SZ 102
int main()
{
key_t key = ftok(PATH_NAME,PROJ_ID);if(key == -1){perror("ftok");exit(EXIT_FAILURE);}int shmid = shmget(key,SHM_SZ,IPC_CREAT|0644);if(shmid==-1){perror("shmget");exit(EXIT_FAILURE);}return 0;
}

共享内存映射与解除映射

共享内存映射调用shmat函数

void *shmat(int shmid, const void *shmaddr, int shmflg);

函数功能
将进程地址空间映射到共享内存上
函数参数
shmid:共享内存id
shmaddr:指定映射到进程地址空间的起始地址,指定为NULL时,由系统选择映射的地址
shmflg:共享内存标志,一般设置为0

解除共享映射调用 shmdt 函数

int shmdt(const void *shmaddr);

函数功能解除进程地址空间与共享内存的映射

函数参数

shmaddr:映射地址空间的起始地址

//共享内存映射void* addr = shmat(shmid,NULL,0);if(addr == (void*)-1){perror("shmat");exit(EXIT_FAILURE);}char buf[1024]={0};memcpy(buf,addr,10);printf("share memory content:%s\n",buf);shmdt(addr); // 解除绑定   

相关文章:

进程--消息队列和共享内存

目录 消息队列 创建消息队列 删除消息队列 发送消息和接收 消息队列 消息队列就是一个消息的列表&#xff0c;进程可以在消息队列中添加消息和的读取消息 消息队列具有FIFO的特性&#xff0c;具有无名管道与有名管道各自的优势&#xff0c;可以支持任意两个进程的进程间通讯…...

useCallback()

官网直达&#xff1a;https://zh-hans.react.dev/reference/react/useCallback 点击按钮&#xff0c;子组件会重新渲染 import { memo, useState, useCallback } from react;const Child (props) > {console.log(我是子组件&#xff01;我在渲染呢&#xff01;&#xff0…...

Python面试题精选及解析--第二篇

在Python的面试中&#xff0c;除了基础语法和常用库的知识外&#xff0c;面试官往往还会通过一系列的问题来考察应聘者的逻辑思维、问题解决能力以及项目经验。以下是一些精心挑选的Python面试题及其详细答案&#xff0c;旨在帮助求职者更好地准备面试。 面试题一&#xff1a;…...

Linux操作常用问题

目录 Ubuntu操作问题vi编辑方向键键盘乱码回退键不能使用的问题解决问题的方法 Ubuntu操作问题 vi编辑方向键键盘乱码回退键不能使用的问题 编辑/etc/systemd/resolved.conf文件来修改DNS&#xff0c;结果编辑时键盘乱码&#xff0c;按下方向键会出现ABCD&#xff0c;且回退键…...

汽车发动机系统(ems)详细解析

汽车发动机系统EMS&#xff0c;即Engine-Management-System&#xff08;发动机管理系统&#xff09;&#xff0c;是现代汽车电子控制技术的重要组成部分。以下是对汽车发动机系统EMS的详细解析&#xff0c;内容将涵盖其定义、工作原理、主要组成、功能特点、技术发展以及市场应…...

对比学习训练是如何进行的

对比学习&#xff08;Contrastive Learning&#xff09;是一种自监督学习的方法&#xff0c;旨在通过拉近相似样本的表示、拉远不相似样本的表示来学习特征表示。在训练过程中&#xff0c;模型并不依赖标签&#xff0c;而是通过样本之间的相似性进行学习。以下是对比学习的基本…...

React 生命周期 - useEffect 介绍

在 React 中&#xff0c;useEffect 钩子可以被看作是函数组件中的一种副作用管理工具&#xff0c;它的行为可以模拟类组件中的不同生命周期方法。useEffect 的执行时机取决于其依赖项数组&#xff08;第二个参数&#xff09;的设置方式。 根据 useEffect 的使用方式&#xff0c…...

OpenCV-指纹识别

文章目录 一、意义二、代码实现1.计算匹配点2.获取编号3.获取姓名4.主函数 三、总结 一、意义 使用OpenCV进行指纹识别是一个复杂且挑战性的任务&#xff0c;因为指纹识别通常需要高精度的特征提取和匹配算法。虽然OpenCV提供了多种图像处理和计算机视觉的工具&#xff0c;但直…...

IPD的核心思想

IPD是一套领先的、成熟的研发管理思想、模式和方法。它是根据大量成功的研发管理实践总结出来的&#xff0c;并被大量实践证明的高效的产品研发模式。 那么&#xff0c;按照IPD来开展产品研发与产品管理工作&#xff0c;应该基于哪些基本思想或原则&#xff1f;市场导向、客户…...

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…...

常用的Java安全框架

Spring Security&#xff1a; 就像Java安全领域的“瑞士军刀”&#xff0c;功能全面且强大。 支持认证、授权、加密、会话管理等安全功能。 与Spring框架无缝集成&#xff0c;使用起来特别方便。 社区活跃&#xff0c;文档丰富&#xff0c;遇到问题容易找到解决方案。 Apach…...

使用 PHP 的 strip_tags函数保护您的应用安全

在现代 web 开发中&#xff0c;处理用户输入是一项常见的任务。然而&#xff0c;用户输入的内容往往包含 HTML 或 PHP 标签&#xff0c;这可能会导致安全漏洞&#xff0c;如跨站脚本攻击&#xff08;XSS&#xff09;。为了解决这个问题&#xff0c;PHP 提供了一个非常有用的函数…...

您的计算机已被Lockbit3.0勒索病毒感染?恢复您的数据的方法在这里!

导言 在数字化时代&#xff0c;互联网已成为我们生活、工作和学习中不可或缺的一部分。然而&#xff0c;随着网络技术的飞速发展&#xff0c;网络安全威胁也日益严峻。其中&#xff0c;勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;正逐渐成为企业和个人面临的重大挑…...

经典sql题(十二)UDTF之Explode炸裂函数

1. EXPLODE: UDTF 函数 1.1 功能说明 EXPLODE 函数 是Hive 中的一种用户定义的表函数&#xff08;UDTF&#xff09;&#xff0c;用于将数组或映射结构中的复杂的数据结构每个元素拆分为单独的行。这在处理复杂数据时非常有用&#xff0c;尤其是在需要将嵌套数据“打散”以便更…...

【AIGC】ChatGPT提示词解析:如何打造个人IP、CSDN爆款技术文案与高效教案设计

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;打造个人IP爆款文案提示词使用方法 &#x1f4af;CSDN爆款技术文案提示词使用方法 &#x1f4af;高效教案设计提示词使用方法 &#x1f4af;小结 &#x1f4af;前言 在这…...

【Ubuntu】Ubuntu常用命令

文章目录 网卡路由常用命令&#xff1a;编辑文件echo 权限设置gcc编译器&#xff1a; 重启网络服务 sudo service network-manager restart 网卡 #查看网卡信息 ip a #区分光网卡电网卡 sudo lshw -class network -businfo ifconfig ifconfig eth1 192.168.1.12/24 #重启网卡…...

架构设计笔记-5-软件工程基础知识-2

知识要点 构件组装是将库中的构件经适当修改后相互连接,或者将它们与当前开发项目中的软件元素连接,最终构成新的目标软件。 构件组装技术大体可分为: 1. 基于功能的组装技术:基于功能的组装技术采用子程序调用和参数传递的方式将构件组装起来。它要求库中的构件以子程序…...

[网络]抓包工具介绍 tcpdump

一、tcpdump tcpdump是一款基于命令行的网络抓包工具&#xff0c;可以捕获并分析传输到和从网络接口流入和流出的数据包。 1.1 安装 tcpdump 通常已经预装在大多数 Linux 发行版中。如果没有安装&#xff0c;可以使用包管理器 进行安装。例如 Ubuntu&#xff0c;可以使用以下…...

基于STM32和FPGA的射频数据采集系统设计流程

一、项目概述 高速采集射频&#xff08;RF&#xff09;信号是一个关键的需求。本文旨在设计一种基于STM32和FPGA的射频数据采集系统&#xff0c;以实现对接收到的射频信号的高精度和高速度的处理。该系统适用于无线通信、信号分析、雷达系统等应用场景。 技术栈关键词&#x…...

自动变速箱系统(A/T)详细解析

自动变速箱系统&#xff08;A/T&#xff09;&#xff0c;即Automatic Transmission&#xff0c;是一种能够在车辆行驶过程中自动完成换挡操作的传动系统。以下是对自动变速箱系统&#xff08;A/T&#xff09;的详细解析&#xff0c;内容涵盖其定义、工作原理、主要组成、类型、…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...