10.21 多进程间通信-信号、消息队列

作业:使用消息队列实现两个进程间通信

编程代码:使用父子进程实现通信

msgsnd.c

#include <myhead.h>
//定义自定义函数用于接收僵尸进程
void handler(int signo){
	if(signo==SIGCHLD){
		while(waitpid(-1,NULL,WNOHANG)>0);
	}
}
//定义存储消息队列信息结构体类型
struct msgbuf{
	long mtype;  //消息类型
	char mtext[1024];  //消息正文
};
//宏定义消息正文大小
#define MSGSZ (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
	//使用消息队列实现两个进程间相互通信
	if(signal(SIGCHLD,handler)==SIG_ERR){
		perror("signal error");
		return -1;
	}//用于与SIGCHLD信号绑定
	//1.创建一个key值
	key_t key=ftok("/",'k');
	if(key==-1){
		perror("ftok error");
		return -1;
	}
	//2.创建一个消息队列
	int msqid=msgget(key,IPC_CREAT|0664);
	if(msqid==-1){
		perror("msgget error");
		return -1;
	}
	//创建一个子进程
	pid_t pid=fork();
	if(pid>0){//执行父进程
		//3.父进程存放消息类型1数据
		struct msgbuf buf;//用于存储消息
		while(1){
			printf("请输入消息队列类型1消息类型>>");
			scanf("%ld",&buf.mtype);
			getchar();//吸收垃圾字符
			printf("请输入消息队列类型1消息正文");
			fgets(buf.mtext,MSGSZ,stdin);
			buf.mtext[strlen(buf.mtext)-1]='\0';//将\n转为\0
			msgsnd(msqid,&buf,MSGSZ,0);//将信息存放于消息队列中
			printf("消息队列类型1数据已存放\n");
			if(strcmp(buf.mtext,"quit")==0){//结束循环
				break;
			}
		}
	}else if(pid==0){//执行子进程
		//4.子进程读取消息类型2数据
		struct msgbuf buf;//用于存储消息
		while(1){
			//从消息队列中读取数据
			msgrcv(msqid,&buf,MSGSZ,2,0);//2表示从消息类型2读取数据,0表示阻塞读取
			printf("消息队列类型2数据已读取,正文为:%s\n",buf.mtext);
			if(strcmp(buf.mtext,"quit")==0){
				break;
			}
		}
		exit(EXIT_SUCCESS);//结束子进程
	}else{
		perror("fork error");
		return -1;
	}
	//5.删除队列
	if(msgctl(msqid,IPC_RMID,NULL)==-1){
		perror("msgctl error");
		return -1;
	}
	return 0;
}

msgrcv.c 

#include <myhead.h>
//定义自定义函数用于接收僵尸进程
void handler(int signo){
	if(signo==SIGCHLD){
		while(waitpid(-1,NULL,WNOHANG)>0);
	}
}
//定义存储消息队列信息结构体类型
struct msgbuf{
	long mtype;  //消息类型
	char mtext[1024];  //消息正文
};
//宏定义消息正文大小
#define MSGSZ (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
	//使用消息队列实现两个进程间相互通信
	if(signal(SIGCHLD,handler)==SIG_ERR){
		perror("signal error");
		return -1;
	}//用于与SIGCHLD信号绑定
	//1.创建一个key值
	key_t key=ftok("/",'k');
	if(key==-1){
		perror("ftok error");
		return -1;
	}
	//2.创建一个消息队列
	int msqid=msgget(key,IPC_CREAT|0664);
	if(msqid==-1){
		perror("msgget error");
		return -1;
	}
	//创建一个子进程
	pid_t pid=fork();
	if(pid>0){//执行父进程
		//3.父进程存放消息类型2数据
		struct msgbuf buf;//用于存储消息
		while(1){
			printf("请输入消息队列类型2消息类型>>");
			scanf("%ld",&buf.mtype);
			getchar();//吸收垃圾字符
			printf("请输入消息队列类型2消息正文");
			fgets(buf.mtext,MSGSZ,stdin);
			buf.mtext[strlen(buf.mtext)-1]='\0';//将\n转为\0
			msgsnd(msqid,&buf,MSGSZ,0);//将信息存放于消息队列中
			printf("消息队列类型2数据已存放\n");
			if(strcmp(buf.mtext,"quit")==0){//结束循环
				break;
			}
		}
	}else if(pid==0){//执行子进程
		//4.子进程读取消息类型1数据
		struct msgbuf buf;//用于存储消息
		while(1){
			//从消息队列中读取数据
			msgrcv(msqid,&buf,MSGSZ,1,0);//1表示从消息类型1读取数据,0表示阻塞读取
			printf("消息队列类型1数据已读取,正文为:%s\n",buf.mtext);
			if(strcmp(buf.mtext,"quit")==0){
				break;
			}
		}
		exit(EXIT_SUCCESS);//结束子进程
	}else{
		perror("fork error");
		return -1;
	}
	return 0;
}

