消息队列实现AB进程对话

news/2024/7/27 11:34:04/文章来源:https://blog.csdn.net/Volimteczh/article/details/136519854

进程A代码: 

 #include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdlib.h>#include <string.h>#define MSG_EXCEPT 020000struct msgbuf{long mtype;char mtext[100];};int main(int argc, const char *argv[]){//key是msgget中的键值//ftok中的第二个参数是一个非零数key_t key1 = ftok("/home/ubuntu/",2);if(key1<0){perror("ftok");return-1;}printf("key = %#x\n",key1);//创建消息队列int msqid1 = msgget(key1,IPC_CREAT|0664);if(msqid1<0){perror("msgget");return -1;}printf("msqid = %d\n",msqid1);key_t key2 = ftok("/home/ubuntu/",2);if(key2<0){perror("ftok");return-1;}printf("key = %#x\n",key2);//创建消息队列int msqid2 = msgget(key2,IPC_CREAT|0664);if(msqid2<0){perror("msgget");return -1;}printf("msqid = %d\n",msqid2);struct msgbuf snd;//A发送while(1){printf("请输入消息类型>>>");scanf("%ld",&snd.mtype);getchar();if(snd.mtype <= 0){break;}printf("请输入消息内容>>");fgets(snd.mtext,sizeof(snd.mtext),stdin);snd.mtext[strlen(snd.mtext)-1] = '\0';//第一个参数是消息队列,第二个参数消息队列的类型和内容//第三个参数消息内容的大小,第四个参数0:阻塞方式发送if(msgsnd(msqid1,(void*)&snd,sizeof(snd.mtext),0)<0){perror("msgsnd");return -1;}if(strcmp(snd.mtext,"quit") == 0){break;}printf("发送消息成功\n");                                                                                                                         system("ipcs -q");ssize_t res = 0;res = msgrcv(msqid2,&snd,sizeof(snd.mtext),0,0);if(res < 0){perror("msgrcv");return -1;}if(strcmp(snd.mtext,"quit") == 0){break;}printf("res=%ld | mtype=%ld:mtext=%s\n",res,snd.mtype,snd.mtext);}if(msgctl(msqid1,IPC_RMID,NULL) < 0){perror("msgctl");return -1;}if(msgctl(msqid2,IPC_RMID,NULL) < 0){perror("msgctl");return -1;}printf("删除队列成功!\n");system("ipcs -q");return 0;}

