【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小白开发笔记)
适用阅读对象:需要兼顾前端的C#后端开发人员(基础笔记) 目录 一、后端交互-获取实体数据 二、变量 1.声明 2.作用域 三、字符串的处理 四、数组(列表)的处理 1.数组中的SELECT语法(提取特定字段到新数组) 2.数…...
操作系统文件位置指针
文件位置指针 与标准IO的文件读写位置指针一样,系统IO时也会有一个表示位置的指针在移动,会随着读写操作的执行向后自动移动 当需要随机位置进行读写操作时,那么需要移动位置指针的位置 off_t lseek(int fd, off_t offset, int whence); 功…...
设计模式的概念
设计模式主要分为三类:创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式:简单工厂,工厂模式,抽象工厂,建造者,单例,原型 结构型设计模式:代理模式、享元模式 行…...
VMware17下载与安装
1.下载 通过百度网盘分享的文件:VMware17 链接:https://pan.baidu.com/s/1gCine3d3Rp_l3NYAu5-ojg 提取码: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存储做影视后期及共享
用户背景: 创建最早的综合型航空航天基地,占地5万平方米,每年约300天进行航天试验 挑战: 西北航天基地规模大任务多,分别有不同的项目组负责试验,项目组需要获取试验任务影像资料,用于分析总…...
GitHub每日最火火火项目(8.6)
项目名称:bghira / SimpleTuner 项目介绍:SimpleTuner是一个通用的微调工具包,主要面向Stable Diffusion 2.1、Stable Diffusion 3、DeepFloyd和SDXL等模型。它旨在为这些模型提供一种方便的方式进行微调,以适应不同的应用场景和需…...
LangChain与CI/CD的无缝对接:自动化部署的新前沿
LangChain与CI/CD的无缝对接:自动化部署的新前沿 在当今快速发展的软件开发领域,持续集成/持续部署(CI/CD)已成为提升开发效率和软件质量的关键实践。LangChain,作为一个假设的编程辅助工具,如果存在&…...
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:丰富的扩展包 3.3 社区活动和会议 4.…...
LabVIEW中的Reverse String函数与字节序转换
在LabVIEW中,数据的字节序(也称为端序)问题通常出现在数据传输和存储过程中。字节序可以分为大端(Big-Endian)和小端(Little-Endian),它们分别表示高字节存储在低地址和低字节存储在…...
用OpenCV与MFC写一个简单易用的图像处理程序
工厂里做SOP及测试报告以及员工资格鉴定等常需用到简单的图像处理,PS等软件正版费用不菲,学习起来成本也高。Windows自带的图像处理软件,用起来也不是那么得心应手。因此我用OpenCV与MFC写了一个简单易用的图像处理程序。 程序界面 基于简单…...
go语言的actor框架和air工具有什么区别?
Go语言的Actor框架和Air工具在多个方面存在显著的区别,主要体现在它们的设计目的、功能特性以及应用场景上。 ### Go语言的Actor框架 **设计目的与功能特性**: * **设计目的**:Actor框架是专为高并发和分布式系统设计的编程模型。它通过将系统…...
e6.利用 docker 快速部署自动化运维平台
利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…...
回顾前面刷过的算法(4)
今天回顾一下下面三个算法,涉及到了动态规划、合并链表、位运算,好吧,让我们再次手敲一遍 //乘积最大子数组//思路: 维护三个变量,imax最大前缀乘积 imin最小前缀乘积 max最大连续乘积//由于元素有正负,imax和imin需…...
SourceTree配置多个不同Remote地址的仓库
需求 在我们开发过程中,有可能需要拉取的地址仓库不在同一个仓库中,有些可能在Github上,有些可能在Gitlab上。 所以我们需要配置Github的仓库的配置和Gitlab仓库的配置。 现在,我们来配置两个不同的仓库的地址。 假设…...
【Golang 面试 - 进阶题】每日 3 题(十三)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
自定义线程池(二)
上节回顾 在上一节当中,已经实现了一个线程池,在本节当中,我们需要添加拒绝策略。这里使用到了策略模式的设计模式,因为拒绝策略是多种的,我们需要将这个权利下放给调用者(由调用者来指定我要采取哪种策略…...
【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…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
