day08 1.进程间通信

news2024/11/26 16:56:06

 work1.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 == -1)
	{
		perror("fork error");
		return -1;
	}

	if(pid > 0)     //父进程
	{
		//1、创建key值,用于生产消息队列
		key_t key = ftok("/", 'k');
		if(key == -1)
		{
			perror("ftok error");
			return -1;
		}
 
		//2、通过key值创建一个消息队列
		int msqid = msgget(key, IPC_CREAT|0664);
		if(msqid == -1)
		{
			perror("msgget error");
			return -1;
		}
		
		//向消息队列中存放信息
		struct msgbuf buf;
		
		while(1)
		{
			printf("请输入消息类型:");
			scanf("%ld",&buf.mtype);
			getchar();
			printf("请输入消息正文:");
			fgets(buf.mtext,SIZE,stdin);
			buf.mtext[strlen(buf.mtext)-1] = 0;

			//将消息发送到消息队列中
			msgsnd(msqid,&buf,SIZE,0);

			printf("发送成功\n");

			if(strcmp(buf.mtext,"quit") == 0)
			{
				break;
			}
		}

		//删除消息队列
		if(msgctl(msqid, IPC_RMID, NULL) ==-1)
		{
			perror("msgctl error");
			return -1;
		}
	}
	else if(pid == 0)  //子进程
	{
		//1、创建key值,用于生产消息队列
		key_t key = ftok("/", 'l');
		if(key == -1)
		{
			perror("ftok error");
			return -1;
		}
 
		//2、通过key值创建一个消息队列
		int msqid = msgget(key, IPC_CREAT|0664);
		if(msqid == -1)
		{
			perror("msgget error");
			return -1;
		}
		
		//从消息队列接收消息
		struct msgbuf buf1;

		while(1)
		{	
			msgrcv(msqid, &buf1, SIZE, 0, 0);
			//参数1:消息队列id号
			//参数2:数据容器起始地址
			//参数3:数据的正文大小
			//参数4:消息类型,0表示任意类型
			//参数5:表示阻塞读取消息

			printf("收到消息为:%s\n", buf1.mtext);

			if(strcmp(buf1.mtext, "quit") == 0)
			{
				break;
			}
		}

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

	return 0;
}

 work2.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 == -1)
	{
		perror("fork error");
		return -1;
	}

	if(pid > 0)
	{
		//1、创建key值,用于生产消息队列
		key_t key = ftok("/", 'k');
		if(key == -1)
		{
			perror("ftok error");
			return -1;
		}
 	
		//2、通过key值创建一个消息队列
		int msqid = msgget(key, IPC_CREAT|0664);
		if(msqid == -1)
		{
			perror("msgget error");
			return -1;
		}

		//从消息队列接收消息
		struct msgbuf buf1;

		while(1)
		{
			msgrcv(msqid, &buf1, SIZE, 0, 0);
			//参数1:消息队列id号
			//参数2:数据容器起始地址
			//参数3:数据的正文大小
			//参数4:消息类型,0表示任意类型
			//参数5:表示阻塞读取消息
 
			printf("收到消息为:%s\n", buf1.mtext);
 
			if(strcmp(buf1.mtext, "quit") == 0)
			{
				break;
			}
		}	
			//删除消息队列
		if(msgctl(msqid, IPC_RMID, NULL) ==-1)
		{
			perror("msgctl error");
			return -1;
		}
	}
	else if(pid == 0)
	{
		//1、创建key值,用于生产消息队列
		key_t key = ftok("/", 'l');
		if(key == -1)
		{
			perror("ftok error");
			return -1;
		}
 		
		//2、通过key值创建一个消息队列
		int msqid = msgget(key, IPC_CREAT|0664);
		if(msqid == -1)
		{
			perror("msgget error");
			return -1;
		}

		//向消息队列存放消息
		struct msgbuf buf;
		
		while(1)
		{
			printf("请输入消息类型:");
			scanf("%ld", &buf.mtype);
			getchar();                    //吸收回车
			printf("请输入消息正文:");
			fgets(buf.mtext, SIZE, stdin);        //从终端获取数据
			buf.mtext[strlen(buf.mtext)-1] = 0;   //将换行换成 '\0'
 
			//将消息发送到消息队列中
			msgsnd(msqid, &buf, SIZE, 0);
			//参数1:消息队列id号
			//参数2:消息的起始地址
			//参数3:消息正文大小
			//参数4:阻塞形式发送数据
			printf("发送成功\n");
 	
			if(strcmp(buf.mtext, "quit") == 0)
			{
				break;
			}
		}
		//删除消息队列
		if(msgctl(msqid, IPC_RMID, NULL) ==-1)
		{
			perror("msgctl error");
			return -1;
		}
	}
 
	return 0;
}

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

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

