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

news2024/10/5 17:34:46

1.消息队列号100进程端

#include<myhead.h>
//消息结构体
struct msgbuf
{
    long int mtype;//消息类型
    char mtext[1024];//消息内容
};
不需要消息类型的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)

int main(int argc, char const *argv[])
{
    //创建键值(具体由三个只是先stat结构的st_dev,st_ino;id的低8位组成)
    //第二参数设计的意义是为了生成一个唯一可以进行通信的键值key
    key_t key=ftok("/",'k');
    if (key==-1)
    {
      perror("ftok error");
      return -1;   
    }

    int msgid;
     //根据唯一的键值创建的消息队列
    if((msgid=msgget(key,IPC_CREAT|0664))==-1)
    {
         perror("msgget error");
        return -1;
    }
     struct msgbuf buf;
    int pid=fork();
    if(pid==-1)
    {
        perror("fork error");
        return -1;
    }
    else if(pid==0)
    {
        struct msgbuf buf = {.mtype=100};
       while (1)
    {  
         //终端输入
        bzero(buf.mtext,sizeof(buf.mtext));
        fgets(buf.mtext,sizeof(buf.mtext),stdin);
        buf.mtext[strlen(buf.mtext)-1]='\0';
        //发送消息内容
        if(msgsnd(msgid,&buf,MSGSIZE,0)!=0)
        {
            perror("msgsnd error");
            return -1;
        }
        //发送消息正文为quit则退出
        if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
     exit(EXIT_SUCCESS);
    }
    else{

    while (1)
    {
       bzero(buf.mtext,sizeof(buf.mtext));
        //读取接收的消息正文
       if(msgrcv(msgid,&buf,MSGSIZE,200,0)==-1)
       {
        perror("msgrcv error");
        return -1;
       }
       printf("读取的消息为:%s\n", buf.mtext);
       //读取消息正文为quit则退出
       if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
    wait(NULL);
        
    }
    return 0;
}

 2.消息队列号200进程端

#include<myhead.h>
//消息结构体
struct msgbuf
{
    long int mtype;//消息类型
    char mtext[1024];//消息内容
};
//不需要消息类型的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, char const *argv[])
{
    //创建键值(具体由三个只是先stat结构的st_dev,st_ino;id的低8位组成)
    //第二参数设计的意义是为了生成一个访问并进行通信的键值key
    key_t key = ftok("/", 'k');
    if(key == -1)
    {
        perror("ftok error");
        return -1;
    }
    int msgid;
    //根据唯一的键值打开创建的消息队列
    if((msgid=msgget(key, IPC_CREAT|0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }
    //定义消息队列的信息结构体
    struct msgbuf buf;
    int pid=fork();
    if(pid==-1)
    {
        perror("fork error");
        return -1;
    }
    else if(pid==0)
    {
        struct msgbuf buf = {.mtype=200};
       while (1)
    {  
         //终端输入
        bzero(buf.mtext,sizeof(buf.mtext));
        fgets(buf.mtext,sizeof(buf.mtext),stdin);
        buf.mtext[strlen(buf.mtext)-1]='\0';
        //发送消息内容
        if(msgsnd(msgid,&buf,MSGSIZE,0)!=0)
        {
            perror("msgsnd error");
            return -1;
        }
        //发送消息正文为quit则退出
        if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
       exit(EXIT_SUCCESS);
    }
    else{

    while (1)
    {

        //读取接收的消息正文
       if(msgrcv(msgid,&buf,MSGSIZE,100,0)==-1)
       {
        perror("msgrcv error");
        return -1;
       }
       printf("读取的消息为:%s\n", buf.mtext);
       //读取消息正文为quit则退出
       if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
    wait(NULL);
    }
    //管理消息队列退出时且不需要修改消息队列的类型则删除消息队列
        if(msgctl(msgid, IPC_RMID, NULL) == -1)
    {
        perror("msgctl error");
        return -1;
    }
    return 0;
}

运行效果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

88 docker 环境下面 前端A连到后端B + 前端B连到后端A

前言 呵呵 最近出现了这样的一个问题, 我们有多个前端服务, 分别连接了对应的后端服务, 前端A -> 后端A, 前端B -> 后端B 但是 最近的时候 却会出现一种情况就是, 有些时候 前端A 连接到了 后端B, 前端B 连接到了 后端A 我们 前端服务使用 nginx 提供前端 html, js…

仪器接口设计

不是所有设备都是TCP连接模式&#xff0c;有读文件的、读数据库的设备&#xff0c;为此还需要一个客户端仪器接口程序&#xff0c;面向接口编程是一个良好的思想&#xff0c;他使得调用者和接口实现者不用绑定太死&#xff0c;只要双方按约定实现即可。 仪器有读文件的、写文件…

Unity_修改天空球

Unity_修改天空球 Unity循序渐进的深入会发现可以改变的其实很多&#xff0c;剖开代码逻辑&#xff0c;可视化的表现对于吸引客户的眼球是很重要的。尤其对于知之甚少的客户&#xff0c;代码一般很难说服客户&#xff0c;然表现确很容易。 非代码色彩通才&#xff0c;持续学习…

详解spring6.0新特性汇总

spring6新特性汇总 part1 spring6.0新特性 spring6.0 2022年11月。新一代框架带jdk17&jakarta ee9 https://www.graalvm.org/ part2 AOP&事务 1.AOP:面向切面编程 通过预编译方式和运行期动态 代理实现程序功能的统一维护的一种技术。 使用场景&#xff1a; 权…

【如何学习CAN总线测试】——Vector VH6501干扰仪测试BusOff

系列文章目录 【如何学习CAN总线测试】系列文章目录汇总 文章目录 系列文章目录前言一、环境搭建1.硬件环境2.软件环境3.原理 二、测试方法1.打开Disturbance(CAN)工程2.使能 VH65013.MainConfigPanel面板4.TriggerConfiguration配置5.Sequence Configuration配置6.干扰结果 前…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…

c语言动态数组的实现

动态数组是在程序运行时动态分配内存空间的数组&#xff0c;可以根据需要随时改变大小。在C语言中&#xff0c;动态数组通常通过指针和malloc函数来实现。 使用malloc函数动态分配内存空间&#xff1a; int *arr; int size 10; arr (int*)malloc(size * sizeof(int));使用r…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题一解析(选择题)

CSP-J入门组初赛模拟题一&#xff08;选择题&#xff09; 1、以下与电子邮件无关的网络协议是 A、SMTP B、POP3 C、MIME D、FTP 答案&#xff1a;D 考点分析&#xff1a;主要考查小朋友们网络相关知识的储备&#xff0c;FTP是文件传输协议和电子邮件无关&#xff0c;所以…

高校建设AI算力平台方案探索

近年来&#xff0c;人工智能行业发展迅速&#xff0c;在自动驾驶、金融、医疗、教育等行业广泛应用。尤其是ChatGPT发布以后更是掀起了生成式AI的热潮&#xff0c;国内各大互联网厂商也相继发布自己的AI大模型。这也造成了大量的AI人才缺口&#xff0c;同时促进了高校的AI专业建…

VitePress-09-文档中引入静态资源-图片-相对路径的方式

补充-markdown文档中引入图片的格式 格式如下 &#xff1a;![图片异常时展示的文案](图片资源的路径) 图片资源的路径 &#xff1a; 可以是【绝对路径】&#xff0c;也可以是【相对路径】&#xff0c;关键是可以正确的找到该资源。 引入静态资源的说明 需要注意的是&#xff0c…

第01课:自动驾驶概述

文章目录 1、无人驾驶行业概述什么是无人驾驶智慧出行大趋势无人驾驶能解决什么问题行业趋势无人驾驶的发展历程探索阶段&#xff08;2004年以前&#xff09;发展阶段&#xff08;2004年-2016年&#xff09;成熟阶段&#xff08;2016年以后&#xff09; 2、无人驾驶技术路径无人…

【码农新闻】 用HTTPS,还能被查出浏览记录吗 常用且好用的在线工具......

目录 【码农新闻】 用HTTPS&#xff0c;还能被查出浏览记录吗 常用且好用的在线工具...... 用HTTPS&#xff0c;还能被查出浏览记录吗常用且好用的在线工具尤雨溪 文章所属专区 码农新闻 欢迎各位编程大佬&#xff0c;技术达人&#xff0c;以及对编程充满热情的朋友们&#xf…

代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出…

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

01背包问题 动态规划

01背包问题 动态规划 01背包问题 动态规划写了点代码 C#实现程序运行结果代码和程序已经上传 01背包问题 动态规划 很有意思的问题。 写了点代码 C#实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Ta…

java之spring事务管理

spring事务管理 1. 事务概念 事务是一组操作的集合&#xff0c;是一个不可 分割的工作单位&#xff0c; 这些操作&#xff0c;要么同时成功&#xff0c;要么同时失败 和mysql数据库的事务管理道理一样。开启事务 start 提交事务 commit 回滚事务 rollback2.操作实现 Transa…

系统架构设计师考试大纲2023

一、 考试方式&#xff08;机考&#xff09; 考试采取科目连考、 分批次考试的方式&#xff0c; 连考的第一个科目作答结束交卷完成后自动进 入第二个科目&#xff0c; 第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a; 综合知识科目考试时长 150 分钟&#xff…

8868体育助力意甲国际米兰俱乐部 国米成功续约球员

意甲的国际米兰俱乐部是8868合作体育球队之一&#xff0c;根据国米新闻网站的消息&#xff0c;在与劳塔罗、巴雷拉续签之前&#xff0c;国际米兰将会首先签下约迪马尔科。 有消息说&#xff0c;国际米兰的确有和巴雷拉续约的打算&#xff0c;但是根据国际米兰的计划&#xff0…

YoloV8改进策略:Neck改进:HAM混合注意力机制改进YoloV8|多种改进,多种姿势涨点|代码注释详解

摘要 HAM通过快速一维卷积来缓解通道注意机制的负担,并引入通道分离技术自适应强调重要特征。HAM作为通用模块,在CIFAR-10、CIFAR-100和STL-10数据集上实现了SOTA级别的分类性能。 论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0031320322002667?vi…

迁移学习实现图片分类任务

导入工具包 import time import osimport numpy as np from tqdm import tqdmimport torch import torchvision import torch.nn as nn import torch.nn.functional as Fimport matplotlib.pyplot as plt %matplotlib inline# 忽略烦人的红色提示 import warnings warnings.fi…