进程间的通信 2 消息队列

system V IPC

在这里插入图片描述
IPC : Inter-Process Communication (进程间通讯)
System V IPC 对象共有三种:

  • 消息队列
  • 共享内存
  • 信号量

System V IPC 是由内核维护的若干个对象,通过ipcs命名查询
在这里插入图片描述

  • 每个 IPC 对象都有一个唯一的 ID,可以通过ftok()函数生成

1.重点!重点!重点 ftok函数:

1.函数头文件
#include<sys/types.h>
#include<sys/ipc.h>
2.函数原型
key_tftok(const char*pathname,int proj_id);
3.函数参数
pathname:路径名(文件的inode节点号)//随便取,但必须要是文件存在
proj_id: 8bit的proj_id整数//随便取,但最好取128以内数字
4.函数返回值
成功:返回合成的key
失败:-1,并设置errno

在这里插入图片描述

2.消息队列:

2. 1消息队列的简介

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

在这里插入图片描述

消息队列是属于 Sytem V IPC 的一种,由内核维护与管理,通过 ipcs -q 查看

2.2 创建消息队列:

创建消息队列是时调用msgget 函数

1.函数头文件
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
2.函数原型
int msgget(key_t key,int msgflg);
3.函数参数
key:由ftok函数合成
msgflg:消息队列标志IPC_CREAT创建标志IPC_EXCL(权限控制标志) 如果消息队列存在,则报错,errno设置为EEXIST
4.函数返回值
成功:返回消息队列id
失败:返回-1,并设置errno

注意!注意! 注意! 创建消息队列用的最多的方式是

int ret = msgget(key, 0644 | IPC_CREAT);
//这是创建消息队列最常见的格式 0644代表权限,key代表键值;

2.3 发送消息和接受消息函数

发送消息函数 msgsnd

1.函数头文件
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
2.函数原型
int msgsnd(int msqid,const void* msgp,size_t msgsz,int msgflg);
3.函数参数:msqid:消息队列IDmsgp:消息结构体指针msgsz:消息内容的长度msgflg:消息队列标志,默认可以填0,IPC_NOWAIT,可以设置非阻塞//最常用的是0
4.函数返回值
成功:返回0
失败:-1,并设置errno

接收消息函数 msgrcv :

1.函数头文件
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
2.函数原型
ssize_t msgrcv(int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg);
3.函数参数
msqid:消息队列id
msgp:消息结构指针
msgsz:最大读取的字节数
msgtyp:消息类型
msgflg:消息队列标志,默认可以填0,IPC_NOWAIT,可以设置非阻塞
4.函数返回值:
成功:返回实际读取消息内容的字节数
失败:-1,并设置errno

2.4 删除消息队列函数

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

1.函数头文件
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
2.函数原型
int msgctl(int msqid,int cmd,struct msqid_ds*buf);
3.函数参数:
msqid:消息队列id 
cmd:命令字IPC_STAT:获取消息队列属性IPC_SET:设置消息队列属性IPC_RMID:删除消息队列,用此命名时,第三个参数为NULL 
buf:消息队列属性结构体对象指针
函数返回值
成功:IPC_STAT,IPC_SET,and IPC_RMID 返回0 
失败:返回-1,并设置errno

重点 !重点 !重点!:
删除消息队列的固定格式是:

int ret = msgctl(msqid,IPC_RMID,NULL)//msqid 为消息队列编号,
//这是删除消息队列固定格式

2.5 测试实例(cpp代码):

