关于消息队列,共享内存相关作业

news2024/11/25 6:57:30

1>使用消息队列完成两个进程之间相互通信

1.c

#include<myhead.h>
//消息类型
struct msgbuf
{
	long mtype; //消息类型
	char mtext[1024];//消息数据
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
	//创建一个进程
	 pid_t pid=fork();
	if(pid<0)
	{
		perror("fork error");
		return -1;
	}
	else if(pid==0)
	{
		//创建钥匙
		key_t key1=ftok("/",'k');
		if(key1==-1)
		{
			perror("ftok error");
			return -1;
		}
		//创建对象
		int msqid=msgget(key1,IPC_CREAT|0664);
		if(msqid==-1)
		{
			perror("msgget error");
			return -1;
		}
		//存放消息
		struct msgbuf buf1;
		while(1)
		{
			printf("请输入消息类型>>>");
			scanf("%ld",&buf1.mtype);
			getchar();
			printf("请输入消息正文:>>>");
			fgets(buf1.mtext,SIZE,stdin);
			buf1.mtext[strlen(buf1.mtext)-1]=0;
			msgsnd(msqid,&buf1,SIZE,0);
			//判读存放的消息
			if(strcmp(buf1.mtext,"quit")==0)
			{
				break;
			}
		}
		//退出进程
		exit(EXIT_SUCCESS);
	}
	//创建钥匙
	key_t key2=ftok("/",'e');
	if(key2==-1)
	{
		perror("ftok error");
		return -1;
	}
	//创建对象
	int msqid=msgget(key2,IPC_CREAT|0664);
	if(msqid==-1)
	{
		perror("msgget error");
		return -1;
	}
	//从消息队列中读取数据
	struct msgbuf buf2;
	while(1)
	{
		msgrcv(msqid,&buf2,SIZE,0,0);
		printf("收到的消息为:%s\n",buf2.mtext);
		if(strcmp(buf2.mtext,"quit")==0)
		{
			break;
		}
	}
	//删除消息队列
	if(msgctl(msqid,IPC_RMID,NULL)==-1)
	{
		perror("msgctl error");
		return -1;
	}
	//回收子进程资源
	wait(NULL);
	return 0;
}

2.c

#include<myhead.h>
//消息类型
struct msgbuf
{
	long mtype; //消息类型
	char mtext[1024];//消息数据
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
	//创建一个进程
	 pid_t pid=fork();
	if(pid<0)
	{
		perror("fork error");
		return -1;
	}
	else if(pid==0)
	{
		//创建钥匙
		key_t key1=ftok("/",'k');
		if(key1==-1)
		{
			perror("ftok error");
			return -1;
		}
		//创建对象
		int msqid=msgget(key1,IPC_CREAT|0664);
		if(msqid==-1)
		{
			perror("msgget error");
			return -1;
		}	//从消息队列中读取数据
		struct msgbuf buf2;
		while(1)
		{
			msgrcv(msqid,&buf2,SIZE,0,0);
			printf("收到的消息为:%s\n",buf2.mtext);
			if(strcmp(buf2.mtext,"quit")==0)
			{
				break;
			}
		}
		//删除消息队列
		if(msgctl(msqid,IPC_RMID,NULL)==-1)
		{
			perror("msgctl error");
			return -1;
		}
		//退出进程
		exit(EXIT_SUCCESS);
	}
	//创建钥匙
	key_t key2=ftok("/",'e');
	if(key2==-1)
	{
		perror("ftok error");
		return -1;
	}
	//创建对象
	int msqid=msgget(key2,IPC_CREAT|0664);
	if(msqid==-1)
	{
		perror("msgget error");
		return -1;
	}
	//存放消息
	struct msgbuf buf1;
	while(1)
	{
		printf("请输入消息类型>>>");
		scanf("%ld",&buf1.mtype);
		getchar();
		printf("请输入消息正文:>>>");
		fgets(buf1.mtext,SIZE,stdin);
		buf1.mtext[strlen(buf1.mtext)-1]=0;
		msgsnd(msqid,&buf1,SIZE,0);
		//判读存放的消息
		if(strcmp(buf1.mtext,"quit")==0)
		{
			break;
		}
	}
	//回收子进程资源
	wait(NULL);
	return 0;
}

2>将共享内存的实现重新敲一遍

发送端

#include<myhead.h>

