系統編程2(消息隊列)

? 消息隊列概念

Linux系統中消息隊列(Message Queue)是進程間通信的一種方式,這種通信機制的好處是可以傳輸指定類型(用戶可以自行定義)的數據,相同類型的數據根據到達順序在隊列中進行排隊。

當然,不同類型的數據不能處于同一個隊列中,也就是說系統中可能存在多個消息隊列,每個消息隊列中的數據類型都是不同的,所以用戶打算讀取消息隊列中的數據時也需要指定數據類型,才可以從存儲該類型數據的消息隊列中讀取有效數據。

思考:既然Linux系統中可能存在多條消息隊列,那操作系統是如何管理的以及進程如何選擇某個消息隊列來發送消息?

回答:Linux系統每個創建的消息隊列都具有一個唯一的鍵值key,進程可以通過指定消息隊列的鍵值來向消息隊列發送數據。Linux系統中提供了一個shell命令:ipcs -a來查看系統中所有的IPC對象的信息。
在這里插入圖片描述
? 創建消息隊列

思考:既然當前的Linux系統中不存在消息隊列,那用戶如何創建一個消息隊列供進程訪問?

回答:Linux系統提供了一個名稱叫做msgget()的函數接口,用戶利用該接口可以創建或者打開一個消息隊列,同樣Linux系統中提供了一個shell命令:ipcmk 可以用于創建IPC對象。

(1) ipcmk命令
在這里插入圖片描述
在這里插入圖片描述
(2) msgget()函數
在這里插入圖片描述
(3) 函數參數
msgget函數有兩個參數,第一個參數需要傳入一個key_t類型的值,該值指的是要創建的消息隊列的key鍵值,key也可以稱為密鑰。 鍵值類型key_t其實在內核源碼中指的是int類型,如下圖:
在這里插入圖片描述
msgget()函數的第二個參數指的是創建消息隊列的標志,其中IPC_CREAT指的是如果消息隊列不存在則創建,IPC_EXCL指的是如果消息隊列存在則表示函數調用失敗。

另外,也可以指定消息隊列的權限,權限的結構和open函數的mode類型,采用八進制表示,只不過消息隊列不需要設置執行權限,所以權限設置為0644即可。

(4) 返回結果

msgget()函數調用成功,則返回消息隊列的標識符,如果調用失敗,則返回-1并設置錯誤碼。

思考:可以看到調用msgget()函數需要傳入一個鍵值key,這個鍵值key是否可以由用戶指定?

回答:可以由用戶指定,但是不建議這樣操作,因為可能有多個進程都會創建消息隊列,如果某兩個進程指定的鍵值key相同,則會創建失敗,所以應該由系統生成唯一的鍵值key。

Linux系統中提供了一個名稱叫做ftok()的函數接口,利用該接口可以生成IPC對象的鍵值key,該接口的使用規則如下:

在這里插入圖片描述
可以看到,ftok()函數可以把一個指定路徑的文件和一個指定的項目id轉換為一個system-V IPC對象使用的鍵值key。

(1) 函數參數

ftok()函數的第一個參數指的是系統中已經存在并且可以訪問的一個文件的路徑,用戶可以指定一個文件,但是該文件必須存在且可以被訪問,其實就是為了得到文件的屬性信息中的inode編號和設備編號,因為Linux系統中一個文件的inode編號是唯一的。

ftok()函數的第二個參數指的是項目ID,這個可以由用戶進行指定,雖然參數proj_id的類型是整型int,但是只會用到最低8it,所以這個參數的范圍其實是1~255,因為這個參數的值必須是非0值。

(2) 返回結果

ftok()函數的返回值:當函數調用成功后,則返回生成的鍵值key,如果調用失敗,則返回-1。

(3) 注意事項

在man手冊中提到ftok()函數生成的鍵值key的組成:proj_id的低8位+ 設備編號的低8位+ inode編號的低16位。

練習:設計程序,在Linux系統中創建一個消息隊列,并測試消息隊列的鍵值key的組成是否正確。提示:可以通過stat()函數獲取文件的屬性信息。
在這里插入圖片描述
? 訪問消息隊列

思考:用戶如果創建了一個消息隊列,那進程如何向消息隊列收發數據,數據類型如何指定?

回答:Linux系統中提供了一個名稱叫做msgsnd()的函數接口,用戶利用該函數可以向指定的消息隊列發送消息,同時提供了一個名稱叫做msgrcv()的函數接口,用戶利用該接口可以從指定的消息隊列中讀取消息。
在這里插入圖片描述
(1) 發送消息
在這里插入圖片描述
可以知道,用戶創建的消息隊列是有默認容量的,默認容量是16384字節,可以通過msg.h得到,用戶在向消息隊列寫入數據的時候要考慮消息隊列的容量。
在這里插入圖片描述
msgsnd函數的第一個參數msgid指的是消息隊列的標識符,該標識符可以通過msgget函數得到。

msgsnd函數的第二個參數msgp指的是一個指向struct msgbuf類型的結構體指針,該結構體中有兩個成員,其中一個成員mtype指的是消息類型,必須是一個大于0的正整數,另一個成員mtext指的是消息正文,類型可以是數組或者其他結構。

