2.5消息队列实现进程之间通信

send.c

#include<myhead.h>//定义消息类型
struct msgbuf
{long int mtype;  //消息类型char mtext[1024]; //消息正文内容
};//宏定义一个消息大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, const char *argv[])
{//1、创建key值以便创建消息队列key_t key=ftok("/",'l');if(key==-1){perror("ftok error");return -1;}//2、使用key值,打开一个消息对列int msgid;if((msgid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建父子进程pid_t pid;pid=fork();if(pid<0){perror("fork error");return -1;}else if(pid==0)         //子进程写入数据{struct msgbuf buf={.mtype=100};//3、向消息队列中存放数据//定义一个消息便量while(1){//清空数组bzero(buf.mtext,sizeof(buf.mtext));fgets(buf.mtext,sizeof(buf.mtext),stdin);//将'\n'换成'\0'buf.mtext[strlen(buf.mtext)-1]='\0';//将数据放入消息队列中if(msgsnd(msgid,&buf,MSGSIZE,0)!=0){perror("msgsnd error");return -1;}if(strcmp(buf.mtext,"quit")==0){break;}}exit(0);}else{    //父进程读取数据struct msgbuf buf1={.mtype=50};//向消息队列中读取数据//定义一个消息便量while(1){//清空数组bzero(buf1.mtext,sizeof(buf1.mtext));//从消息队列中读取数据//0表示阻塞形式进行取数据if(msgrcv(msgid,&buf1,MSGSIZE,50,0)==-1){perror("msgrcv error");return -1;}printf("读取的消息为:%s\n",buf1.mtext);if(strcmp(buf1.mtext,"quit")==0){break;}}wait(NULL);exit(0);}//删除消息队列if(msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}return 0;
}

recv.c

#include<myhead.h>//定义消息类型
struct msgbuf
{long int mtype;  //消息类型char mtext[1024]; //消息正文内容
};//宏定义一个消息大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, const char *argv[])
{//1、创建key值以便创建消息队列key_t key=ftok("/",'l');if(key==-1){perror("ftok error");return -1;}//2、使用key值,打开一个消息对列int msgid;if((msgid=msgget(key,IPC_CREAT|0664))==-1){perror("msgget error");return -1;}//创建父子进程pid_t pid;pid=fork();if(pid<0){perror("fork error");return -1;}else if(pid==0){struct msgbuf buf={.mtype=100};//3、向消息队列中读取数据//定义一个消息便量while(1){//清空数组bzero(buf.mtext,sizeof(buf.mtext));//从消息队列中读取数据//0表示阻塞形式进行取数据if(msgrcv(msgid,&buf,MSGSIZE,100,0)==-1){perror("msgrcv error");return -1;}printf("读取的消息为:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit")==0){break;}}exit(0);}else{struct msgbuf buf1={.mtype=50};//3、向消息队列中存放数据//定义一个消息便量while(1){//清空数组bzero(buf1.mtext,sizeof(buf1.mtext));fgets(buf1.mtext,sizeof(buf1.mtext),stdin);//将'\n'换成'\0'buf1.mtext[strlen(buf1.mtext)-1]='\0';//将数据放入消息队列中if(msgsnd(msgid,&buf1,MSGSIZE,0)!=0){perror("msgsnd error");return -1;}if(strcmp(buf1.mtext,"quit")==0){break;}}wait(NULL);exit(0);}//删除消息队列if(msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgctl error");return -1;}return 0;
}

 

效果图: 

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

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

相关文章

【数据结构与算法】(10)基础数据结构 之 堆 建堆及堆排序 详细代码示例讲解

目录 2.9 堆建堆习题E01. 堆排序E02. 数组中第K大元素-Leetcode 215E03. 数据流中第K大元素-Leetcode 703E04. 数据流的中位数-Leetcode 295 2.9 堆 以大顶堆为例&#xff0c;相对于之前的优先级队列&#xff0c;增加了堆化等方法 public class MaxHeap {int[] array;int siz…

浅谈交换原理(1)——概述

