【無標題】消息隊列(Message Queue)是一種**進程間通信(IPC)機制

消息隊列(Message Queue)是一種進程間通信(IPC)機制,它允許進程通過在隊列中添加和讀取消息來交換數據。與管道(命名/匿名)相比,消息隊列具有結構化消息異步通信消息持久化等特點,更適合復雜的進程間數據交換場景。

核心特性

  1. 消息結構化
    每個消息都有一個類型標識(通常是整數)和數據內容,接收進程可以根據類型選擇性讀取消息,而無需按順序處理所有數據。

  2. 異步通信
    發送進程發送消息后無需等待接收進程立即處理,可繼續執行其他操作;接收進程可在需要時讀取消息,兩者無需同步運行。

  3. 消息持久化
    消息存儲在內核空間,即使發送進程退出,消息也會保留在隊列中,直到被接收進程讀取或手動刪除。

  4. 多進程交互
    多個進程可以向同一消息隊列發送消息,也可以從隊列中讀取消息(通過類型篩選實現一對一、一對多通信)。

消息隊列的使用(System V 消息隊列,Linux 為例)

System V 消息隊列是最常用的實現,通過以下系統調用操作:

  • msgget():創建或獲取消息隊列
  • msgsnd():發送消息到隊列
  • msgrcv():從隊列接收消息
  • msgctl():控制消息隊列(如刪除、獲取狀態)
1. 消息結構定義

消息需要按固定格式定義,包含類型和數據:

#include <sys/msg.h>// 消息結構(必須以 long 類型的 mtype 開頭)
struct msgbuf {long mtype;       // 消息類型(>0)char mtext[1024]; // 消息數據(可自定義大小和類型)
};
2. 創建/獲取消息隊列(msgget)
// 創建或獲取消息隊列,返回隊列 ID
int msgid = msgget(key_t key, int flags);
  • key:用于標識消息隊列的鍵值(可通過 ftok() 生成唯一鍵)
  • flags:創建權限和操作標志(如 IPC_CREAT | 0666 表示創建隊列,權限為 666)
3. 發送消息(msgsnd)
// 向隊列發送消息,成功返回 0,失敗返回 -1
int msgsnd(int msgid, const void *msgp, size_t msgsz, int msgflg);
  • msgid:消息隊列 ID
  • msgp:指向消息結構的指針
  • msgsz:消息數據部分(mtext)的長度
  • msgflg:發送標志(0 表示阻塞,IPC_NOWAIT 表示非阻塞)