相关文章

Webpack入门基础知识及案例

webpack相信大家都已经不陌生了&#xff0c;应用程序的静态模块打包工具。前面我们总结了vue&#xff0c;react入门基础知识&#xff0c;也分别做了vue3的实战小案例&#xff0c;react的实战案例&#xff0c;那么我们如何使用webpack对项目进行模块化打包呢&#xff1f; 话不多…

RPA与智慧政务的关系

自1992年国务院明确提出构建全国行政机关办公决策系统&#xff0c;我国政府信息化建设已走过三十余年历程&#xff0c;并取得了阶段性成果&#xff0c;随着社会需求的变化以及信息技术和数字化工具的不断完善&#xff0c;人们对政府的信息化建设也提出了新的要求&#xff0c;推…

【C#语音文字互转】C#语音转文字(方法一)

Whisper.NET开源项目&#xff1a;https://github.com/sandrohanea/whisper.net/tree/main 一. 环境准备 在VS中安装 Whisper.net&#xff0c;在NuGet包管理器控制台中运行以下命令&#xff1a; Install-Package Whisper.net Install-Package Whisper.net.Runtime其中运行时包…

uniapp 实现自定义缩略滚动条

<template><view class"container-scroll"><!-- 文字导航 --><scroll-view class"scroll-view-text" scroll-x"true" v-if"type 1"><navigator:url"item.url"class"scroll-view-item"…

LE-50821F/FA激光扫描传感器|360°避障雷达之功能与连接使用说明

LE-50821F/FA激光扫描传感器|360避障雷达广泛应用于工业自动化、移动机器人应用场景中的环境感知、高精度定位&#xff08;如建图、扫描、避障、防护等&#xff09; LE-50xxxF系列升级扫描频率最高可达600KHz​​​​。 本文重点介绍LE-50821F/FA激光扫描传感器|360避障雷达之…

【C++】二维数组 数组名

二维数组名用途 1、查看所占内存空间 2、查看二维数组首地址 针对第一种用途&#xff0c;还可以计算数组有多少行、多少列、多少元素 针对第二种用途&#xff0c;数组元素、行数、列数都是连续的&#xff0c;且相差地址是有规律的 下面是一个实例 #include<iostream&g…

FreeRTOS基础入门——FreeRTOS的系统配置(三)

个人名片&#xff1a; ​ &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir202…

基于大模型的Agent

2023年&#xff0c;对于所有的人工智能领域只有一个共同的主题——大模型。大模型的受关注程度与发展速度可谓前所未有。其中&#xff0c;基于大模型的Agent又是最近几个月大模型领域的热点。这不开始研究没有几个月&#xff0c;综述文章都出来了&#xff0c;你说快不快&#x…

FashionAI比赛-服饰属性标签识别比赛赛后总结(来自 Top14 Team)

关联比赛: FashionAI全球挑战赛—服饰属性标签识别 推荐大家看本篇博客之前&#xff0c;看一下数据集制作的方法&#xff0c;如何做一个实用的图像数据集 PS&#xff1a;我是参加完比赛之后才看的&#xff0c;看完之后&#xff0c;万马奔腾.....&#xff0c;因为发现比赛中还…

62 函数参数——传递参数时的序列解包

与可变长度的参数相反&#xff0c;这里的序列解包是指实参&#xff0c;同样也有 * 和 ** 两种形式。 ① 调用含有多个位置参数的函数时&#xff0c;可以使用 Python 列表、元组、集合、字典以及其他可迭代对象作为实参&#xff0c;并在实参名称前加一个星号&#xff0c;Python …