using namespace std;
#include <iostream>
#include <string.h> 
#include <cstdlib>
#include <string>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <strings.h>
#define PATH  "/mnt/hgfs"
#define PRO_ID 78
#define SIZE 128
#define MTYPE1 10
#define MTYPE2 20
//此题目标,创造两个子进程,并用父进程给他们发消息
typedef struct msg{long mtype;char mtext[SIZE];
}MSGBUF;
int main(){key_t key = ftok(PATH,PRO_ID);if(key == -1){cout << "create key fail" << endl;exit(EXIT_FAILURE); }pid_t pid1 = fork();if(pid1 == -1){cout << "create pid1 failed"  << endl;exit(EXIT_FAILURE);}else if(pid1 == 0){sleep(2);int rmisgid1 = msgget(key,IPC_CREAT | 0644);if(rmisgid1 == -1){cout << "rmisgid1 failed" << endl;exit(EXIT_FAILURE); }MSGBUF sbuf1;//清空sbuf1里的东西bzero(&sbuf1,sizeof(sbuf1));ssize_t rtypes = msgrcv(rmisgid1,&sbuf1,SIZE,MTYPE1,0);if(rtypes == -1){cout << "rtypes false"<< endl;exit(EXIT_FAILURE); }cout << "rmisgid1接受到的消息是:"; printf("%s\n",sbuf1.mtext); }else if(pid1 > 0){pid_t pid2 = fork();if(pid2 == -1){cout << "create pid2 failed" << endl;exit(EXIT_FAILURE);}else if(pid2 == 0){sleep(2);int rmisgid2 = msgget(key,IPC_CREAT | 0644);if(rmisgid2 == -1){cout << "rmisgid2 failed" << endl;exit(EXIT_FAILURE);}MSGBUF sbuf2;//清空sbuf1里的东西bzero(&sbuf2,sizeof(sbuf2));ssize_t rtypes = msgrcv(rmisgid2,&sbuf2,SIZE,MTYPE2,0);if(rtypes == -1){cout << "rtypes false"<< endl;exit(EXIT_FAILURE); }cout << "rmisgid2接受到的消息是:"; printf("%s\n",sbuf2.mtext); }else{int msgid = msgget(key,IPC_CREAT | 0644);//创建结构体buf1MSGBUF buf1;buf1.mtype = MTYPE1;strcpy(buf1.mtext,"hellow world");int ret = msgsnd(msgid,&buf1,SIZE,0);if(ret == -1){cout << "msgsnd failed" << endl;exit(EXIT_FAILURE);}//创建结构体buf2MSGBUF buf2;buf2.mtype = MTYPE2;strcpy(buf2.mtext,"hellow c++");int ret1 = msgsnd(msgid,&buf2,SIZE,0);if(ret1 == -1){cout << "msgsnd1 failed" << endl;exit(EXIT_FAILURE); }int figure = 0;waitpid(-1,NULL,0);waitpid(-1,NULL,0);}} return 0;
}

示例图片:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540394.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用SoapUI、Postman工具调用Webservice方法

SoapUI工具更适合调用Webservice使用。 1.使用SoapUI工具调用Webservice 创建“New SOAP Project” 自行定义一个项目名称&#xff0c;输入wsdl地址&#xff1a; 在左侧列表找到方法名&#xff0c;双击“Request 1”, 在请求数据中&#xff0c;添加对应的参数&#xff0c;然…

Linux--禁止root用户通过ssh直接登录

原文网址&#xff1a;Linux--禁止root用户通过ssh直接登录_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Linux服务器怎样禁止root用户通过ssh直接登录。 为什么要禁止&#xff1f; 因为root用户是每个Linux系统都有的&#xff0c;黑客可以使用root用户名尝试不同的密码来暴力破…

【笔记】自动驾驶预测与决策规划_Part3_路径与轨迹规划

文章目录 0. 前言1. 基于搜索的路径规划1.1 A* 算法1.2 Hybrid A* 算法 2. 基于采样的路径规划2.1 Frent Frame方法2.2 Cartesian →Frent 1D ( x , y ) (x, y) (x,y) —> ( s , l ) (s, l) (s,l)2.3 Cartesian →Frent 3D2.4 贝尔曼Bellman最优性原理2.5 高速轨迹采样——…

ETHERCAT转PROFIENT网关—迅捷伺服驱动器数据交互

在当前的生产现场中&#xff0c;PLC 控制器与迅捷伺服驱动器之间通过通讯方式进行连接的情况愈发频繁。有些现场中&#xff0c;控制器和伺服驱动器采用统一的通讯协议&#xff0c;然而在另一些现场&#xff0c;会出现伺服驱动器 站使用不同协议的情况&#xff0c;这主要是由于不…

小阿轩yx-通过state模块定义主机状态

小阿轩yx-通过state模块定义主机状态 前言 前面学习了远程执行模块&#xff0c;这些模块的执行类似语段 shell 脚本&#xff0c;每次执行都会触发一次相同的功能&#xff0c;在大量的 minion 上运行远程命令当然是重要的&#xff0c;但是对于 minion 的环境控制&#xff0c;使…

利用 ARMxy边缘计算网关和 BLiotlink 软网关,实现工业智能化升级

在当今数字化、智能化的时代浪潮中&#xff0c;工业领域也在不断寻求创新与突破&#xff0c;以提高生产效率、降低成本并提升竞争力。ARM 工业计算机与 BLiotlink 协议转换软件的结合&#xff0c;为工业智能化带来了新的机遇和解决方案。 一、ARM 工业计算机的优势 ARM 工业计…

怎么找到抖音爆款内容,进行扩散传播?

企业如果想做好抖音平台的品牌营销&#xff0c;需要时刻监测抖音爆款内容并进行加热放大&#xff0c;据此快速创新和改进内容&#xff0c;才能短期提高品牌相关内容的曝光量&#xff0c;快速拉升品牌声量。怎么去找到抖音的爆款内容或者是值得品牌关注的优质内容&#xff0c;主…

Active Directory 实验室设置第一部分- AD林安装

在之前的文章中&#xff0c;已经讨论了活动目录的基本知识。在这篇文章中&#xff0c;我们将讨论如何设置和配置环境&#xff0c;以便我们可以使用它来执行各种攻击方案和检测。我们将讨论如何通过GUI和CLI方式完成。 # 1、Active Directory 设置 让我们从活动目录实验室设置…

统计项目代码行数工具—cloc

目录 引言一、cloc简介二、cloc安装三、cloc使用四、参考博客 引言 项目开发完成&#xff0c;想要查看自己项目的代码行数&#xff0c;强烈推荐一款非常好用的命令行工具-cloc。 一、cloc简介 只需要通过命令行的方式运行cloc&#xff0c;就可以得知指定文件代码行数、注释函…

AI大模型之旅-langchain结合glm4,faiss构建本地知识库

所需依赖如下&#xff1a; _libgcc_mutex0.1main _openmp_mutex5.11_gnu accelerate0.34.2pypi_0 aiofiles23.2.1pypi_0 aiohappyeyeballs2.4.0pypi_0 aiohttp3.10.5pypi_0 aiosignal1.3.1pypi_0 annotated-types0.7.0pypi_0 anyio4.4.0pypi_0 attrs24.2.0pypi_0 bitsandbytes…

Leetcode面试经典150题-172.阶乘后的零

给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0示例 2&#xff1a; 输入&#xff1a;n 5 输出&a…

线程池总结

线程池的执行流程总结&#xff1a; 从创建线程池的参数分析&#xff1a; 1.提交新线程&#xff0c;线程池会在线程池中分配一个空闲线程&#xff0c;用于执行线程任务。 2.参数(int corePoolSize)&#xff1a;核心线程数 如果线程池中不存在空闲线程&#xff0c;则线程池会判…

ADB 安装教程:如何在 Windows、macOS 和 Linux 上安装 Android Debug Bridge

目录 一、ADB 介绍 二、Windows 系统安装 ADB 1. 下载 ADB 2. 解压文件 3. 验证 ADB 安装 4. 配置环境变量 5. 验证全局 ADB 使用 三、macOS 系统安装 ADB 1. 下载 ADB 2. 解压文件 3. 配置环境变量 4. 验证 ADB 安装 四、Linux 系统安装 ADB 1. 使用包管理器安装…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第二篇-着色器制作】

在上一篇文章中&#xff0c;我们已经理顺了实现流程。 接下来&#xff0c;我们将在UE5中&#xff0c;从头开始一步一步地构建一次流程。 通过这种方法&#xff0c;我们可以借助一个熟悉的开发环境&#xff0c;使那些对着色器不太熟悉的朋友们更好地理解着色器的工作原理。 这篇…

MySQL 主从复制部署与优化

文章目录 前言 在现代数据库管理中&#xff0c;MySQL 主从复制是一种关键技术&#xff0c;用于提高数据的可用性和性能。随着 Docker 容器技术的普及&#xff0c;利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势&#xff0c;它提供了一种简便、高效且可扩展的解决方案。本…

LED 生产电子看板实现工厂精准管理

在当今竞争激烈的制造业领域&#xff0c;工厂的管理效率和精度直接关系到企业的生存与发展。而 LED 生产电子看板的出现&#xff0c;为工厂实现精准管理带来了全新的解决方案。 一、电子看板能够实现对生产进度的精准把控 在传统的工厂管理中&#xff0c;生产进度的了解往往依…

协同编程的艺术:SIDE 让团队协作更上一层楼

一、协同编程的现状 在当前软件开发中&#xff0c;团队协作面临着诸多挑战。沟通不畅常常导致项目进度延迟&#xff0c;版本控制复杂使得代码合并困难重重。传统 IDE 在协同工作方面存在明显的局限性&#xff0c;缺乏实时协作功能&#xff0c;团队成员之间的沟通工具也不够完善…

个人小结(2.0)

离谱&#xff0c;困扰着几周的问题今天偶然发现了解决方法。 问题如下&#xff1a;就是对应的模块引入爆红&#xff0c;但是单击进入引入的文件没有问题 然后它的提示是&#xff1a; 无法找到模块“../views/screen/index.vue”的声明文件。“c:/Users/10834/Desktop/0716_pro…

班主任群发成绩教程,宝藏工具来减负

今天想和大家聊聊班主任的那些事儿。当班主任可真不是一件轻松的工作啊。要备课吧&#xff0c;得精心设计每一个教学环节&#xff0c;从教学目标到教学方法&#xff0c;从课程导入到课后作业&#xff0c;每个细节都得考虑周全。 还要管理班级纪律&#xff0c;处理同学之间的小摩…

2024年NAS个人存储完美方案(最牛方案不服来战)

成果展示 背面展示 正面展示 为什么需要nas 速度优势:使用公共云盘,速度完全依赖公网传输速度。比如家庭300Mbps宽带,使用百度网盘SVip,上传2.5MB/s,下载30MB/s。而使用家用nas,速度完全取决路由器内网性能,基本上达到千兆或2.5GE。内容优势:向公共云盘上传的文件全…