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

【IO】使用消息队列完成两个进程之间相互通信

目录

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

2、共享内存实现两个进程之间的通信

3、思维导图


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

//msgsnd.c
#include <myhead.h>// 要发送的消息类型
struct msgbuf
{long mtype;char mtext[1024];
};// 定义一个宏,为后面需要传入数据的大小
#define SIZE sizeof(struct msgbuf) - sizeof(long)int main(int argc, char const *argv[])
{// 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("msqid error");return -1;}// 向消息队列中存放消息struct msgbuf buf;// 创建父子进程int pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid == 0){// 子进程,用于读取消息队列中类型为2的数据while (1){// 读取消息队列中类型为1的数据msgrcv(msqid, &buf, SIZE, 2, 0);if (strcmp(buf.mtext, "quit") == 0){break;}// 直接输出到终端,读到了什么内容printf("\n接收到的数据为:%s\n", buf.mtext);}}// 父进程// 向消息队列中存放类型为1数据while (1){// 发送消息为1的数据buf.mtype = 1;printf("请输入消息内容>>>");fgets(buf.mtext, SIZE, stdin);buf.mtext[strlen(buf.mtext) - 1] = 0; // 将回车变成'\0'// 将数据以阻塞的形式发送到消息队列中msgsnd(msqid, &buf, SIZE, 0);printf("发送成功\n");}wait(NULL);return 0;
}
//msgrecv.c
#include <myhead.h>// 要接收的消息类型
struct msgbuf
{long mtype;char mtext[1024];
};// 定义一个宏,为后面需要传入数据的大小
#define SIZE sizeof(struct msgbuf) - sizeof(long)int main(int argc, char const *argv[])
{// 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("msqid error");return -1;}// 向消息队列中存放消息struct msgbuf buf;// 创建父子进程int pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid == 0){// 子进程,用于读取消息队列中类型为1的数据while (1){// 读取消息队列中类型为1的数据msgrcv(msqid, &buf, SIZE, 1, 0);if (strcmp(buf.mtext, "quit") == 0){break;}// 直接输出到终端,读到了什么内容printf("\n接收到的数据为:%s\n", buf.mtext);}// 删除消息队列if (msgctl(msqid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}exit(EXIT_SUCCESS);}// 父进程// 向消息队列中存放类型为2数据while (1){// 向消息队列中存放类型为2的数据buf.mtype = 2;printf("请输入消息内容>>>");fgets(buf.mtext, SIZE, stdin);buf.mtext[strlen(buf.mtext) - 1] = 0; // 将回车变成'\0'// 将数据以阻塞的形式发送到消息队列中msgsnd(msqid, &buf, SIZE, 0);printf("发送成功\n");}wait(NULL);return 0;
}

 输出结果如下:实现两个进程之间的通信

2、共享内存实现两个进程之间的通信

//shmsnd.c
#include<myhead.h>
#include<sys/user.h>
int main(int argc, char const *argv[])
{//创建key值用于创建共享内存段key_t key = ftok("/",'t');if(key == -1){perror("ftok error");return -1;}printf("key = %d\n",key);//2、创建一个共享内存的对象int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}printf("shmid = %d\n",shmid);//3、将共享内存段映射到程序中来char *addr = (char *)shmat(shmid,NULL,0);//参数1:共享内存id号//参数2:系统自动映射对齐页//参数3:对共享内存的操作权限为读写权限printf("addr = %p\n",addr); //输出映射的地址//读出共享内存中的数据printf("消息为:%s",addr);sleep(5);if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享内存if(shmctl(shmid, IPC_RMID, NULL) == -1){perror("shmctl error");return -1;}while(1);return 0;
}
//shmrecv.c
#include<myhead.h>
#include<sys/user.h>
int main(int argc, char const *argv[])
{//创建key值用于创建共享内存段key_t key = ftok("/",'t');if(key == -1){perror("ftok error");return -1;}printf("key = %d\n",key);//2、创建一个共享内存的对象int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}printf("shmid = %d\n",shmid);//3、将共享内存段映射到程序中来char *addr = (char *)shmat(shmid,NULL,0);//参数1:共享内存id号//参数2:系统自动映射对齐页//参数3:对共享内存的操作权限为读写权限printf("addr = %p\n",addr); //输出映射的地址//向共享内存中写入数据strcpy(addr,"hello a hua qing yuan jian\n");sleep(5);//取消映射关系if(shmdt(addr) == -1){perror("shmdt error");return -1;}while(1);return 0;
}

