消息队列实现AB进程对话

进程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.rhkb.cn/news/270366.html

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

相关文章

3/5 work

1> 使用select实现tcp的服务器端&#xff0c;poll实现tcp的客户端&#xff08;君子作业&#xff09; 2> 将课堂上实现的模型重新自己实现一遍 #include<myhead.h> #define SER_IP "192.168.124.23" #define SER_PORT 8888 int main(int a…

html 文字滚动

<marquee> 标签 创建文字滚动的标签 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>wzgd</title></head><body><marquee direction"left" height"30" width"600&q…

python并发编程:IO模型

一 IO模型 二 network IO 再说一下IO发生时涉及的对象和步骤。对于一个network IO \(这里我们以read举例\)&#xff0c;它会涉及到两个系统对象&#xff0c;一个是调用这个IO的process \(or thread\)&#xff0c;另一个就是系统内核\(kernel\)。当一个read操作发生时&#xff…

USB - Linux Kernel Menuconfig

Linux kernel&#xff0c;make menuconfig&#xff0c;和USB相关的&#xff0c;在主菜单选择Device Drivers。 Device Drivers下面&#xff0c;找到USB support。 在USB support下面&#xff0c;就可以对USB相关的item进行设置。 按照从上到下的顺序&#xff0c;打开的设置依次…

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

全球最强AI易主!OpenAI不是唯一的人工智能公司

近日&#xff0c;AI大模型初创公司Anthropic发布了备受瞩目的Claude 3系列模型&#xff0c;这一系列模型在多个AI评估指标上领先于业界标准LLM&#xff0c;成为全球最强的人工智能模型。这一突破不仅给OpenAI带来了巨大的压力&#xff0c;同时也展示了Anthropic在人工智能领域的…

【C++STL详解 —— string类】

【CSTL详解 —— string类】 CSTL详解 —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、…

解决DBeaver执行脚本报错No active connection

解决DBeaver执行脚本报错No active connection 1、报错问腿 2、问题解决 2.1、右键点击该数据库&#xff0c;选择SQL编辑器&#xff0c;选择新建SQL编辑器&#xff0c;然后将sql语句复制过去。 或者左击选中数据库后直接使用快捷键 Ctrl] 2.2、在Project-General中找到Scr…

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

2024.3.6

作业1&#xff1a;使用C语言完成数据库的增删改 #include <myhead.h>//定义添加员工信息函数 int Add_worker(sqlite3 *ppDb) {//准备sql语句printf("请输入要添加的员工信息:\n");//从终端获取员工信息char rbuf[128]"";fgets(rbuf,sizeof(rbuf),s…

【C++】继续学习 string类 吧

开始使用 string类 吧 1 继续学习1.1 扩容机制1.2 string类对象的访问及遍历操作1.3 string类对象的修改操作1.4 其他一些成员函数 2 实践解决问题&#xff1a;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&…

【好书推荐-第九期】Sora核心技术相关书籍《扩散模型:从原理到实战》与《GPT 图解:大模型是怎样构建的》:Sora的两大核心技术,都藏在这两本书里!

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

C 嵌入式系统设计模式 20:队列模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之六…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候&#xff0c;打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因&#xff1a; 修bug&#xff0c;改来改去遇到了以下两种页面&#xff1a; 此时http://127.0.0.1:7860可以如下正常显示&#xff1a; 查资料的时候找…

外包干了10天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

域名 DNS 信息查询 API 数据接口

域名 DNS 信息查询 API 数据接口 网络工具&#xff0c;多种记录类型数据返回&#xff0c;丰富的信息结构&#xff0c;毫秒级响应。 1. 产品功能 提供域名 DNS 解析完整记录&#xff1b;丰富的解析记录类型&#xff0c;包括&#xff1a;A, AAAA, MX, TXT, NS, CNAME, SRV, PTR…

SPI 接口

SPI 接口 SPI 简介寻址方式通信过程极性和相位IIC 和 SPI 的异同相同点不同点 SPI 简介 SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外设接口的缩写&#xff0c;SPI是一种高速的、全双工、同步的串行通信总线&#xff1b;SPI采用主从方式工作&#xff0c;一…

强大的ps 命令 -o 自定义输出内容选项

强大的ps 命令 -o 自定义输出内容选项 1、ps命令介绍和作用2、问题描述 1、ps命令介绍和作用 ps 是一个 Unix 和类 Unix 操作系统中常用的命令&#xff0c;用于显示当前运行的进程信息。ps 命令的作用包括&#xff1a; 查看进程信息&#xff1a; ps 命令可以列出当前系统中正…

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…

JavaScript实现点击鼠标弹钢琴的效果

思路&#xff1a; 图片设置宽900px&#xff0c;找到鼠标按下时的x坐标和img距离body的x坐标&#xff0c;两个值相减&#xff0c;然后除100取整&#xff0c;赋值给a&#xff0c;通过判断a的值来确定放出那个音乐。 完整代码&#xff1a; <!DOCTYPE html> <html lan…