进程线程通信-day6

1、将信号和消息队列的课堂代码敲一遍

//发送端

#include<myhead.h>//定义一个消息结构类型
struct msgbuf
{long mtype;char mtext[1024];
};
//定义一个宏,表示消息正文大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));printf("请输入当前信息的类型:");scanf("%ld",&sbuf.mtype);//吸收回车getchar();printf("请输入消息正文:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//将sub.mtext中'\n'转化为'\0'sbuf.mtext[strlen(sbuf.mtext)-1]='\0';//将消息存放入队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");//输入结束条件if(strcmp(sbuf.mtext,"quit")==0)break;}return 0;
}

//接收端

#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;}printf("ftok success key=%#x\n",key);//2、根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid,&rbuf,MSGSIZE,0,0);//第一个0:表示一直读取队列第一个消息//第二个0:表示阻塞读取//只接受类型1msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("收到消息为:%s\n",rbuf.mtext);//输出结束条件if(strcmp(rbuf.mtext,"quit")==0)break;}return 0;
}

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

//用户1

#define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[])
{key_t key=0;if((key=ftok("/",'k'))==-1){perror("ftok error");return -1;}printf("ftok success key=%#x\n",key);int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);//创建父子进程pid_t pid=fork();if(pid>0){//父进程struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));printf("请输入消息类型:");scanf("%ld",&sbuf.mtype);//吸收回车getchar();printf("请输入消息正文:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//将sub.mtext中'\n'转化为'\0'sbuf.mtext[strlen(sbuf.mtext)-1]='\0';//将消息存放入队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");//输入结束条件if(strcmp(sbuf.mtext,"quit")==0)break;}}else if(pid==0){//子进程struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid,&rbuf,MSGSIZE,0,0);//第一个0:表示一直读取队列第一个消息//第二个0:表示阻塞读取//只接受类型1msgrcv(msqid,&rbuf,MSGSIZE,2,0);printf("收到消息为:%s\n",rbuf.mtext);//输出结束条件if(strcmp(rbuf.mtext,"quit")==0)break;}exit(EXIT_SUCCESS);}	else{perror("fork error");return -1;}return 0;
}

//用户2

#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;}printf("ftok success key=%#x\n",key);//2、根据key值创建一个消息队列int msqid=-1;if((msqid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}printf("msgget success msqid=%d\n",msqid);//定义父子进程pid_t pid=fork();if(pid>0){//父进程struct msgbuf rbuf;while(1){//清空正文的容器bzero(rbuf.mtext,sizeof(rbuf.mtext));//从消息队列中读取一个消息//msgrcv(msqid,&rbuf,MSGSIZE,0,0);//第一个0:表示一直读取队列第一个消息//第二个0:表示阻塞读取//只接受类型1msgrcv(msqid,&rbuf,MSGSIZE,1,0);printf("收到消息为:%s\n",rbuf.mtext);//输出结束条件if(strcmp(rbuf.mtext,"quit")==0)break;}exit(EXIT_SUCCESS);}else if(pid==0){//子进程struct msgbuf sbuf;while(1){//清空正文的容器bzero(sbuf.mtext,sizeof(sbuf.mtext));printf("请输入数据类型:");scanf("%ld",&sbuf.mtype);//吸收回车getchar();printf("请输入消息正文:");fgets(sbuf.mtext,sizeof(sbuf.mtext),stdin);//将sub.mtext中'\n'转化为'\0'sbuf.mtext[strlen(sbuf.mtext)-1]='\0';//将消息存放入队列中msgsnd(msqid,&sbuf,MSGSIZE,0);printf("发送成功\n");//输入结束条件if(strcmp(sbuf.mtext,"quit")==0)break;}}else{perror("fork error");return -1;}return 0;
}

3、思维导图

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

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

相关文章

CSS实现半边边框(只有边框的部分可见)

CSS实现半边边框&#xff08;只有边框的部分可见&#xff09; <div class"part box"><h1>内容</h1><!-- 绘出下面两个对角边框--><div class"part-footer"></div> </div>主要代码 .box {width: 100px;height:…

cmake 项目。qt5升级 qt6 报错 error: “Qt requires a C++17 compiler 已解决

日常项目开发中。需要对qt5升级到qt6 做cmake兼容配置&#xff0c;在编译中发现&#xff0c;有c 编译环境 报错 2>C:\Qt\6.5.3\msvc2019_64\include\QtCore/qcompilerdetection.h(1226,1): fatal error C1189: #error: "Qt requires a C17 compiler, and a suitable …

ChatGPT的增长已经进入了瓶颈期

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Vue3自定义组件v-model双向绑定

无能吐槽一下&#xff0c;虽然用了很多遍v-model&#xff0c;但是还是不得要领&#xff0c;每次看官网都感觉说的不是很清晰&#xff0c;在写的时候还是要查看文档&#xff0c;可能就是不理解原理&#xff0c;这次特意好好写一篇文章&#xff0c;让自己好好理解一下。 自定义一…

React18源码: React调度中的3种优先级类型和Lane的位运算

优先级类型 React内部对于优先级的管理&#xff0c;贯穿运作流程的4个阶段&#xff08;从输入到输出&#xff09;&#xff0c;根据其功能的不同&#xff0c;可以分为3种类型&#xff1a; 1 &#xff09;fiber优先级(LanePriority) 位于 react-reconciler包&#xff0c;也就是L…

HarmonyOS Stage模型 应用配置文件讲解

