码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Linux 进程通信】消息队列


    消息队列

    • API
    • 案例: 两个进程往消息队列发送消息不同类型的消息,然后接收对方发送的消息

    消息队列在内核中开辟
    为半双工
    消息的类型就是结构体,这个需要我们自己定义(叫啥名都无所谓)
    第一个成员必须为 long type,剩下的都无所谓。

    • 发送消息时,消息类型 >0
    • 接收消息时,消息类型可以置为0,表示不区分消息类型
    • 如果读取时,队列中没有读消息时设定的类型,则它会一直阻塞在那里
    struct mess
    {
      long type;
      char buff[32];//格式由我们自己定义
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    API

    int msgget(key_t key, int msqflg);创建或者获取一个消息队列
    成功返回消息队列ID,失败返回-1
    msqflg:IPC_CREAT
    
    • 1
    • 2
    • 3
    int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);发送一条消息
    成功返回0,失败返回-1
    msqsz:指定mtext中有效数据的长度
    msqflg:一般设置为0可以设置IPC_NOWAIT
    
    • 1
    • 2
    • 3
    • 4
    ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg); 接收一条消息
    成功返回mtext中接收到的数据长度,失败返回-1
    msqtyp:指定接收的消息类型,类型可以为0
    msqflg:一般设置为О可以设置IPC_NOWAIT
    
    • 1
    • 2
    • 3
    • 4
    int msgctl(int msqid, int cmd, struct msqid_ds *buf); 控制消息队列
    成功返回0,失败返回-1
    cmd: IPC_RMID
    
    • 1
    • 2
    • 3

    案例: 两个进程往消息队列发送消息不同类型的消息,然后接收对方发送的消息

    messagequeue1.cpp

    #include
    #include
    #include
    #include
    struct mess
    {
      long type;
      char buff[32];
    };
    int main()
    {
      int msgid = msgget((key_t)1234,IPC_CREAT|0600);
      if(msgid == -1)
      {
       std::cout<<"msgget erro"<<std::endl;
        exit(1);
      
      }
      struct mess ms1;
      msgrcv(msgid,&ms1,32,1,0);
      std::cout<<ms1.buff<<std::endl;
      memset(&ms1,0,sizeof(ms1));
      ms1.type=2;
      strcpy(ms1.buff,"hello2");
      msgsnd(msgid,&ms1,32,0);
      exit(1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    messagequeue2.cpp

    #include
    #include
    #include
    #include
    struct mess
    {
      long type;
      char buff[32];
    };
    int main()
    {
      int msgid = msgget((key_t)1234,IPC_CREAT|0600);
      if(msgid == -1)
      {
        std::cout<<"msgget erro"<<std::endl;
        exit(1);
      
      }
      struct mess ms1;
      ms1.type=1;
      strcpy(ms1.buff,"hello1");
      msgsnd(msgid,&ms1,32,0);
      memset(&ms1,0,sizeof(ms1));
      msgrcv(msgid,&ms1,32,2,0);
      std::cout<<ms1.buff<<std::endl;
      exit(0);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行结果
    在这里插入图片描述
    在这里插入图片描述

    ipcs -q 查看消息队列
    在这里插入图片描述

  • 相关阅读:
    如何应对GNSS/GPS欺骗?GPS/GNSS防欺骗测试
    MySQL 回表
    即将发布的 Apache Spark 3.2 将内置 Pandas API
    重构Transformer神经网络:优化的自注意力机制和前馈神经网络
    基于python的C语言学习笔记(1)
    分布式篇---第五篇
    SOA中间件DDS(数据分发服务-Data Distribution Service)
    射频识别|计算机网络|第九讲数据通信和编码技术|奈氏准则和香农定理
    SpringBoot-27-springSecurity(安全:认证授权)
    关于嵌入式人工智能?
  • 原文地址:https://blog.csdn.net/aoeaoao/article/details/127946218
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号