当前位置: 首页 > news >正文

进程间通信——消息队列

多线程

进程间通信——消息队列

消息队列——发送

  • 测试代码

    #include <sys/types.h>
    #include <sys/msg.h>
    #include <sys/ipc.h>#include <stdlib.h>
    #include <stdio.h>
    #include <string.h>#define MAX_BUF_SIZE 255struct msgtype
    {long mtype;char buf[MAX_BUF_SIZE];
    };int main(int argc, char const *argv[])
    {if (argc != 3){printf("argv must be 3\r\n");return 0;}//1.创建消息队列int msgid = 0;//key为IPC_PRIVATE 也就是0时,则只能在当前进程使用,非零值可以在多个进程之间共享调用//flag为IPC_GREAT时,msgget要么返回新创建的id要么返回自己写的key值,如果为IPC_CREAT|IPC_EXCL时,要么返回新创建的id,要么返回-1,已经存在msgid = msgget((key_t)1234567,0666|IPC_CREAT);//2.向消息队列发送数据struct msgtype msg;msg.mtype = atoi(argv[1]);strcpy(msg.buf,argv[2]);msgsnd(msgid,&msg,sizeof(struct msgtype),0);return 0;
    }
    

消息队列——接受

  • 测试代码

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>#include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>#define MAX_BUF_SIZE 512struct msgtype
    {long mtype;char buf[MAX_BUF_SIZE];
    };int main(int argc, char const *argv[])
    {if(argc != 2){printf("argc must be at least 2\r\n");return 0;}//1.创建消息队列,如果存在就打开消息队列int msgid;msgid = msgget((key_t)1234567,IPC_CREAT|0666);//2.从消息队列读取数据struct msgtype msg;memset(&msg, 0, sizeof(msg));msgrcv(msgid, &msg,sizeof(msg),atoi(argv[1]),0);printf("msgrecv:%s\r\n",msg.buf);return 0;
    }

消息队列——删除

  • 测试代码

    #include<stdio.h>
    #include <stdlib.h>
    #include <string.h>#include <sys/types.h>
    #include <sys/msg.h>
    #include <sys/ipc.h>int main(int argc, char const *argv[])
    {if(argc != 2){printf("argc must be at least 2\r\n");return 0;}int msgid = 0;int ret = 0;msgid = atoi(argv[1]);printf("%d-0x%x\r\n",msgid,msgid);ret = msgctl(msgid,IPC_RMID,NULL);if(ret < 0){printf("rm failed\r\n");return 0;}else{printf("rm success\r\n");}return 0;
    }
    

消息队列测试过程中的注意事项:

  • mesget的第二个参数一定要|0666用来给消息队列赋予权限,否则无法写入数据同时也无法接受数据,通过ipcs查询的时候就可以看到消息队列的权限

  • 报错

    *** stack smashing detected ***: <unknown> terminated 已放弃 (核心已转储)

    是因为分配的空间不够用,我这里出现这种情况的原因是,向消息队列中写入数据的时候写入的是数据部分+数据类型两个部分的数据长度总和,而读取是分配的空间之后数据部分的长度,就造成越界了

http://www.lryc.cn/news/2800.html

相关文章:

  • OpenMMLab 实战营打卡 - 第 7 课
  • MAC Boook打印长图
  • web3:区块链共识机制系列-POS(Proof of Stake)股权证明算法
  • Linux fork()系统调用流程解析
  • 自定义软件帮助文档(qt assistant实现)
  • ESP32设备驱动-GPIO外部中断
  • 【安全】nginx反向代理+负载均衡上传webshel
  • 华为OD机试 - 单词接龙(Python)| 真题,思路,知识点
  • [ 系统安全篇 ] window 命令禁用用户及解禁方法
  • Https 协议超强讲解(二)
  • C语言的程序环境和预处理详解
  • 3.JUC【Java面试第三季】
  • Linux防火墙(7)
  • 2.11整理(2)(主要关于teacher forcing)
  • 亿级高并发电商项目-- 实战篇 --万达商城项目 三(通用模块、商品服务模块、后台API模块、IDEA忽略文件显示等开发工作
  • IDEA下java程序的调试(简易实例图示版)
  • 动态规划算法
  • nacos的单机模式和集群模式
  • Spring Boot 整合定时任务完成 从0 到1
  • Dialogue Transformers
  • 【遇见青山】项目难点:缓存击穿问题解决方案
  • 2023Flag具体实施计划(短期)
  • 研一寒假C++复习笔记--左值和右值的理解和使用
  • Android 11.0 动态修改SystemProperties中ro开头系统属性的值
  • 为什么分库分表
  • 1625_MIT 6.828 stabs文档信息整理_下
  • 论文阅读 | Rethinking Coarse-to-Fine Approach in Single Image Deblurring
  • Mysql 增删改查(二)—— 增(insert)、删(delete)、改(update)
  • JSD2212复习串讲
  • sphinx 升级到6.x后的Jquery问题