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

【Linux】POSIX 消息队列

前言

通俗易懂的方式来解释 POSIX 消息队列(POSIX Message Queues)。

一、什么是 POSIX 消息队列?

POSIX 消息队列 是一种用于进程间通信(IPC)的技术,它允许不同进程之间通过发送和接收消息来进行通信。POSIX 消息队列是基于 POSIX 标准的一部分,旨在提供跨平台的兼容性和一致性。

通俗解释

想象一下,你和你的朋友在不同的房间里,你们需要传递信息给对方。传统的做法可能是大喊大叫,但这种方式不太可靠。更好的方法是使用一个小盒子(消息队列),你们可以把信息写在纸上,放进这个盒子里。当你有信息要传递给你的朋友时,你可以把纸条放进盒子;当你的朋友有信息给你时,他也同样把纸条放进盒子。你们可以随时去查看这个盒子,看看有没有新的信息。

这就是 POSIX 消息队列的基本思想:

  1. 创建一个消息队列

    • 创建一个类似于“小盒子”的东西,用来存放消息。
  2. 发送消息

    • 当一个进程需要向另一个进程发送消息时,它会把消息放入这个“小盒子”。
  3. 接收消息

    • 接收消息的一方可以从这个“小盒子”中取出消息,并进行处理。

二、如何使用 POSIX 消息队列

  1. 创建消息队列
    使用 mq_open 函数创建一个消息队列。这个函数类似于打开一个文件,但是它实际上创建了一个用于进程间通信的消息队列。

  2. 发送消息
    使用 mq_send 函数将消息发送到消息队列中。

  3. 接收消息
    使用 mq_receive 函数从消息队列中接收消息。

  4. 关闭消息队列
    使用 mq_close 函数关闭消息队列。

  5. 删除消息队列
    使用 mq_unlink 函数删除不再需要的消息队列。

三、示例代码

下面是一个简单的示例代码,展示如何使用 POSIX 消息队列:

1. 创建消息队列
#include <mqueue.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>int main() {mqd_t mqdes;mqdes = mq_open("/myqueue", O_CREAT | O_RDWR, 0666, NULL);if (mqdes == -1) {perror("mq_open");return 1;}mq_close(mqdes);return 0;
}
2. 发送消息
#include <mqueue.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>int main() {mqd_t mqdes;char *msg = "Hello, World!";mqdes = mq_open("/myqueue", O_WRONLY);if (mqdes == -1) {perror("mq_open");return 1;}if (mq_send(mqdes, msg, strlen(msg) + 1, 0) == -1) {perror("mq_send");return 1;}mq_close(mqdes);return 0;
}
3. 接收消息
#include <mqueue.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>int main() {mqd_t mqdes;char buffer[100];mqdes = mq_open("/myqueue", O_RDONLY);if (mqdes == -1) {perror("mq_open");return 1;}if (mq_receive(mqdes, buffer, sizeof(buffer), NULL) == -1) {perror("mq_receive");return 1;}printf("Received message: %s\n", buffer);mq_close(mqdes);return 0;
}

四、总结

POSIX 消息队列是一种简单而强大的进程间通信机制,它通过创建一个“小盒子”(消息队列)来实现不同进程之间的消息传递。这种方式比传统的 IPC 方法(如管道、信号量等)更为灵活和可控,适合需要跨进程传递数据的应用场景。


http://www.mrgr.cn/news/60428.html

相关文章:

  • 51单片机完全学习——LCD1602液晶显示屏
  • Qt5.15.x源码编译
  • 【js逆向专题】12.RPC技术
  • OmniGen:AI图像生成新王者诞生
  • ReactNative 启动应用(2)
  • 计算机网络:网络层 —— IPv4 地址的应用规划
  • 无脑去除李贺epic注册机的三种方法
  • 最近爆火的新职业Prompt提示工程师到底是做什么的?迈向大模型第一步Prompt提示工程基础原理及实践
  • 蓝桥杯单片机STC15F2K60S2第十四届省赛代码详细讲解(附完整代码)
  • Ubuntu18.04安装velodyne驱动
  • AI-基本概念-CNN/RNN/注意力机制
  • Qt6切换音轨
  • 枫清科技仲光庆:AI+行业新范式,双轮驱动助力数智化升级
  • 【建造&机械】木材运输车辆检测系统源码&数据集全套:改进yolo11-GhostHGNetV2
  • SegNet DeconvNet——论文阅读
  • 院士领衔,瑞德磁电誓将中国红染遍磁电产业
  • 前端分页:非当前页进行表单验证
  • 802.1AS-2011_Gptp协议栈
  • 【动手学强化学习】part2-动态规划算法
  • Pytorch学习--DataLoader的使用
  • mabtisx突然不起作用:mapper跳转不到xml
  • 采用WinSW将jar包做成window本地服务
  • 扣子(Coze)
  • 【vue 全家桶】1、vue 基础(更新中)
  • CRD臻珈设计 | 北外滩虹口源·717:摩登印象,艺术永恒
  • Unity 编辑器扩展精髓 之 窗口创建与绘制基础组件