运行结果:

思维导图: 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[云] Deploying Your First Serverless Application

• Goal: • Hands-on lab to get started with Serverless • Agenda: • Deploying Your First Serverless Application • Assignment Introduction Create and test function in AWS Lambda • Lets create an addition function using AWS Lambda. • To create the addi…

pipeline开发笔记

pipeline开发笔记 jenkins常用插件Build Authorization Token Root配置GitLab的webhooks(钩子)配置构建触发器--示例 piblish over sshBlue OceanWorkspace Cleanup PluginGit插件PipelineLocalization: Chinese (Simplified) --中文显示Build Environment Plugin 显示构建过程…

vscode离线状态ssh连接不断输入密码登不上:配置commit_id

如题&#xff0c;vscode在一个离线服务器上&#xff0c;通过remote-ssh登录远程服务器&#xff0c;不断弹出密码框&#xff0c;总是进不去&#xff0c;后来了解到主要是不同vscode版本需要下载对应抑制commit-id的vscode-server-linux-x64.tar.gz包。 1&#xff09;vscode, 点…

Jupyter Notebook汉化(中文版)

原版jupyter notebook是英文的&#xff0c;想要将其改为中文 在jupyter notebook所在环境输入以下命令 pip install jupyterlab-language-pack-zh-CN打开jupyter notebook&#xff0c;在设置语言中将其设置为中文

提升小学语文教学效果的思维导图方法

众所周知&#xff0c;教学不仅仅是站在讲台上传授知识&#xff0c;它还包括了备课、评估学生学习成果以及不断调整教学方法等多个环节。在面对教学中的各种挑战时&#xff0c;思维导图可以成为解决这些问题的有力工具。思维导图是一种利用图形来组织和表达发散性思维的工具&…

【DBA Part01】国产Linux上安装Oracle进行数据迁移

内容如下&#xff1a; 1.1.生产环境RHEL/OEL Linux8Oracle11gR2安装配置 1.2.国产麒麟操作系统Oracle11gR2安装配置 1.3.国产麒麟操作系统Oracle11gR2 RAC集群安装配置 1.4.Oracle11gR2迁移到国产麒麟操作系统&#xff08;单机/RAC&#xff09; 本阶段课程项目需求说明&am…

Spring配置/管理bean-IOC(控制反转) 非常详细!基于XML及其注解!案例分析! 建议复习收藏!

目录 1.Spring配置/管理bean介绍 2.基于XML配置bean 2.1基于id来获取bean对象 2.2基于类型获取bean对象 2.3通过指定构造器配置bean对象 2.4通过p名称空间配置bean 2.5通过ref配置bean(实现依赖注入) 2.6注入内部Bean对象&#xff0c;依赖注入另一种方式 2.7 注入集合…

PCL 基于距离阈值去除错误对应关系

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 获取初始对应点对 2.1.2 基于距离的对应关系筛选函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实…

批量处理文件权限:解决‘/usr/bin/chmod: Argument list too long’的有效方法

批量处理文件权限&#xff1a;解决‘/usr/bin/chmod: Argument list too long’的有效方法 错误原因解决方案1. 分批处理2. 使用xargs3. 增加ARG_MAX限制4. 使用脚本 结论 在Linux系统中&#xff0c;有时你可能会遇到这样的错误消息&#xff1a;“/usr/bin/chmod: Argument lis…

