IO进程线程day7作业

news2025/7/14 4:48:34

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

代码:

msgsnd.c
#include<myhead.h>

//定义消息类型
struct msgbuf
{
	long mtype;
	char mtext[1024];
};

//宏表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)


int main(int argc, const char *argv[])
{
	//1.创建key值
	key_t key=0;
	if((key=ftok("/",'k'))==-1)
	{
		perror("ftok error");
		return -1;
	}

	//1.根据key值创建一个消息队列
	int msqid = -1;
	if((msqid=msgget(key,IPC_CREAT|0664))==-1)
	{
		perror("msgget error");
		return -1;
	}
	
	//创建一个子进程
	pid_t pid=fork();

	if(pid>0)
	{
		//父进程向消息队列中写入类型为1的正文
		//定义一个消息
		struct msgbuf sbuf;
		sbuf.mtype=1;
		while(1)
		{
			//清空容器
			bzero(sbuf.mtext,sizeof(sbuf.mtext));

			printf("发送的消息:");
			fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);
			sbuf.mtext[strlen(sbuf.mtext)-1]='\0';

			//将消息存放到队列中
			msgsnd(msqid,&sbuf,MSGSIZE,0);
			printf("发送成功\n");

			if(strcmp(sbuf.mtext,"quit")==0)
			{
				break;
			}
		}
		wait(NULL);
	}
	else if(pid==0)
	{
		//子进程从消息队列中读取类型为2的正文
		//定义一个消息
		struct msgbuf rbuf;

		while(1)
		{
			//清空容器
			bzero(rbuf.mtext,sizeof(rbuf.mtext));

			//从消息队列中读取类型为2的消息正文
			msgrcv(msqid,&rbuf,MSGSIZE,2,0);
			printf("收到的消息为:%s\n",rbuf.mtext);
			if(strcmp(rbuf.mtext,"quit")==0)
			{
				break;
			}
			
		}
		exit(0);

	}
	else 
	{
		perror("fork error");
		return -1;
	}


	return 0;
}
msgrev,c
#include<myhead.h>

//定义消息类型
struct msgbuf
{
	long mtype;
	char mtext[1024];
};

//宏表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)


int main(int argc, const char *argv[])
{
	//1.创建key值
	key_t key=0;
	if((key=ftok("/",'k'))==-1)
	{
		perror("ftok error");
		return -1;
	}

	//1.根据key值创建一个消息队列
	int msqid = -1;
	if((msqid=msgget(key,IPC_CREAT|0664))==-1)
	{
		perror("msgget error");
		return -1;
	}
	
	//创建一个子进程
	pid_t pid=fork();

	if(pid==0)
	{
		//子进程向消息队列中写入类型为2的正文
		//定义一个消息
		struct msgbuf sbuf;
		sbuf.mtype=2;
		while(1)
		{
			//清空容器
			bzero(sbuf.mtext,sizeof(sbuf.mtext));

			printf("发送的消息:");
			fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);
			sbuf.mtext[strlen(sbuf.mtext)-1]='\0';

			//将消息存放到队列中
			msgsnd(msqid,&sbuf,MSGSIZE,0);
			printf("发送成功\n");

			if(strcmp(sbuf.mtext,"quit")==0)
			{
				break;
			}
		}
		exit(0);
	}
	else if(pid>0)
	{
		//父进程从消息队列中读取类型为1的正文
		//定义一个消息
		struct msgbuf rbuf;

		while(1)
		{
			//清空容器
			bzero(rbuf.mtext,sizeof(rbuf.mtext));

			//从消息队列中读取类型为1的消息正文
			msgrcv(msqid,&rbuf,MSGSIZE,1,0);
			printf("收到的消息为:%s\n",rbuf.mtext);
			if(strcmp(rbuf.mtext,"quit")==0)
			{
				break;
			}
			
		}
		wait(NULL);

	}
	else 
	{
		perror("fork error");
		return -1;
	}


	return 0;
}

运行结果:

 

思维导图: 

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

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

相关文章

【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间两数之和辅助哈希使用map存储出现过的值,key为值大小,value为下标位置,…

C++-带你走进多态(1)

1. 多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

OSCP靶机--AuthBy

