进程间通讯-消息队列

介绍

消息队列是一种存放在内核中的数据结构,用于在不同进程之间传递消息。它基于先进先出(FIFO)的原则,进程可以将消息发送到队列中,在需要的时候从队列中接收消息。消息队列提供了一种异步通信的方式,使得进程可以以独立的方式进行通信,而不需要直接的进程间连接。
在使用消息队列进行进程间通讯时,发送进程将消息写入队列,而接收进程从队列中读取消息。消息队列提供了一种可靠的通信机制,即使发送和接收进程的速度不一致,消息队列也能够缓冲消息,确保消息的可靠传递。
消息队列通常由操作系统提供,并通过系统调用接口来进行创建、发送和接收消息的操作。在使用消息队列时,进程需要指定消息的类型和大小,以及接收消息的优先级等参数。

实现举例

  • 需要包含必要的头文件并定义一些常量:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>       /* For O_* constants */
#include <sys/stat.h>    /* For mode constants */
#include <mqueue.h>#define QUEUE_NAME  "/test_queue"
#define MAX_SIZE    1024
#define MSG_STOP    "exit"
  • 创建一个发送消息的函数:
void send_message() {int mqd;char buffer[MAX_SIZE];struct mq_attr attr;/* Open the queue. Note the flag O_WRONLY since we're just sending */mqd = mq_open(QUEUE_NAME, O_WRONLY);if (mqd == -1) {perror("mq_open");exit(1);}/* Send the message to the queue */while (fgets(buffer, sizeof(buffer), stdin)) {mq_send(mqd, buffer, strlen(buffer), 0);}mq_close(mqd);
}
  • 创建一个接收消息的函数:
void receive_message() {int mqd;ssize_t bytes_read;char buffer[MAX_SIZE + 1];  /* +1 so we can add null-terminator */struct mq_attr attr;/* Open the queue. Note the flag O_RDONLY since we're just receiving */mqd = mq_open(QUEUE_NAME, O_RDONLY);if (mqd == -1) {perror("mq_open");exit(1);}/* Receive the message from the queue */do {bytes_read = mq_receive(mqd, buffer, MAX_SIZE, NULL);buffer[bytes_read] = '\0';  /* Add null-terminator */printf("Received: %s", buffer);} while (strncmp(buffer, MSG_STOP, strlen(MSG_STOP)));mq_close(mqd);
}
  • 在主函数中调用这些函数:
int main() {struct mq_attr attr;attr.mq_flags = 0;  /* Flags: 0 or O_NONBLOCK */attr.mq_maxmsg = 10;  /* Max. # of messages on queue */attr.mq_msgsize = MAX_SIZE;  /* Max. message size (bytes) */attr.mq_curmsgs = 0;  /* # of messages currently in queue *//* Create the message queue */if (mq_unlink(QUEUE_NAME) == -1 && errno != ENOENT) {  /* Remove old queue */perror("mq_unlink");exit(1);}if (mq_open(QUEUE_NAME, O_CREAT | O_EXCL, 0644, &attr) == -1) {  /* Create new queue */perror("mq_open");exit(1);}if (fork() == 0) {  /* Child process */receive_message();  /* Receive messages */} else {  /* Parent process */send_message();  /* Send messages */}return 0;
}
示例说明

这个程序会创建一个名为"/test_queue"的消息队列,并从标准输入中读取消息发送到队列中。子进程会从队列中接收消息并打印出来,直到接收到"exit"为止。注意,这个程序使用了fork()函数来创建子进程,因此它需要在支持POSIX的进程环境中运行。

总结

消息队列的好处:

  1. 异步通信:发送和接收进程可以以独立的方式进行通信,不需要实时连接。
  2. 解耦合:消息队列可以将发送和接收进程解耦合,使得它们可以独立进行开发和维护。
  3. 缓冲和流量控制:消息队列可以缓冲消息,使得发送和接收进程的速度不一致时也能够保证消息的可靠传递。
  4. 可靠性:消息队列提供了一种可靠的通信机制,即使发送和接收进程崩溃或重启,消息也能够得到保留和传递。