在這里插入圖片描述
msgsnd函數的第三個參數msgsz指的是消息正文的大小,按字節計算,當然msgsz的值必須是非負整數,可以設置為0,表示消息正文的長度為0。

msgsnd函數的第四個參數msgflg指的是消息隊列的標志,如果該標志設置為IPC_NOWAIT,則表示不阻塞,此時如果待寫入的消息的長度大于消息隊列剩余空間,則直接返回并報錯。

注意:消息隊列默認的屬性是阻塞的,也就是當待寫入的消息的長度大于消息隊列剩余空間時,默認阻塞,直到消息隊列的容量足夠容納時會解除阻塞。

(2) 讀取消息

在這里插入圖片描述
第一個參數:msgqid指的是MSG對象的標識符ID,MSG標識符可以通過msgget()函數獲取。

第二個參數:msgp指的是存放消息的緩存地址,該地址下存儲的是struct msgbuf結構體。

第三個參數:msgsz指的是存放消息的緩存的大小,按照字節計算,如果消息正文的大小大于用戶設置的緩存大小,則根據msgflg是否為MSG_NOERROR進行判斷,如果msgflg設置為MSG_NOERROR ,則可以讀取對應字節的消息,如果msgflg沒有設置,則無法讀取消息并報錯。

第四個參數:msgtyp指的是要接收消息的類型,在調用msgsnd函數時構造的消息結構體中有該成員的值。

  1. 等于0:指的是不區分類型,直接讀取MSG中的第一個消息。

  2. 大于0:讀取類型為指定msgtyp的第一個消息(若msgflg被配置了MSG_EXCEPT則讀取除了類型為msgtyp的第一個消息)。

  3. 小于0:讀取類型小于等于msgtyp絕對值的第一個具有最小類型的消息。例如當MSG對象中有類型為3、1、5類型消息若干條,當msgtyp為-3時,類型為3的第一個消息將被讀取。

第五個參數:msgflg指的是接收消息選項,如果msgflg設置為0,指的是默認接收模式,在MSG中無指定類型消息時阻塞。

  1. IPC_NOWAIT :指的是非阻塞接收模式,當MSG中沒有指定類型消息時直接退出函數
  2. MSG_EXCEPT :指的是讀取除msgtyp之外的第一個消息。
  3. MSG_NOERROR:如果待讀取的消息尺寸比msgsz大只返回msgsz部分,其余部分丟棄

? 控制消息隊列

IPC對象是一種持久性資源,如果沒有明確的刪除掉IPC對象,則IPC對象是不會自動從內存中消失的。用戶除了可以使用命令的方式刪除,也可以使用函數來刪除。

Linux系統中提供了一個名稱叫做msgctl的函數接口,用戶可以利用該函數實現獲取消息隊列的屬性信息、設置消息隊列的屬性信息、刪除消息隊列等操作。

  1. 指令刪除
    在這里插入圖片描述
  2. 函數刪除
    在這里插入圖片描述
    在這里插入圖片描述

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

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

相關文章

Pytorch深度學習框架60天進階學習計劃 - 第41天:生成對抗網絡進階(二)

Pytorch深度學習框架60天進階學習計劃 - 第41天:生成對抗網絡進階(二) 7. 實現條件WGAN-GP # 訓練條件WGAN-GP def train_conditional_wgan_gp():# 用于記錄損失d_losses []g_losses []# 用于記錄生成樣本的多樣性(通過類別分…

python 微博爬蟲 01

起因, 目的: ?下載單個視頻,完成。? 獲取某用戶的視頻列表,完成。剩下的就是, 根據視頻列表,逐個下載視頻,我沒做,沒意思。獲取視頻的評論,以后再說。 關鍵點記錄: 1. 對一個視…

Servlet、HTTP與Spring Boot Web全面解析與整合指南

目錄 第一部分:HTTP協議與Servlet基礎 1. HTTP協議核心知識 2. Servlet核心機制 第二部分:Spring Boot Web深度整合 1. Spring Boot Web架構 2. 創建Spring Boot Web應用 3. 控制器開發實踐 4. 請求與響應處理 第三部分:高級特性與最…

vue中根據html動態渲染內容2.0

上次使用的是p標簽用的contenteditable代替的可編輯的input,最后實現還是選擇了用el-input的textarea方式。 一開始考慮的是需要根據用戶輸入自動撐開輸入框,所以選擇了p標簽可編輯。 最后發現還是el-input會更好一點,只不過需要處理輸入框撐…

CentOS 系統磁盤擴容并掛載到根目錄(/)的詳細步驟

在使用 CentOS 系統時,經常會遇到需要擴展磁盤空間的情況。例如,當虛擬機的磁盤空間不足時,可以通過增加磁盤容量并將其掛載到根目錄(/)來解決。以下是一個完整的操作流程,詳細介紹了如何將新增的 10G 磁盤…

LINUX基礎 [二] - Linux常見指令