element-ui/plus使用el-date-picker周 选择器返回时间范围处理案例

element-ui/plus使用el-date-picker周 选择器返回时间范围处理案例 如图所示 <el-date-pickerchange"changeTime":picker-options"{ firstDayOfWeek: 1 }"v-model"value1"type"week"format"YYYY年 第ww周"placeholder&…

C++初学者指南-5.标准库(第二部分)--数值运算算法

C初学者指南-5.标准库(第二部分)–数值运算算法 文章目录 C初学者指南-5.标准库(第二部分)--数值运算算法iota (注意不是itoa函数)Reductions reduce transform_reduce遗留操作&#xff08;无法并行执行&#xff09;accumulate (≈ reduce) C98inner_product (≈ transform_r…

sanger序列拼接--一次错误示范

文章目录 目的实现步骤 目的 NGS得到了很多的reads&#xff0c;其中有一些paired reads我想根据overlap 搭建起来&#xff0c;因为我对序列的ID做了删减&#xff0c;所以再pandaseq那里跑不通。 总结来说&#xff0c;目的很简单&#xff0c;就是把 有重叠区域的 reads 搭起来…

【学习笔记】A2X通信的协议(二)- A2X配置参数

目录 5. A2X配置参数 5.1 一般说明 5.2 A2X配置参数的配置和优先级 5.2.1 一般说明 5.2.2 A2X配置参数的优先级 5.2.3 通过PC5进行的A2X通信的配置参数 5.2.4 广播远程ID&#xff08;BRID&#xff09;的配置参数 5.2.5 直接检测和避免&#xff08;DDAA&#xff09;的配…

解决 Beyond Compare 30天过期问题

解决 Beyond Compare 30天过期的步骤如下&#xff1a; 1、使用快捷键WinR打开运行窗口&#xff0c;输入regedit并回车&#xff0c;打开注册表编辑器。 2、在注册表编辑器中&#xff0c;找到Beyond Compare的注册表位置&#xff0c;路径通常是HKEY_CURRENT_USER\Software\Scoot…

【redis】springboot 用redis stream实现MQ消息队列 考虑异常ack重试场景

redis stream是redis5引入的特性&#xff0c;一定程度上借鉴了kafka等MQ的设计&#xff0c;部署的redis版本必须 > 5 本文主要讲的是思路&#xff0c;结合简单的源码分析&#xff08;放心&#xff0c;无需深入大量源码&#xff09;&#xff1b;讲述在redis stream文档缺乏&a…

港科夜闻 | 香港科大,中大,港大及国大获旭日慈善基金捐款港币五千万元,支持基础数学研究及人才发展...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大、中大、港大及国大获旭日慈善基金捐款港币五千万元&#xff0c;支持基础数学研究及人才发展。香港科大校长叶玉如教授在会上代表四所大学&#xff0c;就旭日慈善基金会对推动高等教育及基础研究发展的慷慨支持&…

探索智谱AI的视频生成神器:CogVideoX完全指南

引言 在当今数字化和内容创作高度发达的时代&#xff0c;视频已经成为信息传播和营销的重要工具。然而&#xff0c;对于许多缺乏视频制作经验或资源的个人和企业而言&#xff0c;如何快速、高效地创建吸引人的视频仍然是一个挑战。智谱AI推出的CogVideoX&#xff0c;作为一款先…

PuerTS和HybridCLR哪个更适合开发微信小游戏

1&#xff09;PuerTS和HybridCLR哪个更适合开发微信小游戏 2&#xff09;使用了Play Asset Delivery提交版本被Google报错 3&#xff09;怎样设置normalize来改变摄像机位置 4&#xff09;如何禁用增强型输入法中除某些输入操作之外的输入操作 这是第397篇UWA技术知识分享的推送…

CodeWave常用功能

1、CodeWave添加H5或PC端 CodeWave在左侧侧边栏&#xff0c;可通过“”按钮&#xff0c;直接添加PC端或H5端&#xff0c;或添加页面。 2、修改主题颜色 CodeWave左侧栏对应端的更多按钮中&#xff0c;可对权限及主题色进行修改。 在主题样式修改页面&#xff0c;右侧提供了预…