进程B代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
//MSG_EXCEPT的宏需要追加复制过来
#define MSG_EXCEPT 020000
struct msgbuf
{long mtype;char mtext[100];
};
int main(int argc, const char *argv[])
{key_t key1 = ftok("/home/ubuntu/",2);if(key1<0){perror("ftok");return-1;}printf("key1 = %#x\n",key1);int msqid1 = msgget(key1,IPC_CREAT|0664);if(msqid1<0){perror("msgget");return -1;}printf("msqid = %d\n",msqid1);key_t key2 = ftok("/home/ubuntu/",2);if(key2<0){perror("ftok");return-1;}printf("key = %#x\n",key2);int msqid2 = msgget(key2,IPC_CREAT|0664);if(msqid2<0){perror("msgget");return -1;}printf("msqid = %d\n",msqid2);ssize_t res = 0;struct msgbuf rcv;while(1){system("ipcs -q");//A接收//第三个参数,msgtyp==0,读取队列中第一条消息,先进先出//>0指定消息类型读取//第四个参数,0为阻塞方式接收,IPC_NOWAIT非阻塞方式接收//读取消息队列中的第一条消息res = msgrcv(msqid1,&rcv,sizeof(rcv.mtext),0,0);/*  //读取消息队列中的第一条消息类型为100的消息res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),100,0);//读取消息队列中的第一条消息类型不为100的消息res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),100,MSG_EXCEPT);*/if(strcmp(rcv.mtext,"quit") == 0){break;}if(res < 0){perror("msgrcv");return -1;}printf("res=%ld | mtype=%ld:mtext=%s\n",res,rcv.mtype,rcv.mtext);//B发送printf("请输入消息类型>>>");scanf("%ld",&rcv.mtype);getchar();printf("请输入消息内容>>>");fgets(rcv.mtext,sizeof(rcv.mtext),stdin);if(strcmp(rcv.mtext,"quit") == 0){break;}rcv.mtext[strlen(rcv.mtext)-1] = '\0';if(msgsnd(msqid2,(void*)&rcv,sizeof(rcv.mtext),0)<0){perror("msgsnd");return -1;}printf("发送消息成功!\n");system("ipcs -q");}//删除消息队列if(msgctl(msqid1,IPC_RMID,NULL) < 0){perror("msgctl");return-1;}if(msgctl(msqid2,IPC_RMID,NULL) < 0){perror("msgctl");return-1;}printf("删除消息队列成功!\n");system("ipcs -q");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt插件之输入法插件的构建和使用(一)

文章目录 输入法概述输入法插件实现及调用输入键盘搭建定义样式自定义按钮实现自定义可拖动标签数字符号键盘候选显示控件滑动控件手绘输入控件输入法概述 常见的输入法有三种形式: 1.系统级输入法 2.普通程序输入法 3.程序自带的输入法 系统级输入法就是咱们通常意义上的输入…

fatal: unable to access ‘***‘: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0解决方案

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文主要介绍在从 GitHub 上克隆 stable-diffusion-webui 项目时出现的 fatal: unable to access https://github.com/AUTOMATIC1111/stable-diffusion-webui.…

论文阅读笔记 | MetaIQA: Deep Meta-learning for No-Reference Image Quality Assessment

文章目录 文章题目发表年限期刊/会议名称论文简要动机主要思想或方法架构实验结果 文章链接&#xff1a;https://doi.org/10.48550/arXiv.2004.05508 文章题目 MetaIQA: Deep Meta-learning for No-Reference Image Quality Assessment 发表年限 2020 期刊/会议名称 Publi…

【Vue】sessionStorage存取数据

一. 需求 1.1 模板 Vab Admin Pro 1.2 组件 ElementUI 1.3 阐述 列表页面搜索【关键词】点击【查询】后&#xff0c;点击【查看】按钮跳转到【详情页】&#xff0c;详情页【返回】【保留原搜索关键词】 原图 搜索查询【关键词】 详情 返回后【保留】【搜索查询关键词…

vue3 setup函数与setup语法糖之间的区别

普通setup函数构建的组件 import {ref} from vueexport default {setup(){const countref(0)const handleUpdate()>{count.value}return{count,handleUpdate}}} </script>使用setup语法糖构建的组件 <script setup>import {ref} from vueconst countref(0)con…

人工智能在信息系统安全中的运用

一、 概述 对于企业和消费者来讲&#xff0c;人工智能是非常有用的工具&#xff0c;那又该如何使用人工智能技术来保护敏感信息?通过快速处理数据并预测分析&#xff0c;AI可以完成从自动化系统到保护信息的所有工作。尽管有些黑客利用技术手段来达到自己的目的&#xff0c;但…

Echarts 配置项 series 中的 data 是多维度

文章目录 需求分析 需求 如下图数据格式所示&#xff0c;现要求按照该格式进行绘制折线图 分析 在绘制折线图时&#xff0c;通常我们的 series 中的 data 数据是这样的格式 option {title: {text: Stacked Area Chart},tooltip: {trigger: axis,axisPointer: {type: cross…

阿里云配置服务器详细指南_2024新版CPU内存带宽系统盘选择

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

微前端之实现微前端的几种模式

微前端是什么 实现微前端的几种模式 基于路由分发&#xff1a;Web Components 或 Custom Elements&#xff1a;iframe集成&#xff1a;动态加载/懒加载微前端&#xff1a;容器化方案&#xff1a;single-spa 与 无界的区别 使用无界 准备工作 安装nvm安装pnpm 微前端是什么 微…

网康科技 NS-ASG 应用安全网关 SQL注入漏洞复现(CVE-2024-2022)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和IPSec,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短信认证、LDAP令牌、USB KEY等多达13种认证方式。 0x02 漏洞概述 …

挑战杯 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

Redis实战—商户查询缓存

本博客为个人学习笔记&#xff0c;学习网站&#xff1a;黑马程序员Redis入门到实战 实战篇之商户查询缓存 目录 什么是缓存 添加Redis缓存 缓存更新策略 数据库缓存不一致解决方案 案例&#xff1a;给查询商铺的缓存添加超时剔除和主动更新策略 缓存穿透 案例&#xff1…

Linux之cd、pwd、mkdir 命令

cd命令&#xff0c;切换目录 1&#xff09;当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录。 2&#xff09;我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 3&#xff09;cd命令来自英文&#xff1a;C…

Python 开发图形界面程序

用 Python 语言开发图形界面的程序&#xff0c;有2种选择&#xff1a; Tkinter 基于Tk的Python库&#xff0c;这是Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…

2024.03.02蓝桥云课笔记

1.scanf与printf取消分隔符的限制方法 示例代码&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 运行&#xff1a; 输入&#xff1a;Hello World 输出&#xff1a;Hello World 注&#xff1a;其中[]中是一个正则…

飞书云文档API操作详细介绍

1.场景分析 公司内部很多文档都是由多人进行维护的&#xff0c;随时发生变更&#xff0c;因此在利用这些数据的时候就需要直接读取云文档的数据&#xff0c;从而执行下一步动作。团队云文档api执行权限一般需要管理员审核才能使用。如果你就是管理员&#xff0c;那么恭喜你&am…

Python(NetOps)前传-网络设备开局配置

背景 我们知道用Python在cli配置网络设备的前提是&#xff1a; 网络设备与Python主机网络可达网络设备已开启并完成ssh相关配置 目标 本文已华为S5720S-52P-LI-AC交换机为例&#xff0c;完成&#xff1a; 完成网络设备开局配置&#xff1b;用Python脚本验证ssh登录 配置 …

html css 导航栏 2

鼠标划过会向上移动改变颜色 html文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>导航栏</title><link rel"stylesheet" href"css/dhl1.css" /></head><body><div …

Marin说PCB之POC电路layout设计仿真案例---01

最近娃哈哈饮料突然爆火&#xff0c;看新闻后才知道春晚的的时候宗老已经病的很严重了&#xff0c;现在也已经离我们而去了&#xff0c;宗老是一个值得我们尊敬爱戴的伟大企业家。于是乎小编我立马去他们的直播间买了一箱娃哈哈AD钙奶支持一下我们的国货。 中午午休的时候&…

LeetCode_25_困难_K个一组翻转链表

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 模拟 1. 题目 给你链表的头节点 h e a d head head &#xff0c;每 k k k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k k k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节…