進程通信-消息隊列

消息隊列允許一個進程將一個消息發送到一個隊列中,另一個進程從該隊列中接收這個消息。

使用流程:

寫端:

  1. 使用結構體 mq_attr 設置消息隊列屬性,有四個選項:

    ? ? long mq_flags; ? // 隊列屬性: 0 表示阻塞
    ? ? long mq_maxmsg; ?// 最大消息數
    ? ? long mq_msgsize;// 每條消息最大字節數
    ? ??long mq_curmsgs; // 當前消息數(只讀)

    ? ??通常只用設置中間兩個,其他設為0。

  2. 使用mq_open()創建或打開消息隊列,其返回值為消息隊列描述符(mqd_t)。
  3. 向消息隊列中發送消息
    1. 設置發送超時等待時間,也就是當消息隊列已滿的情況下繼續發送消息,超過等待時間后就丟棄這個消息。
    2. 定義時間規格結構體 timespec ,使用clock_gettime(CLOCK_REALTIME)將timespec設置為當前時間。
    3. 自己決定等待時間為多少。
    4. 使用mq_timedsend()發送消息。?
  4. 清理:使用mq_close() 關閉消息隊列描述符

讀端:

  1. 使用mq_open()打開消息隊列。
  2. 從消息隊列中讀消息。
    1. 設置接收超時等待時間,具體的超時處理自己決定,可以退出,也可以繼續等待。設置方式同上。
    2. 使用mq_timedreceive()接收消息。
  3. 清理:使用mq_close()關閉消息隊列;使用mq_unlink()刪除消息隊列。

代碼示例:

mq_write.cpp

#include <iostream>
#include <mqueue.h>
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <time.h>
#include <string>
#include <errno.h>const char *mq_name = "/mq_name";int main(int argc, char const *argv[])
{// 1.設置消息隊列屬性struct mq_attr attr = {0, 3, 128, 0};// 2.創建或打開消息隊列mqd_t mqd = mq_open(mq_name, O_WRONLY | O_CREAT, 0664, &attr);if (mqd == (mqd_t)-1){perror("mq_open");exit(EXIT_FAILURE);}// 3.往消息隊列中寫數據while (true){std::string input;std::cout << "請輸入要傳輸的數據(exit退出):" << std::endl;std::getline(std::cin, input);// 設置5s的超時等待struct timespec st;clock_gettime(CLOCK_REALTIME, &st);st.tv_sec += 5;// 發送數據if (mq_timedsend(mqd, input.c_str(), input.size(), 0, &st) == -1){perror("mq_timedsend");if (errno == ETIMEDOUT){std::cerr << "消息隊列已滿,等待中...\n";if (input == "exit")break;continue;}}if (input == "exit")break;}// 4.清除mq_close(mqd);return 0;
}

mq_read.cpp

#include <iostream>
#include <mqueue.h>
#include <cstdio>
#include <unistd.h>
#include <cstdlib>
#include <fcntl.h>
#include <time.h>
#include <string>
#include <errno.h>const char *mq_name = "/mq_name";int main(int argc, char const *argv[])
{// 1.打開消息隊列mqd_t mqd = mq_open(mq_name, O_RDONLY);if (mqd == (mqd_t)-1){perror("mq_open");exit(EXIT_FAILURE);}// 2.從消息隊列中讀數據while (true){// 設置5s的超時等待struct timespec st;clock_gettime(CLOCK_REALTIME, &st);st.tv_sec += 5;// 接收數據char buffer[128] = {0};if (mq_timedreceive(mqd, buffer, 128, nullptr, &st) == -1){perror("mq_timedreceive");if (errno == ETIMEDOUT){std::cerr << "接收超時,繼續等待...\n";continue;}elsebreak;}std::string output(buffer);if (output == "exit"){break;}std::cout << "收到消息:" << output << std::endl;}// 4.清除mq_close(mqd);mq_unlink(mq_name);return 0;
}

編譯后同時執行兩個程序,效果如下:

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

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

相關文章

串行通信接口USART,printf重定向數據發送,輪詢和中斷實現串口數據接收