输出结果如下:

3、思维导图

相关文章:

【IO】使用消息队列完成两个进程之间相互通信

目录 1、使用消息队列完成两个进程之间相互通信 2、共享内存实现两个进程之间的通信 3、思维导图 1、使用消息队列完成两个进程之间相互通信 //msgsnd.c #include <myhead.h>// 要发送的消息类型 struct msgbuf {long mtype;char mtext[1024]; };// 定义一个宏&#…...

Web开发:用C#的逻辑理解VUE语法(VUE + Webapi小白开发笔记)

适用阅读对象&#xff1a;需要兼顾前端的C#后端开发人员&#xff08;基础笔记&#xff09; 目录 一、后端交互-获取实体数据 二、变量 1.声明 2.作用域 三、字符串的处理 四、数组(列表)的处理 1.数组中的SELECT语法&#xff08;提取特定字段到新数组&#xff09; 2.数…...

操作系统文件位置指针

文件位置指针 与标准IO的文件读写位置指针一样&#xff0c;系统IO时也会有一个表示位置的指针在移动&#xff0c;会随着读写操作的执行向后自动移动 当需要随机位置进行读写操作时&#xff0c;那么需要移动位置指针的位置 off_t lseek(int fd, off_t offset, int whence); 功…...

设计模式的概念

设计模式主要分为三类&#xff1a;创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式&#xff1a;简单工厂&#xff0c;工厂模式&#xff0c;抽象工厂&#xff0c;建造者&#xff0c;单例&#xff0c;原型 结构型设计模式&#xff1a;代理模式、享元模式 行…...

VMware17下载与安装

1.下载 通过百度网盘分享的文件&#xff1a;VMware17 链接&#xff1a;https://pan.baidu.com/s/1gCine3d3Rp_l3NYAu5-ojg 提取码&#xff1a;ek25 --来自百度网盘超级会员V3的分享 2.安装...

mv命令学习

移动和重命名文件 mv mv命令的作用就是将文件系统的文件从一个地方移动到另一个地方。 $ pwd /home/scott/libby $ ls libby_arrowrock.jpg libby_bak.jpg libby.jpg ➥libby_on_couch.jpg on_floor $ ls ~/pictures/dogs libby_on_floor_01.jpg libby_on_floor_03.jpg li…...

西北航天基地采用Infortrend NAS存储做影视后期及共享

用户背景&#xff1a; 创建最早的综合型航空航天基地&#xff0c;占地5万平方米&#xff0c;每年约300天进行航天试验 挑战&#xff1a; 西北航天基地规模大任务多&#xff0c;分别有不同的项目组负责试验&#xff0c;项目组需要获取试验任务影像资料&#xff0c;用于分析总…...

GitHub每日最火火火项目(8.6)

项目名称&#xff1a;bghira / SimpleTuner 项目介绍&#xff1a;SimpleTuner是一个通用的微调工具包&#xff0c;主要面向Stable Diffusion 2.1、Stable Diffusion 3、DeepFloyd和SDXL等模型。它旨在为这些模型提供一种方便的方式进行微调&#xff0c;以适应不同的应用场景和需…...

LangChain与CI/CD的无缝对接:自动化部署的新前沿