int main(int argc, const char *argv[])
{
	//创建k值用于共享内存段
	key_t key=ftok("/",'t');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	printf("key=%d\n",key);
	//创建对象
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid=%d\n",shmid);
	//共享内存的映射
	char *addr=(char *)shmat(shmid,NULL,0);
	printf("输出映射的地址%p\n",addr);
	//向共享内容中写入数据
	strcpy(addr,"lalalalala\n");
	sleep(5);
	//取消映射关系
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
		return -1;
	}
	while(1);
	return 0;
}

接收端

#include<myhead.h>

int main(int argc, const char *argv[])
{
	//创建k值用于共享内存段
	key_t key=ftok("/",'t');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	printf("key=%d\n",key);
	//创建对象
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid=%d\n",shmid);
	//共享内存的映射
	char *addr=(char *)shmat(shmid,NULL,0);
	printf("输出映射的地址%p\n",addr);
	//读取共享内存中的数据
	printf("消息为:%s",addr);
	sleep(5);
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
		return -1;
	}
	//删除共享内存
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error");
		return -1;
	}
	while(1)

	return 0;
}

思维导图

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

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

相关文章

虚拟机能访问网页但ping不通百度

最近遇到了奇怪的问题&#xff0c;虚拟机能访问网页&#xff0c;但ping不通百度&#xff0c;记录一下问题的排查过程。 能访问网页&#xff0c;说明DNS、TCP和HTTP没有问题&#xff0c;ping不通&#xff0c;说明ICMP应该出了问题。 首先通过traceroute追踪报文的转发过程&…

算法板子:最短路问题——包含朴素Dijkstra算法、堆优化版的Dijkstra算法、SPFA算法、Floyd算法

目录 1. 几种算法的用途2. Dijkstra算法——求源点到其他所有点的最短路径(不能处理负边权)&#xff08;1&#xff09;朴素Dijkstra算法——适用于稠密图&#xff08;2&#xff09;堆优化版的Dijkstra算法——适用于稀疏图 4. SPFA算法——求源点到其他所有点的最短路径、判断是…

孤独行走的视频素材去哪里找?孤独的人的视频素材哪里找啊

在视频创作和情感表达的项目中&#xff0c;选择合适的孤独行走视频素材尤为重要&#xff0c;因为这种素材能够有效传递人物的情绪状态&#xff0c;增强作品的情感层次。下面将介绍几个优质的视频素材平台&#xff0c;以帮助您更方便地寻找到适合表达孤独与深思的高质量视频素材…

C#基础——泛型

泛型 C# 中的泛型是一种强大的编程特性&#xff0c;它允许你编写类型安全且灵活的代码。泛型允许你定义类、结构体、接口、方法和委托&#xff0c;而不必在编译时指定具体的数据类型。相反&#xff0c;你可以使用类型参数来定义泛型类型或方法&#xff0c;然后在使用时指定具体…

免费的SD-WAN服务

SD-WAN&#xff0c;SASE&#xff0c;零信任是近年来比较火的概念&#xff0c;SD-WAN发展已经很久了&#xff0c;但是真正能够自主研发做SD-WAN的企业其实并不算太多。 比扬云的SD-WAN产品是自主研发的&#xff0c;可控性强&#xff0c;最重要的是具有免费版本&#xff0c;可以免…

C#使用NPOI进行Excel和Word文件处理(二)

文章目录 使用NPOI在C#中处理Excel和Word文件1. 什么是NPOI&#xff1f;2. 安装NPOI2.1 VisualStudio2019引入NPOI 3. 处理Excel文件读取Excel文件写入Excel文件 4. 处理Word文件读取Word文件写入Word文件 总结Github 地址链接参考例子 使用NPOI在C#中处理Excel和Word文件 在C…

软件生命周期(二)

1. 软件生命周期定义 软件生命周期&#xff08;SDLC&#xff09;是软件开始研制到最终废弃不用所经历的各个阶段 – 软件开发模型 2. 瀑布型生命周期模型 瀑布模型规定自上而下&#xff0c;相互衔接的固定次序&#xff0c;如同瀑布流水&#xff0c;逐级下落&#xff0c;具有…

探索全光网技术 | 全光网络技术方案选型建议三(医院场景)

目录 一、场景设计需求二、医院场景拓扑三、部署方式四、产品相关规格说明五、方案优势与特点 注&#xff1a;本文章参考资料为&#xff1a;华三官方资料 - “新华三全光网络3.0解决方案&#xff08;教育&#xff09;”与 锐捷官方资料 - “【锐捷】高校极简以太全光3.X方案设计…

c++ + linux+cmake编译动态库+so调用

