当前位置: 首页 > article >正文

华清远见嵌入式学习——春节作业——2.5日

目录

作业要求:

作业答案:

作业代码效果图

作业代码截图

proc1.c

proc2.c

作业代码

proc1.c

proc2.c


作业要求:

通过消息队列实现进程之间通信代码示例

作业答案:

作业代码效果图

作业代码截图

proc1.c

proc2.c

作业代码

proc1.c

#include <myhead.h>

//定义消息队列结构体
struct msg
{
	long int type;
	char text[64];
};

//宏定义消息正文的大小
#define MSGSIZE sizeof(struct msg)-sizeof(long int)

int main(int argc, const char *argv[])
{
	//定义消息队列变量
	key_t key = ftok("/",'s');
	if(key == -1)
	{
		perror("ftok error");
		return -1;
	}

	//定义进程号
	pid_t pid;
		
	//定义消息队列id号
	int msqid;	

	//创建消息队列
	if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
	{
		perror("msgget error");
		return -1;
	}

	//创建子进程
	pid = fork();	

	//判断子进程是否创建成功
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子进程实现对消息队列1的读取
		
		//定义消息队列结构体变量并初始化消息队列的类型为1
		struct msg buf = {.type = 1};
			
		//循环赋值并写入消息队列
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从消息队列1中读取数据
			if(msgrcv(msqid,&buf,MSGSIZE,1,0) == -1)
			{
				perror("msgrcv error");
				return -1;
			}
			
			//输出读取到的数据
			printf("读取的数据为:%s\n",buf.text);
			
	
			//设定循环退出条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}

		}
		
		//退出子进程
		exit(EXIT_SUCCESS);
	}else
	{
		//父进程实现对消息队列2的写入
		
		//定义消息队列结构体变量并初始化消息队列的类型为2
		struct msg buf = {.type = 2};
		
		//循环向消息队列2中写入数据
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从终端输入内容向数组中赋值
			fgets(buf.text,sizeof(buf.text),stdin);
		
			//将数组最后一位值('\n')用'\0'替换
			buf.text[strlen(buf.text)-1] = '\0';

			//将数组中的数据写入消息队列2
			if(msgsnd(msqid,&buf,MSGSIZE,0) == -1)
			{
				perror("msgsnd error");
				return -1;
			}

			//设定退出循环的条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}		
		}
		
		//回收子进程资源
		wait(NULL);
	}
	return 0;
}

proc2.c

#include <myhead.h>

//定义消息队列结构体
struct msg
{
	long int type;
	char text[64];
};

//宏定义消息正文的大小
#define MSGSIZE sizeof(struct msg)-sizeof(long int)

int main(int argc, const char *argv[])
{
	//定义消息队列变量
	key_t key = ftok("/",'s');
	if(key == -1)
	{
		perror("ftok error");
		return -1;
	}

	//定义进程号
	pid_t pid;
		
	//定义消息队列id号
	int msqid;	

	//创建消息队列
	if((msqid = msgget(key,IPC_CREAT|0664)) == -1)
	{
		perror("msgget error");
		return -1;
	}

	//创建子进程
	pid = fork();	

	//判断子进程是否创建成功
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子进程实现对消息队列1的写入
		
		//定义消息队列结构体变量并初始化消息队列的类型为1
		struct msg buf = {.type = 1};
			
		//循环赋值并写入消息队列1
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从终端输入内容向数组中赋值
			fgets(buf.text,sizeof(buf.text),stdin);
		
			//将数组最后一位值('\n')用'\0'替换
			buf.text[strlen(buf.text)-1] = '\0';

			//将数组中的数据写入消息队列1
			if(msgsnd(msqid,&buf,MSGSIZE,0) == -1)
			{
				perror("msgsnd error");
				return -1;
			}

			//设定退出循环的条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}		
		}
		
		//退出子进程
		exit(EXIT_SUCCESS);
	}else
	{
		//父进程实现对消息队列2的读取
		
		//定义消息队列结构体变量并初始化消息队列的类型为2
		struct msg buf = {.type = 2};
		
		//循环从消息队列2中读取数据
		while(1)
		{
			//清空数组
			bzero(buf.text,sizeof(buf.text));
			
			//从消息队列2中读取数据
			if(msgrcv(msqid,&buf,MSGSIZE,2,0) == -1)
			{
				perror("msgrcv error");
				return -1;
			}
			
			//输出读取到的数据
			printf("读取的数据为:%s\n",buf.text);
			
	
			//设定循环退出条件
			if(strcmp(buf.text,"quit") == 0)
			{
				break;
			}
		}
		
		//回收子进程资源
		wait(NULL);
	}
	//删除消息队列
	if(msgctl(msqid, IPC_RMID, NULL) == -1)
	{
		perror("msgctl error");
		return -1;
	}


	return 0;
}


http://www.kler.cn/a/228343.html

相关文章:

  • 基于springboot社区医院管理系统
  • 2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计
  • Qt —— 控件属性
  • 75,【7】BUUCTF WEB [Weblogic]SSRF(未作出)
  • vue3+elementPlus之后台管理系统(从0到1)(day3-管理员管理)
  • Mysql面试题----为什么B+树比B树更适合实现数据库索引
  • [ubuntu]add-apt-repository 添加以及移除
  • 假期作业 2.2
  • 哪种安全数据交换系统,可以满足信创环境要求?
  • 视频业务像素、带宽、存储空间计算
  • OpenCV学习记录——平滑处理
  • 【ARM Trace32(劳特巴赫) 使用介绍 3.1 -- 不 attach core 直接访问 memory】
  • 【linux】校招中的“熟悉linux操作系统”一般是指达到什么程度?
  • ubuntu 安装 ffmpeg 6.0
  • 设计模式概述
  • 如何结合ChatGPT生成个人魔法咒语词库
  • 【UE 材质】球形遮罩材质
  • 【力扣经典面试题】189. 轮转数组
  • C++新特性 扩展和聚合类型
  • 网易腾讯面试题精选----50 个 Git 面试问题
  • 笔记本电脑的WIFI模块,突然不显示了,网络也连接不上
  • 计算机软件能力认证考试CCF-202312-1 仓库规划
  • 《剑指 Offer》专项突破版 - 面试题 30 和 31:详解如何设计哈希表以及利用哈希表设计更加高级、复杂的数据结构
  • 远程桌面时连接不上远程计算机是什么问题
  • YOLOv8改进 | 检测头篇 | 重参数化检测头RepHead解决困难样本检测(全网独家首发)
  • Ubuntu Linux 下安装和卸载cmake 3.28.2版本