LangChain与CI/CD的无缝对接&#xff1a;自动化部署的新前沿 在当今快速发展的软件开发领域&#xff0c;持续集成/持续部署&#xff08;CI/CD&#xff09;已成为提升开发效率和软件质量的关键实践。LangChain&#xff0c;作为一个假设的编程辅助工具&#xff0c;如果存在&…...

Laravel为什么会成为最优雅的PHP框架?

目录 1. 设计哲学 1.1 表达性语法 1.2 约定优于配置 1.3 优雅的异常处理 2. 核心特性 2.1 Eloquent ORM 2.2 路由系统 2.3 Blade模板引擎 2.4 Artisan命令行工具 3. 社区支持 3.1 丰富的文档和教程 3.2 Packalyst&#xff1a;丰富的扩展包 3.3 社区活动和会议 4.…...

LabVIEW中的Reverse String函数与字节序转换

在LabVIEW中&#xff0c;数据的字节序&#xff08;也称为端序&#xff09;问题通常出现在数据传输和存储过程中。字节序可以分为大端&#xff08;Big-Endian&#xff09;和小端&#xff08;Little-Endian&#xff09;&#xff0c;它们分别表示高字节存储在低地址和低字节存储在…...

用OpenCV与MFC写一个简单易用的图像处理程序

工厂里做SOP及测试报告以及员工资格鉴定等常需用到简单的图像处理&#xff0c;PS等软件正版费用不菲&#xff0c;学习起来成本也高。Windows自带的图像处理软件&#xff0c;用起来也不是那么得心应手。因此我用OpenCV与MFC写了一个简单易用的图像处理程序。 程序界面 基于简单…...

go语言的actor框架和air工具有什么区别?

Go语言的Actor框架和Air工具在多个方面存在显著的区别&#xff0c;主要体现在它们的设计目的、功能特性以及应用场景上。 ### Go语言的Actor框架 **设计目的与功能特性**&#xff1a; * **设计目的**&#xff1a;Actor框架是专为高并发和分布式系统设计的编程模型。它通过将系统…...

e6.利用 docker 快速部署自动化运维平台

利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…...

回顾前面刷过的算法(4)

今天回顾一下下面三个算法&#xff0c;涉及到了动态规划、合并链表、位运算&#xff0c;好吧&#xff0c;让我们再次手敲一遍 //乘积最大子数组//思路: 维护三个变量&#xff0c;imax最大前缀乘积 imin最小前缀乘积 max最大连续乘积//由于元素有正负&#xff0c;imax和imin需…...

SourceTree配置多个不同Remote地址的仓库

需求 在我们开发过程中&#xff0c;有可能需要拉取的地址仓库不在同一个仓库中&#xff0c;有些可能在Github上&#xff0c;有些可能在Gitlab上。 所以我们需要配置Github的仓库的配置和Gitlab仓库的配置。 现在&#xff0c;我们来配置两个不同的仓库的地址。 假设&#xf…...

