【Linux学习笔记】消息队列

方法一:

消息队列的接口

#include "fcntl.h"
#include "sys/stat.h"
#include "mqueue.h"// 创建消息队列实例。name: 消息队列名称。成功返回0,失败返回-1,错误码存于error中
mqd_t mq_open(const char *name, int oflag,  mode_t mode, struct mq_attr *attr);// 无限阻塞方式接收消息。成功返回0,失败返回-1
mqd_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);// 指定超时时间阻塞方式接收消息。成功返回0,失败返回-1
mqd_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout);// 无限阻塞方式发送消息。成功返回0,失败返回-1
mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio);// 指定超时时间阻塞方式发送消息。成功返回0,失败返回-1
mqd_t mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout);// 关闭消息队列。 成功返回0,失败返回-1
mqd_t mq_close(mqd_t mqdes);// 分离消息队列。 成功返回0,失败返回-1
mqd_t mq_unlink(const char *name);

sender.cpp

#include <fcntl.h>  // For O_* constants
#include <mqueue.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>  // For mode constants
#include <unistd.h>#define MQ_MSG_MAX_SIZE 512  // 最大消息长度
#define MQ_MSG_MAX_ITEM 5    // 最大消息数目static mqd_t s_mq;typedef struct _msg_data
{char buf[128];int num;
}msg_data_t;void send_data(void)
{static int num = 0;msg_data_t send_data = {0};++num;strcpy(send_data.buf, "Hello Randy");send_data.num = num;int ret = mq_send(s_mq, (char*)&send_data, sizeof(send_data), 0);if (ret < 0){perror("mq_send error");return;}printf("send msg = %s, num = %d\n", send_data.buf, send_data.num);
}int main(void) {int ret = 0;struct mq_attr attr;// 创建消息队列memset(&attr, 0, sizeof(attr));attr.mq_maxmsg = MQ_MSG_MAX_ITEM;attr.mq_msgsize = MQ_MSG_MAX_SIZE;attr.mq_flags = 0;s_mq = mq_open("/randy1", O_CREAT | O_RDWR, 0777, &attr);if (-1 == s_mq) {perror("mq_open error");return -1;}for (size_t i = 0; i < 10; i++) {send_data();sleep(1);}mq_close(s_mq);return 0;
}

receiver.cpp

#include <fcntl.h>  // For O_* constants
#include <mqueue.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>  // For mode constants
#include <unistd.h>#define MQ_MSG_MAX_SIZE 512  // 最大消息长度
#define MQ_MSG_MAX_ITEM 5    // 最大消息数目static mqd_t s_mq;typedef struct _msg_data
{char buf[128];int num;
}msg_data_t;void receive_data(void)
{static int num = 0;msg_data_t receive_data = {0};int ret = mq_receive(s_mq, (char*)&receive_data, MQ_MSG_MAX_SIZE, 0);if (ret < 0){perror("mq_send error");return;}printf("send msg = %s, num = %d\n", receive_data.buf, receive_data.num);
}int main(void) {int ret = 0;struct mq_attr attr;// 创建消息队列memset(&attr, 0, sizeof(attr));attr.mq_maxmsg = MQ_MSG_MAX_ITEM;attr.mq_msgsize = MQ_MSG_MAX_SIZE;attr.mq_flags = 0;s_mq = mq_open("/randy1", O_RDWR, 0777, &attr);if (-1 == s_mq) {perror("mq_open error");return -1;}for (size_t i = 0; i < 10; i++) {receive_data();sleep(1);}mq_close(s_mq);return 0;
}

注意⚠️ man 3 mq_receive 可以知道,接受指定的 msg_len 必须大于等于 attr 中的mq_msgsize;同理,发送时,必须小于attr指定的mq_msgsize

方法二