目錄 UART通信協議的介紹 實現串口數據發送 CubeMX配置 printf重定向代碼編寫 實現串口數據接收 輪詢方式實現串口數據接收 接收單個字符 接收不定長字符串&#xff08;接收的字符串以\n結尾&#xff09; 中斷方式實現串口數據接收 CubeMX配置 UART中斷方式接收數據…

Kafka 生產者和消費者高級用法

Kafka 生產者和消費者高級用法 1 生產者的事務支持 Kafka 從版本0.11開始引入了事務支持&#xff0c;使得生產者可以實現原子操作&#xff0c;確保消息的可靠性。 // 示例代碼&#xff1a;使用 Kafka 事務 producer.initTransactions(); try {producer.beginTransaction();pr…

k8s中crictl命令常報錯解決方法

解決使用crictl命令時報默認端點棄用的報錯 報錯核心原因 默認端點棄用&#xff1a; crictl 會默認嘗試多個容器運行時端點&#xff08;如 dockershim.sock、containerd.sock 等&#xff09;&#xff0c;但這種 “自動探測” 方式已被 Kubernetes 棄用&#xff08;官方要求手動…

回轉體水下航行器簡單運動控制的奧秘:PID 控制和水動力方程的運用

在水下航行器的控制領域中&#xff0c;回轉體水下航行器的運動控制是一個關鍵課題。 今天&#xff0c;就來深入探討一下其簡單運動控制中&#xff0c;PID 控制以及水動力方程的相關運用。 PID 控制的基本原理PID 控制&#xff08;比例 - 積分 - 微分控制&#xff09;是一種廣…

從入門到精通:npm、npx、nvm 包管理工具詳解及常用命令

目錄 1. 引言2. npm (Node Package Manager)2.1 定義與用途2.2 常見命令2.3 使用示例 3. npx (Node Package Execute)3.1 定義與用途3.2 常見命令3.3 使用示例3.4 npm 與 npx 的區別 4. nvm (Node Version Manager)4.1 定義與用途4.2 安裝 nvm4.3 常見命令4.4 使用示例 5. 工具…

es6特性-第二部分

Promise 介紹和基本使用 Promise是ES6引入的異步編程的新解決方案&#xff0c;主要用來解決回調地獄問題。語法上 Promise是一個構造函數,用來封裝異步操作并可以獲取其成功或失敗的結果。 Promise構造函數:new Promise() Promise.prototype.then方法 Promise.prototype.ca…

java:如何用 JDBC 連接 TDSQL 數據庫

要使用JDBC連接TDSQL數據庫&#xff08;騰訊云分布式數據庫&#xff0c;兼容MySQL協議&#xff09;&#xff0c;請按照以下步驟編寫Java程序&#xff1a; 1. 添加MySQL JDBC驅動依賴 在項目的pom.xml中添加依賴&#xff08;Maven項目&#xff09;&#xff1a; <dependenc…

2025年四川省高考志愿填報深度分析與專業導向策略報告——基于599分/24000位次考生-AI

2025年四川省高考志愿填報深度分析與專業導向策略報告——基于599分/24000位次考生 摘要 本報告旨在為預估高考成績599分、全省物理類位次在24,000名左右的2025年四川考生&#xff0c;提供一份兼具科學性、前瞻性與專業深度的志愿填報策略方案。報告嚴格遵循“位次法”為核心…

spring boot項目整合百度翻譯

本片文章教大家怎樣在spring boot項目中引入百度翻譯&#xff0c;并且優雅的使用百度翻譯。 首先&#xff0c;我們要了解為什么要使用翻譯插件。為了支持多語言的國際化&#xff1b; 目前市面上最常見的后端國際化就是在resource資源目錄下設置多個語言文檔&#xff0c;這些文…

凌晨2點自動備份mysql 數據庫,mysql_backup.sh

1、編寫備份腳本&#xff1a;vim mysql_backup.sh #!/bin/bash DATE$(date %Y%m%d_%H%M%S) BACKUP_DIR"/data/mysql/backup" USER"backup_user" PASSWORD"backup**"# 邏輯備份所有數據庫 mysqldump -u$USER -p$PASSWORD eblp | gzip > $BA…

Linux系統之Tomcat服務