OSCP靶机–AuthBy 1.考点 (1. ftp匿名登陆&#xff0c;搜集信息 2.ftp弱密码 3.hash破解【hashcat与john】4.Windows_Server_2008_R2_Enterprise 土豆提权(32bit)) 1.nmap ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.225.46 -sV -sC -p- --min-rate 5000 Startin…

【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附代码 文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现前后端…

undo日志详解

一、undo日志介绍 上一节详细的说了redo日志&#xff0c;redo日志的功能就是把增删改操作都记录着&#xff0c;如果断电导致内存中的脏页丢失&#xff0c;可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性&#xff0c;undo日志设计出来是为…

【Java程序设计】【C00278】基于Springboot的数码论坛管理系统(有论文)

基于Springboot的数码论坛管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的数码论坛系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、…

CSS列表学习2

之前学习了列表&#xff1b;继续熟悉&#xff1b; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title></title><meta charset"utf-8" /><…

Django学习笔记-HTML实现服务器图片的下载

1.index编写代码,跳转下载页面 2.创建download界面 3.编写download路由 4.创建download函数 1).如果请求的方法是GET&#xff0c;imglist变量存储从models.imgModel模型中获取的所有对象,创建字典ctx,使用render函数来渲染download.htm 2).如果请求的方法是POST,获取要下载的文…

tinymce问题处理

Vite构建工具下Tinymce踩坑指南 解决方案是在路劲前面增加/&#xff0c;这个跟上面链接有些区别&#xff0c;区别原因应该是如果路由采用的是createWebHashHistory则应该去掉/&#xff0c;如果是createWebHistory则应该加上/ 页面引用,一种异步加载&#xff0c;一种同步加载&…

挑战杯 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:主设备和次设备

🚀返回专栏总目录 文章目录 一、主设备和次设备的概念二、设备号的分配和释放沉淀、分享、成长,让自己和他人都能有所收获!😄 字符设备通过字符(一个接一个的字符)以流方式向用户程序传递数据,就像串行端口那样。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和…

涵盖5大领域的机器学习工具介绍

随着数据的产生及其使用量的不断增加&#xff0c;对机器学习模型的需求也在成倍增加。由于ML系统包含了算法和丰富的ML库&#xff0c;它有助于分析数据和做出决策。难怪机器学习的知名度越来越高&#xff0c;因为ML应用几乎主导了现代世界的每一个方面。随着企业对这项技术的探…

详细教程!VMware Workstation Pro16 安装 + 创建 win7 虚拟机!

嚯嚯嚯&#xff0c;很多宝子都想拥有自己不同的操作系统环境&#xff0c;用于学习或项目搭建。买服务器费钱&#xff0c;虚拟机则成为了一个很好的选择。本文详细介绍VMware Workstation Pro 16安装及win7虚拟机创建&#xff0c;保姆级教程奉上&#xff01; 一、准备工作 VMw…

在Sora引爆视频生成时,Meta开始用Agent自动剪视频了

未来&#xff0c;视频剪辑可能也会像视频生成领域一样迎来 AI 自动化操作的大爆发。 这几天&#xff0c;AI 视频领域异常地热闹&#xff0c;其中 OpenAI 推出的视频生成大模型 Sora 更是火出了圈。而在视频剪辑领域&#xff0c;AI 尤其是大模型赋能的 Agent 也开始大显身手。 …

【python】0、超详细介绍:json、http

文章目录 一、json二、http2.1 json 读取 request 序列化 三、基本类型3.1 decimal 四、图像4.1 颜色格式转换 一、json import json f open(data.json) # open json file data json.load(f) # 读出 json object for i in data[emp_details]: # 取出一级属性 emp_details, …

基础复习(GDB调试)

1.GDB环境配置 这里只说Pwndbg Pwndbg的安装简单&#xff0c;访问Github主页&#xff0c;https://github.com/pwndbg/pwndbg 在“How”栏中看到安装说明 2.打开文件 GDB打开文件的方式与图形化的工具不同&#xff0c;需要通过传入参数或执行命令 方式1&#xff1a;在GDB的…

Python实现DAS单点登录

❇️ 流程 进入登录页面 &#xff08;DAS验证的登录页面&#xff09; 获取验证码图像&#xff0c;百度OCR识别 登录 &#x1f3de;️ 环境 Windows 11 Python 3.12 PyCharm 2023 &#x1f9f5; 准备工作 安装必要依赖库 bs4 Jupyter 推荐安装 Jupyter&#xff08;Anaco…

WSL2配置Linux、Docker、VS Code、zsh、oh my zsh(附Docker开机自启设置)

0. 写在前面 本篇笔记来自于UP主麦兜搞IT的合集视频Windows10开发环境搭建中的部分内容 1. 安装WSL2 按照微软官方文档进行操作&#xff0c;当然也可以直接wsl --install 也可以按照 旧版手动安装的步骤 来进行操作 选择安装的是Ubuntu 20.04 LTS 注&#xff1a;WSL默认安装…

Vue + Echarts页面内存占用高问题解决

Vue Echarts页面内存占用高问题解决 1.问题描述 目前使用的是Vue2 Echarts4.x的组合&#xff0c;页面如下所示。 就是一个类似于神策的数据看板页面&#xff0c;左侧是一个导航栏&#xff0c;右侧看板页面中包含很多个报表图片&#xff0c;其中报表页面中对Echarts图表进…