步骤如下&#xff1a; 1. 创建动态库2. 编译动态库3. 使用动态库4. 编译程序并链接动态库5. 运行程序 1. 创建动态库 // hello.cpp #include <iostream> #include <string> using namespace std; int hello(string a) {cout << "hello "<< …

树状数组基础知识以及相关习题

文章目录 什么是树状数组&#xff1f;如何理解树状数组如何理解精髓lowbit二叉树和树状数组的结构树状数组的优点树状数组模板单点修改&#xff0c;区间查询区间修改&#xff0c;单点查询区间修改&#xff0c;区间查询树状数组法线段树法 树状数组基础练习题逆序对动态求连续区…

C语言进阶版第六课—操作符

文章目录 1. 操作符的分类2. 原码、反码、补码3. 移位操作符4. 位操作符4.1 位操作符详解4.2 练习4.2.1 不能创建临时变量&#xff0c;实现两个整数的交换4.2.2 求一个整数存储在内存中的二进制1的个数4.2.3 判断一个数是不是2的次方数4.2.4 将二进制第n位置0或置1 5. 逗号表达…

git拉代码

第一步 第二步 第三步

Mysql原理与调优-InnoDB页结构

目录 1.绪论 2.Mysql的数据页组成 2.1 基本组成 2.1 文件头 2.2 页头部&#xff08;Page Header&#xff09; 3.3 infimum supremum 3.4 用户记录 和 空闲空间 3.4.1 用户插入数据步骤 3.4.2 删除数据 3.5 页目录 3.5.1 插入时维护槽的步骤 3.5.2 查询元素的步骤 …

为之“毫厘”、追之“千里”,“仅退款”的存废之争

文丨郭梦仪 橘子&#xff08;化名&#xff09;看到了待审核的起诉书&#xff0c;气不打一处来。这次白嫖行为橘子不打算再忍了。 橘子是拼多多商家&#xff0c;经营化妆品公司&#xff0c;5月份&#xff0c;一个顾客收到货4天说用了过敏&#xff0c;直接退款没有退回产品。橘…

Project Euler_Problem 587_Concave Triangle (背包问题)

原问题&#xff1a; 代码&#xff1a; void solve() {ll i, j, k, p, q, u, v, l, r, x, y, z, z1;z 0;double a, b, c;N 1e9;n 250250;p 1e16;z 250;for (i 1; i < n; i) {C[i] M.NT.prime_pow(i, i, z);}A[0] 1;for (i 1; i < n; i) { x C[i];for (j …

潮流时尚,音质在线的悠律ringbuds pro开放式耳机体验评测

选购耳机时你最看重的要素是什么&#xff1f;对笔者来说&#xff0c;“音质”绝对排在了第一位。然而&#xff0c;当前市场上多数开放式蓝牙耳机音质和舒适性欠佳&#xff0c;让人难以抉择。最近悠律声学品牌推出全新的 OWS 蓝牙耳机ringbuds pro&#xff0c;它以卓越音质、时尚…

streamlit (python构建web)之环境搭建

目录 前言 1. 什么是Streamlit&#xff1f; 2. Streamlit的原理 2.1 demo1-运行计时程序 2.2 demo2-随即密码生成器 3. 安装Streamlit 3.1 安装方式一 3.2 安装方式二 3.2.1 安装 conda 3.2.2 新建一个 conda 环境 3.2.3 激活 conda 环境 3.2.4 安装 Streamlit 库 …

微信小程序教程011-2:京西购物商城实战之TabBar实现

2、tabBar 2.0 创建tabBar分支 运行如下命令,基于master分支,创建本地tabBar子分支,用来开发和tabBar相关的功能 git checkout -b tabbar2.1 创建tabBar页面 在pages目录中,创建首页(home)、分类(cate)、购物车(cart)、我的(my)这4个tabBar页面,在HBuilderX中…

PADS文件与AD文件如何相互转换?

大家好&#xff0c;我是山羊君Goat。 在电子硬件设计中&#xff0c;常常用用到3款EDA设计软件&#xff1a;Altium Designer, Pads, cadence。 Altium Designer: 在高校中使用非常普遍&#xff08;相信很多硬件工程师接触的第一款设计软件就是Altium Designer&#xff09;&…

Python 用户输入和while循环

1、input()函数的工作原理&#xff08;用户输入&#xff09; input()函数让程序暂停运行&#xff0c;等待用户输入一些文本。获取用户输入后&#xff0c;Python将其赋给变量&#xff0c;以其使用。 在input()函数接受一个参数&#xff0c;既要向用户显示的提示&#xff0c;为了…