一、什么是交换 在通信系统中&#xff0c;我们所认知的最简单的通信方式就是点对点通信&#xff0c;但是当有多个终端需要进行相互通信时&#xff0c;点对点通信就具有一定的局限性&#xff0c;如下图所示&#xff1a; 我们如果想要做到全互连方式两两相连&#xff0c;假设终端…

04. 【Linux教程】安装 Linux 操作系统

通过前面的小节学习&#xff0c;我们已经对 Linux 操作系统有了简单的了解&#xff0c;同时也在 Windows 下安装了虚拟机软件 VMware &#xff0c;那么本节课我们就介绍下如何使用虚拟机软件安装 Linux 操作系统。 通过第一小节的学习我们知道 Linux 有很多的发行版本&#xf…

2024年1月30日

2024年1月30日13:00:50 2024年1月30日13:09:32二连击破 2024年1月30日13:18:20三联绝世 2024年1月30日13:32:03继续拿下

Akamai 如何揪出微软 RPC 服务中的漏洞

近日&#xff0c;Akamai研究人员在微软Windows RPC服务中发现了两个重要漏洞&#xff1a;严重程度分值为4.3的CVE-2022-38034&#xff0c;以及分值为8.8的CVE-2022-38045。这些漏洞可以利用设计上的瑕疵&#xff0c;通过缓存机制绕过MS-RPC安全回调。我们已经确认&#xff0c;所…

【Java 数据结构】String进阶

字符串常量池 1. 创建对象的思考2. 字符串常量池(StringTable)3. 再谈String对象创建 1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 …

CIFS(Samba)服务的使用

理论部分 概念&#xff1a; 通用互联网文件系统CIFS使用的是公共的或者开放的SMB协议版本。SMB是在会话层和表示层以及小部分应用层上的 协议&#xff0c;使用了NetBIOS的应用程序接口API。该协议在局域网上用于服务器文件访问和打印。它使用客户/服务器模式&#xff0c;客 户…

【实训】自动运维ansible实训(网络管理与维护综合实训)

来自即将退役学长的分享&#xff0c;祝学弟学妹以后发大财&#xff01; 一 实训目的及意义 1.1 实训目的 1、熟悉自动化运维工具&#xff1a;实训旨在让学员熟悉 Ansible 这一自动化运维工具。通过实际操作&#xff0c;学员可以了解 Ansible 的基本概念、工作原理和使用方法…

ACM训练题:Division

题意是给你N&#xff0c;打印出所有相除等于N的五位数&#xff08;包含前导零&#xff09;&#xff0c;可以枚举后五位&#xff0c;计算量是10&#xff01;/5&#xff01;&#xff0c;然后乘N&#xff0c;一起检验10个数是否都出现。 AC代码&#xff1a; #include <iostre…

读论文:DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior

DiffBIR 发表于2023年的ICCV&#xff0c;是一种基于生成扩散先验的盲图像恢复模型。它通过两个阶段的处理来去除图像的退化&#xff0c;并细化图像的细节。DiffBIR 的优势在于提供高质量的图像恢复结果&#xff0c;并且具有灵活的参数设置&#xff0c;可以在保真度和质量之间进…

智慧树考试怎么搜题找答案?分享9个有手机就能搜题的工具 #学习方法#微信#知识分享

市面上搜题软件不少&#xff0c;大部分都挺好用的&#xff0c;今天小编在这里给大家分享几个好用的搜题工具&#xff0c;都拥有丰富的题库资源&#xff1b;而且搜题功能也都很完善&#xff0c;手机端、网页端均有&#xff0c;有需要的小伙伴赶紧码住&#xff01; 1.七燕搜题 …

进程控制(Linux)

进程控制 一、进程创建1. 再识fork2. 写时拷贝 二、进程终止前言——查看进程退出码1. 退出情况正常运行&#xff0c;结果不正确异常退出 2. 退出码strerror和errno系统中设置的错误码信息perror异常信息 3. 退出方法exit和_exit 三、进程等待1. 解决等待的三个问题2. 系统调用…