#include <iostream>  
#include <string>  
#include <fstream>  
#include <cstdlib>  
#include <cstdio>  
#include <unistd.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>
#include <cstring>struct my_msg_st {  long int my_msg_type;  char text[100];  
};int send_msg(int msqid, const std::string &text) {  my_msg_st msg;  msg.my_msg_type = 1; // 消息类型  strncpy(msg.text, text.c_str(), sizeof(msg.text)); // 复制文本到消息结构体  if (msgsnd(msqid, &msg, sizeof(msg), 0) == -1) { // 发送消息  perror("msgsnd");  return -1;  }  return 0;  
}int receive_msg(int msqid) {  my_msg_st msg;  if (msgrcv(msqid, &msg, sizeof(msg), 1, 0) == -1) { // 接收消息  perror("msgrcv");   return -1;   }  std::cout << "Received: " << msg.text << std::endl; // 打印接收到的消息  return 0;  
}int main() {  int msqid;  key_t key = ftok("/tmp", 'R'); // 使用文件系统路径作为关键字,创建唯一的键值  if ((msqid = msgget(key, IPC_CREAT | 0666)) == -1) { // 创建消息队列  perror("msgget");  return -1;  }  std::cout << "Message queue created with id: " << msqid << std::endl;  send_msg(msqid, "Hello, World!"); // 发送消息  receive_msg(msqid); // 接收消息  return 0;  
}

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

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

相关文章

八股——const 关键字

1.const作用 作用&#xff1a;const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值&#xff0c;这时候没有加const关键字&#xff0c;编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…

Springboot后端跨域处理

跨域 当一台服务器资源从另一台服务器&#xff08;不同的域名或者端口&#xff09;请求一个资源或者接口&#xff0c;就会发起一个跨域HTTP请求。 同源&#xff1a;协议、域名、端口都相同 只要一个不同&#xff0c;就是跨域。 例子 请求方响应方是否跨域原因http://www.ba…

element-ui switch开关组件二次封装,添加loading效果,点击时调用接口后改变状态

先看效果&#xff1a; element-ui中的switch开关无loading属性&#xff08;在element-plus时加入了&#xff09;&#xff0c;而且点击时开关状态就会切换&#xff0c;这使得在需要调用接口后再改变开关状态变得比较麻烦。 思路&#xff1a;switch开关外包一层div&#xff0c;给…

LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

文章目录 一、题目二、题解方法一&#xff1a;完全背包问题的变体&#xff08;版本1&#xff09;方法二&#xff1a;完全背包问题变体&#xff08;版本2&#xff09; 三、拓展&#xff1a;先遍历物品后遍历背包vs先遍历背包后遍历物品先遍历物品后遍历背包&#xff08;组合问题…

NAT实验:构建复杂网络拓扑,实现互联网访问与FTP发布

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1.配置链路上各个接口的IP地址。2.在私网中配置单臂路由3.在R1和R3上配置默认路由指向公网。4.私网A通过NAPT使vlan 20和vlan 10能够使用R1的公网访问互联网。5.私网B通过在R3上配置EASY IP访问互联网。6.私网…

Docker部署EMQX

1、简介 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是轻量的 (Lightweight)、发布订阅模式 (Pu…

labelme2voc 标签重叠/覆盖问题

使用labelme自带的 labelme2voc.py转换voc数据集时可能标签重叠

Maven Helper mvn项目冲突如何解决

一般用这款插件来查看maven的依赖树。 一、安装&#xff1a; File-->setting--->Plugins--->在搜索框中填写Maven Helper然后搜索&#xff0c;单击Install按钮进行安装&#xff0c;装完重启IDE。 二、使用 当Maven Helper 插件安装成功后&#xff0c;打开项目中的p…

AMD R7 7840HS 核显 780M 性能怎么样

目录 1. 基本数据 2.性能对比 2.1对比一 2.2 对比二 3.综合 1. 基本数据 2.性能对比 2.1对比一 锐龙77840h相当于i几 答&#xff1a;类似于I7-12700H R7 7840H介于13500-13700之间。 R7 7840H是AMD锐龙旗下高性能的一款处理器&#xff0c;主要应用在主流的游戏本中。各…

GFS 分布式文件系统

1&#xff0e;GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性。 MFS 传统…

GO语言篇之发布开源软件包

GO语言篇之发布开源软件包 文章目录 GO语言篇之发布开源软件包新建仓库拉取到本地初始化项目编写代码提交代码发布引用软件包 我们写GO语言程序的时候难免会引用第三方的软件包&#xff0c;那么你知道别人是怎么发布自己的软件包吗&#xff0c;别急&#xff0c;这篇博客教你怎么…

数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法...

全文链接&#xff1a;http://tecdat.cn/?p30131 最近我们被客户要求撰写关于上海空气质量指数的研究报告。本文向大家介绍R语言对上海PM2.5等空气质量数据&#xff08;查看文末了解数据免费获取方式&#xff09;间的相关分析和预测分析&#xff0c;主要内容包括其使用实例&…

【持续更新】Linux下常用的命令脚本

mysql 备份数据库 mysqldump -u用户名 -p密码 --databases 数据库名称 > 备份文件.sql备份全部数据库 #!/bin/bash# MySQL用户名和密码 MYSQL_USER"root" MYSQL_PASSWORD"XMhmyh2019."# 备份保存路径 BACKUP_DIR"/usr/mysqlbackup"# 获取数…

Vue通过ref修改 <el-input-number> 增减按钮的样式

Vue 为一个 <el-input-number> 设置了ref为‘inputNumberRef’, 通过这个ref获取<el-input-number>组件中的增、减按钮所在的<i>标签&#xff0c;并将它们的class分别改为el-icon-plus 和 el-icon-minus。 可以通过以下代码实现&#xff1a; <template&g…

如何实现CSDN评论区粉丝幸运抽选功能:一场代码与运气的碰撞

文章目录 前言抽选规则实现思路代码实现1.获取评论数据2.过滤符合抽选规则的评论者3.获取粉丝数据4.过滤符合抽选规则的粉丝5.增加公众号留言权重6.抽选粉丝 完整的代码效果展示结语 前言 为了回馈粉丝们一直以来的的关注和支持&#xff0c;我近期开启了赠书活动&#xff0c;活…

统信UOS如何关闭防火墙

在UOS操作系统中&#xff0c;默认情况下是没有安装防火墙的。然而&#xff0c;作为保护系统安全的重要措施之一&#xff0c;安装并配置防火墙是至关重要的。UFW&#xff08;Uncomplicated Firewall&#xff09;是UOS下一个简单易用的防火墙工具。本篇博客将教你如何安装和配置U…

vue2+webpack升级vue3+vite,修改插件兼容性bug

同学们可以私信我加入学习群&#xff01; 前言 在前面使用electronvue3的过程中&#xff0c;已经验证了历史vue2代码vue3混合开发的模式。 本次旧项目vue框架整体升级中&#xff0c;同事已经完成了vue3、pinia、router等基础框架工具的升级。所以我此次记录的主要是vite打包工…

【网络编程·数据链路层】MAC帧/以太网协议/ARP协议/RARP协议

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、MAC帧 1、IP地址和MAC地址的区别 2、MAC帧协议 3、MTU对IP协议的…

腾讯云2核4G服务器5M带宽 218元一年 优惠价格明细表

腾讯云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G5M带宽服务器218元一年&#xff1a; 腾讯云2核4G服务器5M带宽收费 腾讯云2核4G服务器可以选择轻量应用服务器或者ECS云服务器&#xff0c;云服务器ECS是专业级云服务器&#xff0c;大多数使用…

【K8S系列】深入解析k8s网络插件—Canal

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 在现代容器化应用程序的世界中…