您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
C++
Linux MQ接收与发送
激萌の小宅 小宅博客 C++

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

Linux MQ接收与发送

参数说明:

// 消息队列的标志。目前,这个字段只用于设置或获取O_NONBLOCK标志,以指示消息队列是否应该以非阻塞模式打开
attr.mq_flags = 0;

// 队列中允许的最大消息数
attr.mq_maxmsg = 10;

// 每条消息的最大字节数
attr.mq_msgsize = MSG_SIZE;

// 当前在队列中的消息数(注意:这个字段在mq_open调用时应该被设置为0,因为它是只读属性,用于获取当前队列中的消息数量,而不是设置它)
attr.mq_curmsgs = 0;


代码如下:

#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <cstring>
#include <cerrno>
#include <chrono>
#include <thread>
#include <cstdlib>
#include <unistd.h>

#define MAX_SIZE 1024

void messageSender() {
    char message[MAX_SIZE];
    static int message_id = 0;

    struct mq_attr attr;
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = MAX_SIZE;
    attr.mq_curmsgs = 0; // 注意:这个字段在mq_open时应该设置为0,因为它是只读的

    mqd_t mq = mq_open("/queue_b", O_RDWR | O_CREAT | O_NONBLOCK, 0644, &attr);
    if (mq == (mqd_t)-1) {
        perror("mq_open");
        return;
    }

    while (true) {
        snprintf(message, sizeof(message), "Hello from C++, ID: %d", message_id++);
        // std::cout << "Message sent: " << message << std::endl;
        if (mq_send(mq, message, strlen(message) + 1, 0) == -1) {
            perror("mq_send");
            break;
        }
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    mq_close(mq);
    mq_unlink("/queue_b"); // 删除消息队列
}

void messageReceiver() {
    char buffer[MAX_SIZE];
    ssize_t bytesRead;

    struct mq_attr attr;
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = MAX_SIZE;
    attr.mq_curmsgs = 0; 

    mqd_t mq = mq_open("/queue_a", O_RDWR | O_CREAT | O_NONBLOCK, 0644, &attr);
    if (mq == (mqd_t)-1) {
        perror("mq_open");
        return;
    }

    while (true) {
        bytesRead = mq_receive(mq, buffer, MAX_SIZE, NULL);
        if (bytesRead != -1) {
            buffer[bytesRead] = '\0';
            std::cout << "Message received: " << buffer << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
    mq_close(mq);
    mq_unlink("/queue_a"); // 删除消息队列
}

int main() {
    std::thread senderThread(messageSender);
    std::thread receiverThread(messageReceiver);
    senderThread.join();
    receiverThread.join();
    return 0;
}


编译命令:

g++ -o a a.cpp -lpthread -lrt


友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

Linux MQ接收与发送

参数说明:

// 消息队列的标志。目前,这个字段只用于设置或获取O_NONBLOCK标志,以指示消息队列是否应该以非阻塞模式打开
attr.mq_flags = 0;

// 队列中允许的最大消息数
attr.mq_maxmsg = 10;

// 每条消息的最大字节数
attr.mq_msgsize = MSG_SIZE;

// 当前在队列中的消息数(注意:这个字段在mq_open调用时应该被设置为0,因为它是只读属性,用于获取当前队列中的消息数量,而不是设置它)
attr.mq_curmsgs = 0;


代码如下:

#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <cstring>
#include <cerrno>
#include <chrono>
#include <thread>
#include <cstdlib>
#include <unistd.h>

#define MAX_SIZE 1024

void messageSender() {
    char message[MAX_SIZE];
    static int message_id = 0;

    struct mq_attr attr;
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = MAX_SIZE;
    attr.mq_curmsgs = 0; // 注意:这个字段在mq_open时应该设置为0,因为它是只读的

    mqd_t mq = mq_open("/queue_b", O_RDWR | O_CREAT | O_NONBLOCK, 0644, &attr);
    if (mq == (mqd_t)-1) {
        perror("mq_open");
        return;
    }

    while (true) {
        snprintf(message, sizeof(message), "Hello from C++, ID: %d", message_id++);
        // std::cout << "Message sent: " << message << std::endl;
        if (mq_send(mq, message, strlen(message) + 1, 0) == -1) {
            perror("mq_send");
            break;
        }
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    mq_close(mq);
    mq_unlink("/queue_b"); // 删除消息队列
}

void messageReceiver() {
    char buffer[MAX_SIZE];
    ssize_t bytesRead;

    struct mq_attr attr;
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = MAX_SIZE;
    attr.mq_curmsgs = 0; 

    mqd_t mq = mq_open("/queue_a", O_RDWR | O_CREAT | O_NONBLOCK, 0644, &attr);
    if (mq == (mqd_t)-1) {
        perror("mq_open");
        return;
    }

    while (true) {
        bytesRead = mq_receive(mq, buffer, MAX_SIZE, NULL);
        if (bytesRead != -1) {
            buffer[bytesRead] = '\0';
            std::cout << "Message received: " << buffer << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
    mq_close(mq);
    mq_unlink("/queue_a"); // 删除消息队列
}

int main() {
    std::thread senderThread(messageSender);
    std::thread receiverThread(messageReceiver);
    senderThread.join();
    receiverThread.join();
    return 0;
}


编译命令:

g++ -o a a.cpp -lpthread -lrt