4. 接收消息(msgrcv)
// 從隊列接收消息,成功返回接收的字節數,失敗返回 -1
ssize_t msgrcv(int msgid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
  • msgtyp:指定接收的消息類型(0 接收任意類型,>0 接收指定類型,<0 接收小于等于其絕對值的類型)
  • 其他參數同 msgsnd
5. 控制消息隊列(msgctl)
// 控制消息隊列(如刪除),成功返回 0,失敗返回 -1
int msgctl(int msgid, int cmd, struct msqid_ds *buf);
  • cmd:操作命令(IPC_RMID 表示刪除隊列)

完整示例

發送進程(sender.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <sys/ipc.h>struct msgbuf {long mtype;char mtext[1024];
};int main() {// 生成唯一鍵(文件路徑和項目ID需與接收進程一致)key_t key = ftok("/tmp", 'A');if (key == -1) {perror("ftok failed");exit(1);}// 創建或獲取消息隊列int msgid = msgget(key, IPC_CREAT | 0666);if (msgid == -1) {perror("msgget failed");exit(1);}// 準備消息(類型為 1,數據為 "Hello, receiver!")struct msgbuf msg;msg.mtype = 1;strcpy(msg.mtext, "Hello, receiver!");// 發送消息if (msgsnd(msgid, &msg, strlen(msg.mtext) + 1, 0) == -1) {perror("msgsnd failed");exit(1);}printf("發送消息: %s\n", msg.mtext);return 0;
}
接收進程(receiver.c)
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <sys/ipc.h>struct msgbuf {long mtype;char mtext[1024];
};int main() {// 生成與發送進程相同的鍵key_t key = ftok("/tmp", 'A');if (key == -1) {perror("ftok failed");exit(1);}// 獲取消息隊列(不創建,只連接已存在的)int msgid = msgget(key, 0666);if (msgid == -1) {perror("msgget failed");exit(1);}// 接收消息(只接收類型為 1 的消息)struct msgbuf msg;ssize_t n = msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0);if (n == -1) {perror("msgrcv failed");exit(1);}printf("接收消息: %s\n", msg.mtext);// 接收完成后刪除消息隊列(可選)if (msgctl(msgid, IPC_RMID, NULL) == -1) {perror("msgctl failed");exit(1);}return 0;
}

運行方式

  1. 先編譯并運行接收進程(會阻塞等待消息)。
  2. 再編譯并運行發送進程(發送消息后,接收進程會立即輸出并刪除隊列)。

關鍵注意事項

  1. 消息類型的作用
    接收進程可通過 msgtyp 篩選消息,例如:

    • 按優先級處理(高類型消息優先)
    • 實現多進程定向通信(不同進程使用不同類型)
  2. 消息大小限制
    系統對單條消息的大小有限制(可通過 msgmax 配置),超過限制會導致發送失敗。

  3. 隊列容量限制
    消息隊列的總字節數也有限制(msgmnb),滿隊列時發送操作會阻塞(非阻塞模式下返回錯誤)。

  4. 資源釋放
    消息隊列不會自動銷毀,需通過 msgctl(..., IPC_RMID, ...) 手動刪除,否則會殘留內核中占用資源。

  5. 與其他 IPC 的對比

    機制特點適用場景
    消息隊列結構化消息、異步、按類型讀取復雜數據交換、多進程通信
    管道流式數據、簡單、順序讀取簡單命令交互、父子進程通信
    共享內存速度最快、直接訪問內存高頻數據交換、大數據量傳輸
    信號量用于同步和互斥,不傳遞數據控制進程對共享資源的訪問

應用場景

  • 分布式系統中的進程協作(如服務端與多個客戶端的消息交互)。
  • 日志收集系統(不同進程按類型發送日志,收集進程分類處理)。
  • 任務調度(調度進程發送任務消息,工作進程按類型接收并執行)。

消息隊列通過結構化和異步特性,簡化了復雜進程間通信的設計,是中大型系統中常用的 IPC 方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918319.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac中多版本JDK配置和切換

下載 從jdk官網下載即可&#xff0c;找到自己要用的版本。 官網&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk21-mac 我這里下載的jdk1.8和21。 根據自己芯片下載&#xff0c;一般都是m芯片。下載好后&#xff0c;點擊&#xff0c;一直下一步就行&…

【JVM】流程匯總

【JVM】流程匯總【一】編譯過程和內存分布【1】案例程序&#xff1a;簡單的 Java 類【2】Java 編譯過程&#xff1a;從.java到.class&#xff08;1&#xff09;編譯命令&#xff08;2&#xff09;編譯結果&#xff08;3&#xff09;字節碼的作用【3】Java 運行過程&#xff1a;…

專業MP3瘦身工具WinMP3Shrink 1.1,綠色單文件,極速壓縮

[軟件名稱]: 專業MP3瘦身工具WinMP3Shrink 1.1 [軟件大小]: 1.1 MB [軟件大小]: 夸克網盤 | 百度網盤 軟件介紹 WinMP3Shrink 是一款免費的 MP3 壓縮軟件&#xff0c;能夠有效減少 MP3 文件的體積&#xff0c;同時還能增強音質。即使不重新編碼&#xff0c;通過移除保留空間…

LeetCode 每日一題 2025/8/4-2025/8/10

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄8/4 904. 水果成籃8/5 3477. 水果成籃 II8/6 3479. 水果成籃 III8/7 3363. 最多可收集的水果數目8/8 808. 分湯8/9 231. 2 的冪8/10 869. 重新排序得到 2 的冪8/4 904. 水果…

Python爬蟲實戰:研究Ruia框架,構建博客園文章采集系統

1. 引言 1.1 研究背景與意義 在數字化時代,數據已成為驅動科技創新與產業升級的核心生產要素。互聯網作為全球最大的信息載體,蘊含著億級結構化、半結構化與非結構化數據,這些數據在商業決策、學術研究、公共服務等領域具有不可替代的價值。網絡爬蟲技術作為自動獲取網絡公…

Office安裝使用?借助Ohook開源工具?【圖文詳解】微軟Office產品

一、問題背景 很多用戶在使用 Office 軟件一段時間后&#xff0c;會遇到以下問題。 二、解決方案 Ohook 是 Office 獨有的可用方式&#xff0c;源自 GitHub 上的開源項目&#xff0c;代碼開源&#xff08;開源地址&#xff1a;https://github.com/asdcorp/ohook&#xff09;。 …

LeetCode簡單題 - 學習

力扣題庫 - 簡單題 - 僅記錄學習 來源地址&#xff1a; 力扣 (LeetCode) 全球極客摯愛的技術成長平臺 1. 兩數之和 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你…

Android Camera 打開和拍照APK源碼

完整下載路徑: 【免費】AndroidcameraAPK完整源碼(包括打開攝像頭和拍照保存功能)Android10驗證可完整運行資源-CSDN下載 效果: 源碼: package com.example.mycamera;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appco…

【系統分析師】軟件需求工程——第11章學習筆記(上)

軟件需求工程是包括創建和維護軟件需求文檔所必需的一切活動的過程。可分為兩大工作&#xff1a;需求開發需求獲取需求分析需求定義&#xff08;編寫需求規格說明書&#xff09;需求驗證需求管理定義需求基線處理需求變更需求跟蹤在需求開發階段需要確定軟件所期望的用戶類型&a…

機器學習第七課之支持向量機SVM

目錄 簡介&#xff1a; 一、什么是支持向量機 二、如何選取最佳的超平面 1.超平面方程 (優化目標) 2.如何尋找最優的超平面 3.舉例分析 4.軟間隔?編輯 三、核函數 1舉例 2常用核函數 3.多項式核函數 4.高斯核函數: 四、svm的優缺點 五、支持向量機的API 六、案例…

P3232 [HNOI2013] 游走,solution

原題&#xff1a; link&#xff0c;點擊這里喵。 題意&#xff1a; 給定一個 nnn 個點 mmm 條邊的無向連通圖&#xff0c;圖無重邊和自環&#xff0c;頂點從 111 編號到 nnn&#xff0c;邊從 111 編號到 mmm。 小 Z 在該圖上進行隨機游走&#xff0c;初始時小 Z 在 111 號頂…

Docker容器部署discuz論壇與線上商城

準備 關閉防火墻&#xff0c;上下文[rootdocker ~]# systemctl disable --now firewalld[rootdocker ~]# setenforce 0下載應用yum remove runc -y ### rocky8才需要yum install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cento…

Linux入門指南:26個基礎命令全解析

目錄 一.基礎概念與入門 1.Linux操作系統簡介 2.終端與shell的基本概念 3.命令行界面的優勢 二.基礎指令 1.whoami ?2.useradd/userdel/passwd ?3.pwd ?4.ls ?5.cd 6.touch 7.mkdir 8.tree 9.rmdir/rm 10.man 11.cp 12.mv 13.cat 14.le…

【后端】Java 8 特性 `User::getId` 語法(方法引用)介紹

文章目錄核心概念解析&#xff1a;方法引用的四種類型&#xff1a;關鍵特性&#xff1a;使用場景推薦&#xff1a;何時避免使用&#xff1a;性能說明&#xff1a;在 Java 中&#xff0c; User::getId 是一種稱為 方法引用&#xff08;Method Reference&#xff09; 的語法糖&a…

基于BP與CNN的圖像分類模型構建、超參數優化及性能對比研究?

一、實驗目的實驗目標構建基于神經網絡模型的數據分析與模式識別框架&#xff0c;探明神經網絡在大數據分析中的意義。實驗任務構建基于深度 BP 神經網絡與卷積神經網絡的數據分析與模式識別框架&#xff0c;將數據集 MNIST 與 CIFAR-10 分別在兩種模型中訓練&#xff0c;并比較…

HarmonyOS應用開發-低代碼開發登錄頁面(超詳細)

本篇文章我來手把手教大家做一個HarmonyOS 應用的登錄頁面&#xff0c;逐步講解&#xff0c;非常細致&#xff0c;百分百能學會&#xff0c;并提供全部源碼。頁面使用 DevEco Studio 的低代碼開發。 通過本文的實踐經驗&#xff0c;我想告訴大家&#xff0c; HarmonyOS 應用開發…

AJAX與axios框架

文章目錄前言案例跨域訪問總結?前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 通過 ajax 進行前后端交互 案例 此項目用到了javaweb知識 首先創建JavaWeb項目編寫代碼&#xff1a; package ajax;import java.io.IOException; import java.util.Arr…

智能創造的幕后推手:AIGC浪潮下看AI訓練師如何塑造智能未來

文章目錄一、AIGC時代的算法與模型訓練概覽二、算法與模型訓練的關鍵環節三、AI訓練師的角色與職責四、AI訓練師的專業技能與素養五、AIGC算法與模型訓練的未來展望《AI訓練師手冊&#xff1a;算法與模型訓練從入門到精通》亮點內容簡介作者簡介谷建陽目錄《醫學統計學從入門到…

Python設計模式 - 裝飾模式

定義 裝飾模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;用于在不修改原有類的情況下動態地擴展對象的功能。 結構抽象組件&#xff08;Component&#xff09;&#xff1a;定義對象的公共接口&#xff0c;使得客戶端能以一致的方式處理未被裝…

MySQL(188)如何使用MySQL的慢查詢工具?

使用MySQL的慢查詢工具可以幫助開發者識別和優化性能不佳的SQL查詢。以下是詳細深入的步驟和代碼示例&#xff0c;幫助你使用MySQL的慢查詢工具來進行查詢分析和優化。 一、啟用慢查詢日志 首先&#xff0c;你需要確保MySQL的慢查詢日志功能是啟用的。慢查詢日志記錄了所有執行…