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

linux下的消息队列数据收发

在 Linux 下,可以使用 POSIX 消息队列来实现一个线程向另一个线程发送消息。以下是一个完整的 C 程序示例,展示了如何创建两个线程,一个线程发送消息,另一个线程接收消息:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <mqueue.h>
#include <fcntl.h>
#include <sys/stat.h>#define QUEUE_NAME "/my_message_queue"
#define MAX_MSG_SIZE 1024
#define MSG_COUNT 5// 消息队列描述符
mqd_t mqdes;// 接收线程函数
void *receive_thread(void *arg) {char buffer[MAX_MSG_SIZE];ssize_t bytes_received;// 循环接收消息for (int i = 0; i < MSG_COUNT; i++) {bytes_received = mq_receive(mqdes, buffer, MAX_MSG_SIZE, NULL);if (bytes_received == -1) {perror("mq_receive");exit(EXIT_FAILURE);}buffer[bytes_received] = '\0';printf("Received message: %s\n", buffer);}// 关闭消息队列if (mq_close(mqdes) == -1) {perror("mq_close");exit(EXIT_FAILURE);}// 删除消息队列if (mq_unlink(QUEUE_NAME) == -1) {perror("mq_unlink");exit(EXIT_FAILURE);}return NULL;
}// 发送线程函数
void *send_thread(void *arg) {char message[MAX_MSG_SIZE];// 循环发送消息for (int i = 0; i < MSG_COUNT; i++) {snprintf(message, MAX_MSG_SIZE, "Message %d", i + 1);if (mq_send(mqdes, message, strlen(message), 0) == -1) {perror("mq_send");exit(EXIT_FAILURE);}printf("Sent message: %s\n", message);}return NULL;
}int main() {pthread_t sender, receiver;struct mq_attr attr;// 设置消息队列属性attr.mq_flags = 0;attr.mq_maxmsg = 10;attr.mq_msgsize = MAX_MSG_SIZE;attr.mq_curmsgs = 0;// 创建消息队列mqdes = mq_open(QUEUE_NAME, O_CREAT | O_RDWR, 0666, &attr);if (mqdes == (mqd_t)-1) {perror("mq_open");return EXIT_FAILURE;}// 创建发送线程if (pthread_create(&sender, NULL, send_thread, NULL) != 0) {perror("pthread_create (sender)");return EXIT_FAILURE;}// 创建接收线程if (pthread_create(&receiver, NULL, receive_thread, NULL) != 0) {perror("pthread_create (receiver)");return EXIT_FAILURE;}// 等待发送线程结束if (pthread_join(sender, NULL) != 0) {perror("pthread_join (sender)");return EXIT_FAILURE;}// 等待接收线程结束if (pthread_join(receiver, NULL) != 0) {perror("pthread_join (receiver)");return EXIT_FAILURE;}return EXIT_SUCCESS;
}

代码说明:

  1. 消息队列的创建和初始化

    • mq_open 函数用于创建一个新的消息队列或打开一个已存在的消息队列。
    • struct mq_attr 结构体用于设置消息队列的属性,如最大消息数和消息大小。
  2. 发送线程

    • send_thread 函数循环发送 5 条消息到消息队列中。
    • mq_send 函数用于将消息发送到消息队列。
  3. 接收线程

    • receive_thread 函数循环从消息队列中接收 5 条消息。
    • mq_receive 函数用于从消息队列中接收消息。
    • 接收完所有消息后,关闭并删除消息队列。
  4. 主线程

    • 创建发送线程和接收线程。
    • 使用 pthread_join 函数等待两个线程结束。

编译和运行:

将上述代码保存为 message_queue_example.c,然后使用以下命令进行编译:

gcc -o message_queue_example message_queue_example.c -lpthread -lrt

运行编译后的可执行文件:

./message_queue_example

运行程序后,你将看到发送和接收的消息输出。

http://www.dtcms.com/a/279789.html

相关文章:

  • python学智能算法(十七)|SVM基础概念-向量的值和方向
  • 计算实在论:一个关于存在、认知与时间的统一理论
  • win7+Qt1.12.3+opencv4.3+mingw32+CMake3.15编译libopencv_world430.dll过程
  • 【Python】-实用技巧5- 如何使用Python处理文件和目录
  • Java并发编程之事务管理详解
  • Redis集群方案——Redis分片集群
  • GPU集群运维
  • Unity物理系统由浅入深第六节:高级主题与前沿探索
  • 动态规划题解——乘积最大子数组【LeetCode】
  • 【EM算法】算法及注解
  • 12.4 Hinton与Jeff Dean突破之作:稀疏门控MoE如何用1%计算量训练万亿参数模型?
  • 【python】基于pygame实现动态粒子爱心
  • Qualcomm FastConnect C7700:新一代Wi-Fi 7
  • Js 压缩图片为 120 kb且使用canvas显示(一键运行)
  • 【EM算法】三硬币模型
  • [硬件电路-21]:模拟信号处理运算与数字信号处理运算的详细比较
  • 连分数的收敛判别与计算方法
  • 鸿蒙开发NDK之---- 如何将ArkTs的类型转化成C++对应的类型(基础类型,包含部分代码解释)
  • Jetson平台CSI摄像头采集与显示:gst-launch-1.0与OpenCV实战
  • 【linux V0.11】boot
  • 多生产者多消费者问题(操作系统os)
  • SpringCloud之Hystrix
  • 【DOCKER】-4 dockerfile镜像管理
  • linux网络存储——freeNAS的安装配置
  • Spring Cloud分布式配置中心:架构设计与技术实践
  • MFC/C++语言怎么比较CString类型 第一个字符
  • 读文章 Critiques of World model
  • Java(集合)
  • aspnetcore Mvc配置选项中的ModelMetadataDetailsProviders
  • SAP-ABAP:SAP库存管理核心增强:IF_EX_MB_DOCUMENT_BADI 深度解析