注意

使用消息队列时需要考虑并发访问的问题,以及消息的格式和大小等限制。此外,不同的操作系统可能提供不同的消息队列实现方式和接口,需要根据具体的操作系统和编程语言进行相应的调用和处理。

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

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

相关文章

❤Mac上后端环境工具安装使用

❤Mac上后端环境工具安装使用 Cornerstone 使用 &#xff08;最好的SVN Mac软键&#xff09; 使用教程 安装 由于Cornerstone是收费的&#xff0c;因此你可以去网上下载破解版&#xff0c;直接安装即可。 配置远程仓库 首先&#xff0c;打开CornerStone&#xff0c;在界面…

工业数据的特殊性和安全防护体系探索思考

随着工业互联网的发展&#xff0c;工业企业在生产运营管理过程中会产生各式各样数据&#xff0c;主要有研发设计数据、用户数据、生产运营数据、物流供应链数据等等&#xff0c;这样就形成了工业大数据&#xff0c;这些数据需要依赖企业的网络环境和应用系统进行内外部流通才能…

19、商城系统(一):项目架构图,配置前端后台开发环境,构建git项目,导入 人人开源框架并前端后台启动

目录​​​​​​​ 一、项目架构图 二、配置环境 1.配置linux (1)复制linux环境

【Python】—— NumPy基础及取值操作

NumPy基础及取值操作 第1关&#xff1a;ndarray对象第2关&#xff1a;形状操作第3关&#xff1a;基础操作第4关&#xff1a;随机数生成第5关&#xff1a;索引与切片 第1关&#xff1a;ndarray对象 任务描述 本关任务&#xff1a;根据本关所学知识&#xff0c;补全代码编辑器中…

react基于antd二次封装spin组件

目录 react基于antd二次封装spin组件组件使用组件效果 react基于antd二次封装spin组件 组件 import { Spin } from antd; import propTypes from "prop-types"; import React from react; import styleId from "styled-components"; // 使用 父div必须加…

【爬虫课堂】如何高效使用短效代理IP进行网络爬虫

目录 一、前言 二、代理IP的基本知识 三、短效代理IP的优势 四、高效使用短效代理IP的技巧 1. 多源获取代理IP 2. 质量筛选代理IP 3. 使用代理池 4. 定时更换代理IP 5. 失败重试机制 6. 监控和自动化 五、示例代码 六、结语 一、前言 网络爬虫是一种自动化程序&am…

Windbg 常用命令

Windbg 是微软开发的一款强大的调试工具&#xff0c;用于调试 Windows 操作系统和应用程序。它支持各种调试技术&#xff0c;包括用户模式和内核模式调试、本地和远程调试、源代码和汇编级别调试等。以下是 Windbg 中一些常用的命令&#xff1a; 标准命令&#xff1a; g - 继…

MongoDB中的关系

本文主要介绍MongoDB中的关系。 目录 MongoDB的关系嵌入关系引用关系 MongoDB的关系 MongoDB是一个非关系型数据库&#xff0c;它使用了键值对的方式来存储数据。因此&#xff0c;MongoDB没有像传统关系型数据库中那样的表、行和列的概念。相反&#xff0c;MongoDB中的关系是通…

LLM之RAG实战(五)| 高级RAG 01:使用小块检索,小块所属的大块喂给LLM,可以提高RAG性能

RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;系统从给定的知识库中检索相关信息&#xff0c;从而使其能够生成事实信息、上下文相关信息和特定领域的信息。然而&#xff0c;在有效检索相关信息和生成高质量响应方面&#xff0c;RAG面临…

【网络安全】-Linux操作系统—CentOS安装、配置