好&#xff0c;上文 HarmonyOS Stage模型基本概念讲解 中&#xff0c;我们简单讲解了HarmonyOS 中 Stage模型的基本概念 那么 我们继续学习Stage模型的相关知识 上文之后 我们肯定对它的概念和基本结构 有了一个了解 那么 我们就来看一下 基于Stage模型 它里面一些基本的配置文…

FPGA领域顶级学术会议

FPGA领域顶级学术会议主要有FPGA,FCCM,FPL和FPT。 1 FPGA 会议全名是: ACM/SIGDA International Symposium on Field-Programmable Gate Arrays 网站是:https://dl.acm.org/conference/fpga FPGA常年在美国举办,每年2月,偏FPGA基础研究; 该会议的论文免费下载。这个比…

Java项目:26 基于SpringBoot+thymeleaf实现的蓝天幼儿园管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于SpringBootthymeleaf实现的蓝天幼儿园管理系统是为幼儿园提供的一套管理平台&#xff0c;可以提高幼儿园信息管理的准确性&#xff0c;系统将信息…

数据结构D4作业

1.实现单向循环链表的功能 loop.c #include "loop.h" loop_p create_loop() { loop_p H(loop_p)malloc(sizeof(loop)); if(HNULL) { printf("创建失败\n"); return NULL; } H->len0; H->nextH; ret…

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…

Matlab/simulink光伏发电的扰动观察法MPPT仿真(持续更新)

1.光伏发电的电导增量法MPPT仿真 2.光伏发电的恒定电压法MPPT仿真 3.光伏发电的扰动观察法MPPT仿真 4.光伏发电的占空比法MPPT仿真 5.基于神经网络的MPPT光伏发电仿真 6. 基于模糊控制的MPPT光伏发电仿真 7. 基于粒子群算法&#xff08;PSO&#xff09;的500w光伏系统MPPT控…

WRF WPS : namelist 学习笔记

WPS & share 采用ARW方式进行模拟&#xff0c;除了ARW还有NMM,不过科研上常用ARW: wrf_core ‘ARW’最大的嵌套层数为3层&#xff0c;初学者一般是从一层开始逐步加多: max_dom 3 # max_dom 2设置模式开始和结束 的时间&#xff0c;从左到右依次是第一层第二层和第三…

ChatGPT plus 的平替:9个可以联网的免费AI搜索引擎

ChatGPT plus 的平替&#xff1a;9个可以联网的免费AI搜索引擎。 由于ChatGPT 训练数据截止到2021年9月&#xff0c;在该时间点之后发生的事件&#xff0c;ChatGPT均无法给出答复。所以&#xff0c;大家现在都非常期待ChatGPT能够联网&#xff0c;访问实时的信息。 ChatGPT pl…

可在线免费使用的5款ChatGPT平替网站!

可在线免费使用的5款ChatGPT平替网站&#xff01; 渗透智能 ShirtAI 是一款全方位AI产品&#xff0c;集成问答绘画导图等功能!支持联网功能、 支持上下文对话、支持模糊匹配自定义回复消息、 支持注册配置自定义赠送额度、支持生成专属邀请码邀请用户双方共同获得额度。 https…

Intel处理器虚拟化技术VT-x86下实现小型虚拟化框架(1)

一.前言 我一直觉得&#xff0c;学习计算机中的一门新技术&#xff0c;一定要从历史去了解他的全貌。这样有利于我们了解事情的来龙去脉和发展的过程。一上来直接接触新兴事物&#xff0c;很容易陷入不知从何下手的困境。不了解历史发展&#xff0c;就不明白前人的一些操作。因…

设计模式3-行为模式-责任链模式

文章目录 一、责任链如何设计1、定义责任链处理对象1.1、抽象类1.2、责任链处理对象 2、将“每个链”组合起来&#xff0c;定一个枚举2.1、枚举对象2.2、责任链对象 3、调用时&#xff0c;如何获取责任链对象3.1、获取责任链对象方法3.2、责任链工厂方法--将这些独立的“链”链…

LeetCode---385周赛

题目 3042. 统计前后缀下标对 I 3043. 最长公共前缀的长度 3044. 出现频率最高的质数 3045. 统计前后缀下标对 II 一、最长公共前缀的长度 这题可以用字典树来做。 这里简单介绍一下字典树&#xff0c;顾名思义&#xff0c;这是用来存放单词的树&#xff0c;如何存&#x…

Spring 手动实现Spring底层机制

目录 一、前言 二、Spring底层整体架构 1.准备工作 : 2.架构分析 : &#xff08;重要&#xff09; 3.环境搭建 &#xff1a; 三、手动实现Spring容器结构 1.自定义注解 : 1.1 Component注解 1.2 Scope注解 2.自定义组件 : 3.自定义用于封装Bean信息的BeanDefinition类&a…

AI生成图片网站测评

主要测评文章配图生成效果、绘制logo等效果 测评关键点&#xff1a;生成效果、网站易用度、是否免费 测评prompt&#xff1a;请生成一个文章内容配图&#xff0c;图片比例是3&#xff1a;2&#xff0c;文章主旨是AI既是机遇&#xff0c;也存在挑战和风险&#xff0c;要求图片…

Linux-基础知识(黑马学习笔记)

硬件和软件 我们所熟知的计算机是由&#xff1a;硬件和软件组成。 硬件&#xff1a;计算机系统中电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。 软件&#xff1a;是用户和计算机硬件之间的接口和桥梁&#xff0c;用户通过软件与计算机进行交流。 而操作系统…