目錄 一、Tomcat概述 1、Tomcat介紹 2、Tomcat歷史 二、Tomcat原理分析 1、Http工作原理 2、Tomcat整體架構 3、Coyote連接器架構 4、Catalina容器架構 5、Jasper處理流程 6、JSP編譯過程 7、Tomcat啟動流程 8、Tomcat請求處理流程 三、Tomcat安裝與配置 1、單實…

FPGA芯片的供電

FPGA芯片的供電 文章目錄 FPGA芯片的供電1. 外部端口供電機制2. 內部邏輯供電機制3. 專有電路供電機制4. 電源穩定性討論總結 1. 外部端口供電機制 FPGA是專門用于數字系統設計的芯片&#xff0c;能夠正確、可靠、高效地和外界其他數字電路進行通信是FPGA芯片必備的一個功能。…

構建可無限擴展的系統:基于 FreeMarker + 存儲過程 + Spring Boot 的元數據驅動架構設計

在構建面向多行業、多客戶的大型業務系統時&#xff0c;系統的靈活性與擴展能力成為架構設計的核心目標。傳統硬編碼的開發方式在面對高頻變化、復雜組合查詢、多租戶自定義字段時&#xff0c;往往難以適應。 為了解決上述問題&#xff0c;我們提出一種 以 FreeMarker 腳本托管…

2-深度學習挖短線股-3-訓練數據計算

2-3 合并輸入特征 首先定義了數據預處理函數&#xff0c;將連續 n 天的 K 線數據&#xff08;如開盤價、收盤價、成交量等&#xff09;合并為一行特征&#xff0c;同時保留對應的目標標簽&#xff08;buy 列&#xff0c;表示是否應該買入&#xff09;&#xff1b;然后讀取股票代…

SpringMVC系列(四)(請求處理的十個實驗(下))

0 引言 作者正在學習SpringMVC相關內容&#xff0c;學到了一些知識&#xff0c;希望分享給需要短時間想要了解SpringMVC的讀者朋友們&#xff0c;想用通俗的語言講述其中的知識&#xff0c;希望與諸位共勉&#xff0c;共同進步&#xff01; 本系列會持續更新&#xff01;&…

產線通信“變形記”:PROFIBUS-DP與ETHERNET/IP的食品飲料跨界融合

在食品飲料加工行業&#xff0c;為實現不同設備間高效通信&#xff0c;JH-PB-EIP疆鴻智能PROFIBUS DP轉ETHERNET/IP網關發揮著關鍵作用。西門子PLC常采用PROFIBUS DP協議&#xff0c;而碼垛機器人等設備多使用ETHERNET/IP協議&#xff0c;網關成為連接二者的橋梁。 將DP作為從站…

設計模式-觀察者模式(發布訂閱模式)

一、需要的類 一個發布類&#xff1a;里面一個是別人需要訂閱的屬性&#xff0c;以及用于存儲訂閱者的list&#xff0c;attach方法是往list集合里面添加元素&#xff0c;notifyObservers通知方法&#xff0c;也就是循環調用訂閱者里面的一個方法&#xff0c;這個notifyObserve…

Linux測試是否能聯網

ping百度看是否有返回包&#xff1a; ping www.baidu.com ping -c可以通過參數提前設置發送的包數量&#xff1a; ping -c 4 www.baidu.com 終止ping快捷鍵&#xff1a; 按下 Ctrl C&#xff1a;立即終止ping進程&#xff0c;并顯示統計信息。按下 Ctrl Z&#xff1a;將進…

TOGAF? 架構分區:優秀架構的秘密

TOGAF &#xff08;The Open Group架構框架&#xff09;已成為企業架構事實上的全球標準, 是世界上使用最廣泛的企業架構框架。 它為企業 IT 架構的設計、規劃、實施和管理提供了一套全面的方法和工具。但是&#xff0c;即使是經驗豐富的架構師也經常會忽略 TOGAF 中隱藏的寶…

如何讓視頻在特定的網站上播放/禁止播放?(常見的視頻防盜鏈技術之一)

一、需求背景 在各行各業中,不論是教育、貿易還是醫療領域,視頻內容都存在被盜用的風險。為加強視頻安全性,我們可以采取特殊設置措施,例如限制視頻僅在高安全性網站播放,或屏蔽高風險網站。那么,具體有哪些方法可以有效保護視頻安全呢? 二、需求解決 通過OVP防盜鏈技…