文章目录 准备工作下载CentOS创建启动盘确保硬件兼容 安装CentOS启动安装程序分区硬盘网络和主机名设置开始安装完成安装 初次登录和配置更新系统安装额外的软件仓库安装网络工具配置防火墙设置SELinux安装文本编辑器配置SSH服务 总结 CentOS是一个基于Red Hat Enterprise Linu…

【MySQL】MySQL的执行计划

在数据库管理中&#xff0c;优化查询性能是至关重要的一环。而了解和掌握MySQL的执行计划&#xff0c;则是优化查询性能的关键步骤之一。本文将深入探讨MySQL的执行计划&#xff0c;帮助大家更好地理解和利用这一工具。 什么是MySQL的执行计划&#xff1f; MySQL的执行计划是…

美颜SDK是什么?视频美颜SDK在直播平台中的集成与接入教程详解

当下&#xff0c;主播们追求更加自然、精致的外观&#xff0c;而观众也期待在屏幕前欣赏到更为清晰、美丽的画面。为了满足这一需求&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台的重要利器之一。 一、什么是美颜SDK&#xff1f; 通过美颜SDK&#xff0c;开发者可以…

Kotlin Multiplatform的现状—2023年网络研讨会

Kotlin Multiplatform的现状—2023年网络研讨会 在2023年&#xff0c;Kotlin Multiplatform因其开发、当前状态和未来潜力而受到了相当大的关注。随着越来越多的开发者对采用KMP进行跨平台解决方案表示兴趣&#xff0c;JetBrains在11月下旬推出了一系列网络研讨会作为回应。首…

“去 Android化”为何蔚然成风?

早在2008年时&#xff0c;国内市场诞生了第一批自研手机OS&#xff0c;由于种种缘由铩羽而归&#xff0c;“优化Android ”貌似成为了本土特色。而从2023年下半年开始掀起了一股"去安卓化"的热潮&#xff0c;像华为、小米、vivo等都不约而同的站在了同一战线。 “去…

bisect_left,bisect_right,bisect的用法,区别以源码分析

bisect_left(*args, **kwargs) 向一个数组插入一个数字&#xff0c;返回应该插入的位置。 如果这个数字不存在于这个数组中&#xff0c;则返回第一个比这个数大的数的索引 如果这个数字存在&#xff0c;则返回数组中这个数的位置的最小值&#xff08;即最左边那个索引&#xf…

使用Kaptcha实现的验证码功能

目录 一.需求 二.验证码功能实现步骤 验证码 引入kaptcha依赖 完成application.yml配置文件 浏览器显示验证码 前端页面 登录页面 验证成功页面 后端 此验证码功能是以SpringBoot框架下基于kaptcha插件来实现的。 一.需求 1.页面生成验证码 2.输入验证码&#xff…

Kafka-Kafka基本原理与集群快速搭建(实践)

Kafka单机搭建 下载Kafka Apache Download Mirrors 解压 tar -zxvf kafka_2.12-3.4.0.tgz -C /usr/local/src/software/kafkakafka内部bin目录下有个内置的zookeeper(用于单机) 启动zookeeper&#xff08;在后台启动&#xff09; nohup bin/zookeeper-server-start.sh conf…

如何实现TensorFlow自定义算子?

在上一篇文章中 Embedding压缩之基于二进制码的Hash Embedding&#xff0c;提供了二进制码的tensorflow算子源码&#xff0c;那就顺便来讲下tensorflow自定义算子的完整实现过程。 前言 制作过程基于tensorflow官方的custom-op仓库以及官网教程&#xff0c;并且在Ubuntu和Mac…

Leetcode—11.盛最多水的容器【中等】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—11.盛最多水的容器 实现代码 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) int maxArea(int* height, int heightSize) {int left 0, right heightSize - 1;int m…

知识蒸馏:channel wise知识蒸馏CWD

论文:https://arxiv.org/pdf/2011.13256.pdf 1. 摘要 知识蒸馏用于训练紧凑型(轻量)模型被证明是一种简单、高效的方法, 轻量的学生网络通过教师网络的知识迁移来实现监督学习。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的…