大数据之hive(分布式SQL计算工具)加安装部署

1.分布式SQL计算: 对数据进行统计分析&#xff0c; SQL是目前最为方便的编程工具. 2.hive:主要功能: 将 SQL语句翻译成MapReduce程序运行,提供用户分布式SQL计算能力 3.构建分布式SQL计算:(hive核心组件) 需要有: 一:元数据管理功能, 即&#xff1a;数据位置,数据结构,等对数…

SpringBoot篇(二、制作SpringBoot程序)

目录 一、代码位置 二、四种方式 1. IDEA联网版 2. 官网 3. 阿里云 4. 手动 五、在IDEA中隐藏指定文件/文件夹 六、复制工程-快速操作 七、更改引导类别名 一、代码位置 二、四种方式 1. IDEA联网版 2. 官网 官网制作&#xff1a;Spring Boot 3. 阿里云 阿里云版制…

HTTP和RPC通信协议

在软件开发中&#xff0c;通信协议扮演着关键的角色&#xff0c;它们定义了不同系统或组件之间进行通信的规则和方式。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和RPC&#xff08;Remote Procedure Call Protocol&#xff09;是两种常见的通信协议。然而RPC 和…

开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现推理加速的正确姿势-Gradio

一、前言 目前&#xff0c;Qwen模型已经升级到了2.5版本。无论是语言模型还是多模态模型&#xff0c;它们都是在大规模的多语言和多模态数据上进行预训练的&#xff0c;并通过高质量的数据进行后期微调&#xff0c;以更好地符合人类的需求。 Gradio作为一个强大的工具&#xff…

Windows--使用node.js的免安装版本

原文网址&#xff1a;Windows--使用node.js的免安装版本_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Windows下如何使用node.js的免安装版本。 下载 1.访问官网 https://nodejs.org/en 记住这个版本号&#xff0c;这个是长期支持的版本。 2.找到压缩包 点击其他下载&#…

Verilog基础:层次化标识符的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 一、前言 Verilog HDL中的标识符(identifier)是一个为了引用而给一个Verilog对象起的名字&#xff0c;分为两大类&#xff1a;普通标识符大类和层次化标识符大类。…

【OpenCV】人脸识别方法

代码已上传GitHub&#xff1a;plumqm/OpenCV-Projects at master EigenFace、FisherFace、LBPHFace 这三种方法的代码区别不大所以就一段代码示例。 EigenFace与FisherFace 1. 将人脸图像展开为一维向量&#xff0c;组成训练数据集 2. PCA&#xff08;EigenFace&#xff09;或…

Spring MVC 原理与源码

Spring MVC 整体代码量有 5w 行&#xff0c;通过本专栏&#xff0c;可以快速的研读核心部分的代码&#xff0c;节省你的时间。 DispatcherServlet 的流程处理如下图&#xff1a; 但是随着前后端分离&#xff0c;后端大多提供 Restful API &#xff0c;里面的 ViewResolver 和 …

word怎么清除格式,Word一键清除所有格式教程

你是否曾在编辑Word文档时遇到过复制内容时格式混乱的情况?别担心&#xff0c;这只需要清除一下格式就可以了&#xff0c;很多朋友还不知道word怎么清除格式&#xff0c;下面小编就来给大家讲一讲word一键清除所有格式的方法教程&#xff0c;操作非常简单&#xff0c;有需要的…

02电力电子技术简介

电力电子技术简介 第一章主要是做通识性的介绍&#xff0c;介绍电力电子涉及的基本概念、学习方法和关联学科。最重要的是希望大家能理解电力电子在现实生活中的广泛应用。这一章简介主要分三部分来介绍。首先是概要性的通盘介绍。然后会通过力电子技术性的内容来了解一些拓扑…

用Python将Office文档(Word、Excel、PowerPoint)批量转换为PDF

在处理不同格式的Office文档&#xff08;如Word、Excel和PowerPoint&#xff09;时&#xff0c;将其转换为PDF格式是常见的需求。这种转换不仅确保了文件在不同设备和操作系统间的一致性显示&#xff0c;而且有助于保护原始内容不被轻易修改&#xff0c;非常适合于正式报告、提…