进程间的通信 2 消息队列

news2024/9/21 1:07:22

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:消息队列ID
	msgp:消息结构体指针
	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);
			//创建结构体buf1
			MSGBUF 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);
			}
			//创建结构体buf2
			MSGBUF 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.coloradmin.cn/o/2150688.html

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

相关文章

re题(36)BUUCTF-[WUSTCTF2020]Cr0ssfun

BUUCTF在线评测 (buuoj.cn) 查一下壳&#xff0c;64位elf文件 ctrle找到main()函数 只进行了一个比较函数&#xff0c;看一下check() 猜测是a1中存放的flag&#xff0c;往下继续查看函数 把a1中存的数据都给出来了 写个脚本&#xff0c;输出一下a1&#xff0c;直接就是我们要的…

通过MCGS在ARMxy边缘计算网关上实现物流自动化

随着电子商务和智能制造的快速发展&#xff0c;物流行业面临着前所未有的挑战与机遇。高效的物流系统不仅可以加快货物周转速度&#xff0c;降低运营成本&#xff0c;还能显著提升客户满意度。 1. ARMxy BL340系列简介 ARMxy BL340系列是针对工业自动化领域设计的一款高性能、…

虚拟机的ip总是自己变化如何解决?

目录 修改配置文件&#xff1a; 如果出现错误E212&#xff1a;无法打开并写入文件&#xff1a; 如果显示当前用户没有在sudoers文件中&#xff0c;就按照下面方法操作。 修改配置文件&#xff1a; 变化的原因&#xff1a;在配置文件/etc/sysconfig/network-scripts/ifcfg-e…

Docker 里面按照ifconfig

1. 进入Docker 容器内部 docker exec -it xxx bash2. 安装 net-tools iputils-ping apt-get update && apt-get install -y net-tools apt-get update && apt-get install -y iputils-ping 3. 执行ifconfig 执行ping

如日中天的AI大模型,也到了发展幻灭期!

近期 Gartner发布了《新兴技术成熟度曲线》&#xff0c;其中生成式 AI &#xff08;GenAI&#xff09; 正式进入到了幻灭期。 2018 年 6 月&#xff0c;OpenAI发布GPT-1模型&#xff0c;生成式AI开始向产品化发展。 到2022年的GPT-3.5发布&#xff0c;并且ChatGPT首次向公众推…

单链表(c语言简单实现)

单链表是一种常见的数据结构 一、结构特点 1. 由一系列节点组成&#xff0c;每个节点包含数据域和指向下一个节点的指针域。 2. 最后一个节点的指针域为 null&#xff0c;表示链表的结尾。 二、主要操作 1. 插入节点&#xff1a;可以在链表的头部、尾部或特定位置插入新节点。…

IPD流程体系:IPD在硬件产品开发中的应用

目录 1、内容简介 2、开发各阶段介绍 3、PVT阶段 4、资源群更新 作者简介 1、内容简介 在硬件类相关产品的开发过程中&#xff0c; 每个阶段的工作都是需要按照一定的流程、规范和标准去进行的。 整体还是相对瀑布化的流程&#xff0c; 每个阶段的输入、输出、准入、准…

不可思议的效率飞跃:RPA如何重塑你的工作流程,释放人力潜能!

RPA简介 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种模拟人类用户操作的软件技术&#xff0c;它通过自动化执行重复性、规律性强的任务来提高工作效率和准确性。RPA软件机器人可以模拟鼠标点击、键盘输入、数据复制粘贴等操…

使用 Bedrock 模型进行 SQL 查询生成:高效自动化的全新体验!

引言 在当今高度重视可持续发展的时代&#xff0c;亚马逊通过其 Bedrock 模型&#xff0c;展示了公司在运营和增长方面的战略愿景。同时&#xff0c;Amazon SageMaker 为机器学习领域的专业人士提供了强大的工具&#xff0c;加速了模型的开发和部署。 探索亚马逊的 Bedrock 模…

