IOday8作业

news2024/12/22 16:37:38

 

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

#include<myhead.h>


//定义结构体
struct buf
{
	long mtype;
	char mtest[1024];
};

#define SIZE (sizeof(struct buf)-sizeof(long))

//进程
int main(int argc, const char *argv[])
{
	//创建key
	key_t key1 = ftok("/",'k');
	if(key1 == -1)
	{
		perror("ftok");
		return -1;
	}
	
	//创建消息队列
	int msgid1 = msgget(key1,IPC_CREAT|0664);
	if(msgid1 == -1)
	{
		perror("msgid1");
		return -1;
	}
		//定义结构体
	struct buf mbuf;

	//创建子进程
	pid_t pid = fork();
	if(pid == 0)
	{
		//子进程1发送
		while(1)
		{
			printf("请输入类型:");
			scanf("%ld",&mbuf.mtype);
			printf("请输入内容:");
			scanf("%s",mbuf.mtest);
			msgsnd(msgid1,&mbuf,SIZE,0);
			if(strcmp(mbuf.mtest,"quit") == 0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}
	else if(pid > 0)
	{
		//父进程2接受
		while(1)
		{
			msgrcv(msgid1,&mbuf,SIZE,20,0);
			printf("传输的数据为%s\n",mbuf.mtest);
			if(strcmp(mbuf.mtest,"quit") == 0)
			{
				break;
			}
		}
		waitpid(pid,NULL,0);
	}
	else
	{
		perror("fork");
		return -1;
	}


			return 0;
}
#include<myhead.h>


//定义结构体
struct buf
{
	long mtype;
	char mtest[1024];
};

#define SIZE (sizeof(struct buf)-sizeof(long))

//进程
int main(int argc, const char *argv[])
{
	//创建key
	key_t key1 = ftok("/",'k');
	if(key1 == -1)
	{
		perror("ftok");
		return -1;
	}
	
	//创建消息队列
	int msgid1 = msgget(key1,IPC_CREAT|0664);
	if(msgid1 == -1)
	{
		perror("msgid1");
		return -1;
	}
	
	//定义结构体
	struct buf mbuf;

	//创建子进程
	pid_t pid = fork();
	if(pid == 0)
	{
		//子进程1接受
		while(1)
		{
			msgrcv(msgid1,&mbuf,SIZE,10,0);
			printf("传输的数据为%s\n",mbuf.mtest);
			if(strcmp(mbuf.mtest,"quit") == 0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);

	}
	else if(pid > 0)
	{
		//父进程2发送

		while(1)
		{
			printf("请输入类型:");
			scanf("%ld",&mbuf.mtype);
			printf("请输入内容:");
			scanf("%s",mbuf.mtest);
			msgsnd(msgid1,&mbuf,SIZE,0);
			if(strcmp(mbuf.mtest,"quit") == 0)
			{
				break;
			}
		}
		waitpid(pid,NULL,0);
	}
	else
	{
		perror("fork");
		return -1;
	}


	//删除消息队列
	
	if(msgctl(msgid1,IPC_RMID,NULL)== -1)
	{
		perror("msgtrl");
		return -1;
	}

	return 0;
}

效果图:

 使用消息队列完成两个进程之间相互通信(多线程)

#include<myhead.h>

//定义结构体
struct buf
{
	long mtype;
	char mtest[1024];
};

#define SIZE (sizeof(struct buf)-sizeof(long))



//发送
void* func1(void* arg)
{
	int msgid1 = *((int*)arg);
	//定义结构体
	struct buf mbuf;
	while(1)
	{
		printf("请输入类型:");
		scanf("%ld",&mbuf.mtype);
		printf("请输入内容:");
		scanf("%s",mbuf.mtest);
		msgsnd(msgid1,&mbuf,SIZE,0);
		if(strcmp(mbuf.mtest,"quit") == 0)
		{
			pthread_exit(NULL);
		}
	}

}


//接受
void* func2(void* arg)
{
	int msgid2 = *((int*)arg);
	//定义结构体
	struct buf mbuf;
	while(1)
	{
		msgrcv(msgid2,&mbuf,SIZE,40,0);
		printf("传输的数据为%s\n",mbuf.mtest);
		if(strcmp(mbuf.mtest,"quit") == 0)
		{
			pthread_exit(NULL);
		}
	}

}



int main(int argc, const char *argv[])
{
	//创建key
	key_t key1 = ftok("/",'k');
	if(key1 == -1)
	{
		perror("ftok");
		return -1;
	}
	
	//创建消息队列
	int msgid1 = msgget(key1,IPC_CREAT|0664);
	if(msgid1 == -1)
	{
		perror("msgid1");
		return -1;
	}
	

	//创建两个线程
	pthread_t tid1;
	pthread_t tid2;
	if(pthread_create(&tid1,NULL,func1,&msgid1) != 0)//msgid1 
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid2,NULL,func2,&msgid1) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	

	
	return 0;
}
#include<myhead.h>

//定义结构体
struct buf
{
	long mtype;
	char mtest[1024];
};

#define SIZE (sizeof(struct buf)-sizeof(long))



//发送
void* func1(void* arg)
{
	int msgid2 = *((int*)arg);
	//定义结构体
	struct buf mbuf;
	while(1)
	{
		printf("请输入类型:");
		scanf("%ld",&mbuf.mtype);
		printf("请输入内容:");
		scanf("%s",mbuf.mtest);
		msgsnd(msgid2,&mbuf,SIZE,0);
		if(strcmp(mbuf.mtest,"quit") == 0)
		{
			pthread_exit(NULL);
		}
	}

}


//接受
void* func2(void* arg)
{
	int msgid1 = *((int*)arg);
	//定义结构体
	struct buf mbuf;
	while(1)
	{
		msgrcv(msgid1,&mbuf,SIZE,30,0);
		printf("传输的数据为%s\n",mbuf.mtest);
		if(strcmp(mbuf.mtest,"quit") == 0)
		{
			pthread_exit(NULL);
		}
	}

}



int main(int argc, const char *argv[])
{
	//创建key
	key_t key1 = ftok("/",'k');
	if(key1 == -1)
	{
		perror("ftok");
		return -1;
	}
	
	//创建消息队列
	int msgid1 = msgget(key1,IPC_CREAT|0664);
	if(msgid1 == -1)
	{
		perror("msgid1");
		return -1;
	}
	

	//创建两个线程
	pthread_t tid1;
	pthread_t tid2;
	if(pthread_create(&tid1,NULL,func1,&msgid1) != 0)//msgid1 
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid2,NULL,func2,&msgid1) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	if(msgctl(msgid1,IPC_RMID,NULL) == -1)
	{
		perror("msgctl");
		return -1;
	}

	
	return 0;
}

效果图:

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

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

相关文章

关于北京医学sci论文翻译

在医学领域&#xff0c;翻译论文是一项非常重要的工作。医学论文的翻译需要准确、专业、严谨&#xff0c;同时也需要考虑到医学领域的特殊性和复杂性。那么&#xff0c;如何翻译医学论文呢&#xff1f;北京医学SCI论文翻译哪家好呢&#xff1f; 首先&#xff0c;需要具备专业的…

5.鸿蒙hap可以直接点击包安装吗?

5.鸿蒙hap可以直接点击包安装吗&#xff1f; hap与apk不同&#xff0c;获取的hap不能直接安装 安装方法1&#xff1a; DevEco studio打开项目源文件&#xff0c;打开手机USB调试&#xff0c;DevEco识别到手机后&#xff0c;点击播放按钮安装到手机 https://txwtech.blog.cs…

多线程案例-阻塞队列

阻塞队列是什么 阻塞队列是一种特殊的队列.也遵循"先进先出"的原则 阻塞队列能是一种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续入队列就会阻塞,直到有其他线程从队列中取走元素. 当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插入元素…

小电流MOSFET 选型分析数据,可应用于电子烟,电动工具,智能穿戴等产品上

小电流双N&#xff0c;D-N通道MOSFET&#xff0c;电压60V-100V左右 电流300mA-500MA&#xff0c;采用封装形式多样。具有低导通电阻&#xff0c;可快速切换速度&#xff0c;易于设计的驱动电路也易于并联&#xff0c;ESD保护&#xff0c;低电压驱动使该器件非常适合便携式设备…

相控与斩控交交调压(THD的计算)

相控与斩控交交调压&#xff08;THD的计算&#xff09;

ML81N服务条目表创建审批

ML81N服务条目表创建 ME23N创建服务类采购订单 ML81N根据采购订单明细创建服务条目表 保存后采购订单会生成物料凭证 删除 创建 参考ESLL表&#xff0c;需要区分父包&#xff0c;子包&#xff1b;其中ls_esll-pln_pckg需要根据EKPO关联ESSR关联ESLL获取到原始包装编号 …

WampServer本地部署结合内网穿透实现公网访问本地服务

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

认识lambda架构(架构师考试复习)

Lambda架构主要分为三层&#xff0c;批处理层、加速层和服务层。 如下图所示&#xff1a; &#xff08;1&#xff09;批处理层&#xff08;Batch Layer&#xff09;&#xff1a;存储数据集&#xff0c;在数据集上预先计算查询函数&#xff0c;并构建查询对应的view。Batch Lay…

perl处理json的序列化和反序列化

perl可以使用JSON模块很方便的处理json的序列化和反序列化。先来一段简单的例子&#xff1a; #! /usr/bin/perl use v5.14; use JSON; use IO::File;my $info {id > 1024,desc > hello world,arry > [1, 2, 3, 4, 5],obj > {char > [ A, B, C ]} };say to_jso…

企业网站运营不稳定有什么影响

如果一个公司的网站打开都有困难&#xff0c;那么用户会对这个企业的实力产生怀疑&#xff0c;企业网站除了作为企业的名片外&#xff0c;更多的是承担增加企业交易订单的任务。因此很多网站会做有关的网络广告或者搜索引擎优化的工作。如果网站无法正常打开&#xff0c;那么用…

从零开发短视频电商 AWS OpenSearch Service开发环境申请以及Java客户端介绍

文章目录 创建域1.创建域2.输入配置部署选项数据节点网络精细访问控制访问策略 获取域端点数据如何插入到OpenSearch ServiceJava连接OpenSearch Servicespring-data-opensearchelasticsearch-rest-high-level-clientopensearch-rest-clientopensearch-java 因为是开发测试使用…

视频中自监督学习:「我的世界」下指令理解与跟随

本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展&#xff0c;题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 ​ GROOT 该研究的核心目标是探索能否摆脱文本数据的标…

12.11 作业

1&#xff0c; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码…

MySQL笔记-第01章_数据库概述

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

关于王道3.4_3GBN协议中对滑动窗口大小范围的讲述模糊表述的思考

这里是假设滑动窗口大小为4的不合理环境下&#xff0c;对为什么不合理原因的模糊表述。 下面是我对理解&#xff1a;为什么不可以是4 发送方在收到第一个ack0之后滑动窗口后移&#xff0c;可发送窗口内为1230&#xff0c; 接收方收到ack0此时存在二义性&#xff1a; 1、发送方发…

DelteE2000计算,C代码实现

CIEDE2000色差公式主要对CIE94公式做了如下几项修正&#xff1a; 重新标定近中性区域的a*轴&#xff0c;以改善中性色的预测性能&#xff1b; 将CIE94公式中的明度权重函数修改为近似V形函数&#xff1b; 在色相权重函数中考虑了色相角&#xff0c;以体现色相容限随颜色的色相…

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

让你从此不再惧怕ANR

原文链接 让你从此不再惧怕ANR 这篇文章是基于官方的Diagnose and fix ANRs翻译而来&#xff0c;但也不是严格的翻译&#xff0c;原文的内容都在&#xff0c;又加上了自己的理解以及自己的经验&#xff0c;以译注的形式对原文的作一些补充。 当一个Android应用的UI线程被阻塞时…

【Jeecg Boot 3 - 第二天】1.1、后端 docker-compose 部署 JEECGBOOT3

一、场景 二、实战 ▶ 2.1 修改配置文件 &#xff1e; 目的一&#xff1a;将 dev 变更为生产环境 prod &#xff1e; 目的二&#xff1a;方便spring项目调用docker同个network下的redis和mysql ▶ 2.2 编写dockerfile ▶ 2.3 编写docker-compose.yaml ▶ 2.4 打…