【Golang 面试 - 进阶题】每日 3 题(十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

自定义线程池(二)

上节回顾 在上一节当中&#xff0c;已经实现了一个线程池&#xff0c;在本节当中&#xff0c;我们需要添加拒绝策略。这里使用到了策略模式的设计模式&#xff0c;因为拒绝策略是多种的&#xff0c;我们需要将这个权利下放给调用者&#xff08;由调用者来指定我要采取哪种策略…...

【Linux】常见指令

目录 一、指令的理解二、Linux的目录结构三、XShell 下的热键四、shell命令以及运行原理五、Linux常见的指令汇总1. ls 指令1.1 常见的一些有关 ls 的别名1.2 隐藏文件或目录1.3 * 的匹配 2. pwd 指令3. cd 指令3.1 cd . . 指令 4. touch指令5. mkdir指令6. rmdir指令 &&am…...

uniapp自定义网格布局用于选择金额、输入框焦点事件以及点击逻辑实战

样式 <view class="withdraw-section"><text class="section-title">提现金额</text><view class="amount-options"><view v-for="(item, index) in list" :key="index" class="amount-opt…...

中小学创客室培养学生全面发展

随着时代的发展,教育也在飞速发展&#xff0c;教育决定着一个国家的未来&#xff0c;一个家庭的未来&#xff0c;一个人的未来&#xff0c;我国近年来大力鼓励科学教育&#xff0c;支持科学创新。因此&#xff0c;学校应该重视对学生的科学教育&#xff0c;尤其是处于思想启蒙阶…...

AI Agent智能体落地应用测试,一句话即可操控它执行工作

一、什么是Agent 在软件应用中&#xff0c;软件代理或智能代理&#xff0c;是一种能够自主执行任务或做出决策的计算机程序。它们可以用于自动化任务、个性化推荐、数据分析等&#xff0c;这一类的桌面应用称之为Agent。如Siri、Alexa、Google Assistant等&#xff0c;它们能够…...

免费的SD-WAN服务

SD-WAN&#xff0c;SASE&#xff0c;零信任是近年来比较火的概念&#xff0c;SD-WAN发展已经很久了&#xff0c;但是真正能够自主研发做SD-WAN的企业其实并不算太多。 比扬云的SD-WAN产品是自主研发的&#xff0c;可控性强&#xff0c;最重要的是具有免费版本&#xff0c;可以免…...

gradle安装及配置

文章目录 一、下载安装包二、解压文件三、环境变量配置四、验证安装结果五、配置国内源六、IDEA配置 一、下载安装包 从gradle官网下载安装包&#xff0c;官网地址为&#xff1a;https://gradle.org/releases/ 我们只需要下载编译好的文件即可。 二、解压文件 解压文件到指定…...

C-sharp-console-gui-framework:C#控制台应用程序的GUI框架

推荐一个.Net开源项目&#xff0c;方便我们基于控制台创建图形用户界面&#xff08;GUI&#xff09;应用程序。 01 项目简介 ConsoleGUI是一个简单的布局驱动.NET框架&#xff0c;用于创建基于控制台的GUI应用程序。 核心功能&#xff1a; **布局驱动&#xff1a;**与WPF或H…...

一文搞懂后端面试之MySQL MVCC【中间件 | 数据库 | MySQL | 隔离级别 | Read View】

为什么需要MVCC 锁本身就是用于并发控制的&#xff0c;那么为什么InnoDB还要引入MVCC&#xff0c;读写都加锁不就可以控制住并发吗&#xff1f; 锁确实可以&#xff0c;但是性能太差。如果是纯粹的锁&#xff0c;那么写和写、读和写、读和读之间都是互斥的。如果是读写锁&…...

Mysql执行计划(上)

1、执行计划的概念 执行计划是什么&#xff1a;使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。 作用&#xff1a;分析你的查询语句或是表结构的性能瓶颈 语法&#xff1a;Explain SQL语句 执行计划输出内容介绍&#…...

使用Python+moviepy截取音频片段

一、使用AudioFileClip对象的subclip函数&#xff0c;截取1秒至3秒的音频 from moviepy.editor import *auAudioFileClip("/home/Download/test.mp3") # 创建对象clipau.subclip(1,3) # 截取1秒至3秒的音频clip.write_audiofile("/home/Download/clip.mp3"…...

Java学习Day19

动态SQL语句标签 1.if 用于根据条件判断是否包括某段 SQL 代码 <if test"checktext !null and check !"> 2.<choose>, <when>, <otherwise>类似于 Java 的 switch 语句&#xff0c;用于在多个条件中选择一个。 <select id"getSt…...

8.达梦数据库常用SQL

文章目录 前言1. 服务器资源1.1 CPU使用率1.2 内存使用率 2 数据库实例管理2.1 查询版本号2.2 查询ini配置2.3 查询归档配置2.4 数据库实例初始化参数2.5 查看数据库信息2.6 查看数据库实例信息2.7 查看数据库实例信息2.8 查看授权信息2.9 查询页大小&#xff0c;字符集大小2.1…...