【数据结构】什么是二叉搜索(排序)树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;二叉搜索(排序)树的概念 &#x1f4cc;二叉搜索(排序)树的操作 &#x1f38f;二叉搜索树的查找 &#x1f38f;二叉搜索树的插入 &#x1f38f;二叉搜索树的…

如何选择OS--Linux不同Distribution的选用

写在前言&#xff1a; 刚写了Windows PC的不同editions的选用&#xff0c;趁热&#xff0c;把Linux不同的Distribution选用也介绍下&#xff0c;希望童鞋们可以了解-->理解-->深入了解-->深入理解--...以致于能掌握特定版本的Linux的使用甚者精通。……^.^…… so&a…

【刷题日记】15. 三数之和

15. 三数之和 两数之和可以用巧思也可以用map 三数之和会更加复杂一点&#xff0c;且这道题还需要考虑避免重复答案&#xff01; 思路&#xff1a; 特判&#xff1a;检如果nums 为 null 或长度小于 3直接返回空数组。排序&#xff1a;使用 sort对数组进行升序排序。就变成了…

OpenAI GPT o1技术报告阅读(4)- 填字游戏推理

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个填字游戏的案例。 我们先看下问题&#xff1a; 解决以下填字游戏&#xff1a; Across&#xff08;横向&#xff09…

Vue3中el-table组件实现分页,多选以及回显

el-table组件实现分页&#xff0c;多选以及回显 需求思路1、实现分页多选并保存上一页的选择2、记录当前选择的数据3、默认数据的回显 完整代码 需求 使用 dialog 显示 table&#xff0c;同时关闭时销毁el-table 表格多选回显已选择的表格数据&#xff0c;分页来回切换依然正确…

【手把手】Windows上安装Python,小白必看

🔗【下载Python】 打开浏览器,访问Python的官方网站: python下载地址 选择适合你系统的Python版本下载。建议下载最新的稳定版。 🔧【安装步骤】 双击下载的安装包,开始安装。 选择“Add Python to PATH”,这样可以让系统知道Python的位置。 点击“Install Now”,…

Java 内存模型(JMM)

JMM&#xff0c;全称 Java Memory Model &#xff0c;中⽂释义Java内存模型 1. 概述 对于 Java 程序员来说&#xff0c;在虚拟机⾃动内存管理机制下&#xff0c;不再需要像 C/C 程序开发程序员这 样为每⼀个 new 操作去写对应的 delete / free 操作&#xff0c;不容易出现内存…

使用Locust进行接口性能测试:关联与参数化技巧分析

Locust是一款开源的Python性能测试工具&#xff0c;它可以模拟大量并发用户对网站或者其他接口进行压力测试 1. 关联&#xff1a;精确模拟用户操作 在某些场景下&#xff0c;我们需要将之前请求的响应参数关联到后续请求中&#xff0c;以模拟用户操作。这在会话管理&#xff…

2024年中国电子学会青少年软件编程(Python)等级考试(一级)核心考点速查卡

考前练习&#xff1a; 2024年06月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09;答案 解析-CSDN博客 2024年03月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09;答…

MySQL 中的 UTF-8 与 UTF8MB4:差异解析

在 MySQL 数据库中&#xff0c;字符集的选择对于数据的存储和处理至关重要。其中&#xff0c;UTF-8 和 UTF8MB4 是两个常见的字符集选项。那么&#xff0c;它们之间到底有什么区别呢&#xff1f; 一、字符集简介 UTF-8 UTF-8&#xff08;8-bit Unicode Transformation Format&…

文献阅读(81)FACT

题目&#xff1a;FACT: FFN-Attention Co-optimized Transformer Architecture with Eager Correlation Prediction时间&#xff1a;2023会议&#xff1a;ISCA研究机构&#xff1a;清华 主要贡献 算法优化&#xff1a;提出了Eager Prediction (EP)&#xff0c;预测softmax前重…