目錄 💻前言 💻指令 🎮ls指令 🎮pwd指令 🎮whoami指令 🎮cd指令 🎮clear指令 🎮touch指令 🎮mkdir指令 🎮rmdir指令 🎮rm指令 &#…

基于php的成績分析和預警與預測網站(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 人類現已邁入二十一世紀,科學技術日新月異,經濟、資訊等各方面都有了非常大的進步,尤其是資訊與網絡技術的飛速發展,對政治、經濟、軍事、文化、教育等各方面都有了極大的影響。 利用電腦網絡的這些便利,發展一套…

《從底層邏輯剖析:分布式軟總線與傳統計算機硬件總線的深度對話》

在科技飛速發展的當下,我們正見證著計算機技術領域的深刻變革。計算機總線作為信息傳輸的關鍵樞紐,其發展歷程承載著技術演進的脈絡。從傳統計算機硬件總線到如今備受矚目的分布式軟總線,每一次的變革都為計算機系統性能與應用拓展帶來了質的…

Spring Boot 3.5新特性解析:自動配置再升級,微服務開發更高效

📝 摘要 Spring Boot 3.5作為Spring生態的最新版本,帶來了多項令人振奮的改進。本文將深入解析其中最核心的自動配置增強特性,以及它們如何顯著提升微服務開發效率。通過詳細的代碼示例和通俗易懂的講解,您將全面了解這些新特性在…

【前端】webpack一本通

今日更新完畢,不定期補充,建議關注收藏點贊。 目錄 簡介Loader和Plugin的不同?(必會) 使用webpack默認只能處理js文件 ->引入加載器對JS語法降級,兼容低版本語法合并文件再次打包進階 工作原理Webpack 的…

leetcode 264. Ugly Number II

動態規劃解決。 關鍵是理解如何生成新的丑數。這道題和經典的斐波那契數列問題其實是一樣的。求第n個數,需要用第n個數前面的數來求。不同的是,斐波那契數列不會重復。而本題的丑數,會重復出現。 class Solution { public:int nthUglyNumbe…

深入理解 HTML5 語義元素:提升網頁結構與可訪問性

引言 在構建網頁的過程中,合理的結構與清晰的語義對于網頁的質量、可維護性以及搜索引擎優化(SEO)都至關重要。HTML5 引入了一系列語義元素,為開發者提供了更精準描述網頁內容的工具。本文將深入探討 HTML5 語義元素的作用、使用…

PyCharm顯示主菜單和工具欄

顯示主菜單 新版 PyCharm 是不顯示主菜單的,要想顯示主菜單和工具欄,則通過 “視圖” → “外觀” ,勾選 “在單獨的工具欄中顯示主菜單” 和 “工具欄” 即可。 設置工具欄 此時工具欄里并沒有什么工具,因此我們需要自定義工具…

CyclicBarrier 基本用法

CyclicBarrier 基本用法 簡介 CyclicBarrier 是 Java 并發包(java.util.concurrent)中的一個同步輔助類。它允許一組線程相互等待,直到到達某個公共屏障點(common barrier point)。只有當所有參與的線程都到達屏障點…

[特殊字符] 手機連接車機熱點并使用 `iperf3` 測試網絡性能

好的,以下是根據你的描述整理出來的步驟及解釋: 📶 手機連接車機熱點并使用 iperf3 測試網絡性能 本文將通過 iperf3 來測試手機和車機之間的網絡連接性能。我們會讓車機作為服務端,手機作為客戶端,進行 UDP 流量傳輸…

FPGA上實現SD卡連續多塊讀的命令

在FPGA上實現SD卡連續多塊讀的命令 CMD17命令一次只能讀取1個塊 CMD18命令一次可以連續讀取多個塊,直到停止命令CMD12 CMD18命令讀的塊數程序可任意設置 目錄 前言 一、SD卡多塊讀命令CMD18 二、停止讀命令CMD12 三、SD卡初始化SD卡連續塊讀操作的verilog代碼 …

DeepSeek 助力 Vue3 開發:打造絲滑的日歷(Calendar)

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄 Deep…

NSGA-II 多目標優化 —— 理論、案例與交互式 GUI 實現

目錄 NSGA-II 多目標優化 —— 理論、案例與交互式 GUI 實現一、引言二、NSGA-II 基本原理2.1 非支配排序2.2 擁擠距離2.3 算法流程三、數學模型與算法推導3.1 多目標優化問題描述3.2 非支配關系與排序3.3 擁擠距離計算四、NSGA-II 的優缺點4.1 優點4.2 缺點五、典型案例分析5.…

庫學習04——numpy

一、基本屬性 二、 創建數組 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一個參數n的話,默認是從0到n-1的一維數組。 (二)自定義reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …

NVIDIA Jetson 快速切換CUDA版本| 多CUDA版本

當NVIDIA Jetson中安裝了多個CUDA時,可以通過命令,快速切換不同版本的。 這樣在環境變量和代碼編譯時,能使用指定版本的CUDA了。 本文適用于Jetson Nano、TX1/TX2、Xavier 和 Orin系列的設備,供大家參考。 cuda參考地址&#xf…