Linux訊息佇列實現程序間通訊例項詳解

2022-10-06 20:00:19 字數 1835 閱讀 9585

linux訊息佇列實現程序間通www.cppcns.com信例項詳解

一、什麼是訊息佇列

訊息佇列提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。  每個資料塊都被認為含有乙個型別,接收程序可以獨立地接收含有不同型別的資料結構。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。但是訊息佇列與命名管道一樣,每個資料塊都有乙個最大長度的限制。

linux用巨集msgmax和msgmnb來限制一條訊息的最大長度和乙個佇列的最大長度。

二、在linux中使用訊息佇列

linux提供了一系列訊息佇列的函式介面來讓我們方便地使用它來實現程序間的通訊。它的用法與其他兩個system v pic機制,即訊號量和共享記憶體相似。

程序間通訊(ipc):程序間通訊的本質就是通過讓不同的程序看到乙份公共的資源來實現通訊。

常用的程序間通訊的方式有兩種:通過管道和systemv標準,今天我們來介紹systemv標準中的一種:訊息佇列

訊息佇列:訊息佇列提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法,每個資料塊都認為是有乙個型別,接受者程序接收的資料塊可以有不同的型別值。我程式設計客棧們可以通過傳送訊息來避免命名管道的同步和阻塞問題。

特點:(1)訊息佇列可認為是全域性的乙個鍊錶,由訊息佇列識別符號進行標識。

(2)訊息佇列允許乙個或多個程序寫入或讀取訊息

(3)訊息佇列的宣告週期隨核心

(4)訊息佇列可以實現雙向通訊

建立乙個訊息佇列:msget()

第乙個引數:每乙個訊息佇列都有唯一的key值,可以由ftok()產生

第二個引數:一般由兩個選項ipc_creat和ipc_excl,單獨使用ipc_creat時,如果訊息佇列不存在則建立乙個,如果存在則開啟 ipc_excl 如果同時使用,如果訊息佇列不存在則建立之,如果存在則出錯返回。當單獨使用ipc_excl時,沒有意義。

ftok:

引數可由使用者指定。

下面用**實現訊息佇列的建立:

在建立乙個訊息佇列(其他ipc相同)時,需要先通過檔案路徑名和專案id獲取乙個鍵值,然後通過此鍵值由核心生成識別符號,在以後可通過此識別符號來使用此訊息佇列。

為什麼要有key值和識別符號兩個值呢?

描述符是對於使用者操作而言的,讓使用者感覺操作和對檔案的操作相同,key是對於系統內部說的。

我們使用ftok來建立key值,具體可以man一下fotk函式,大概是這樣的:按給定的路徑名取得其stat結構,從該結構中取出部分st_dev和st_ino欄位,然後再與專案id組合起來,如果兩個路徑名引用兩個不同的檔案,那麼,對這兩個路徑名呼叫ftok通常返回不同的key值,但是,因為i節點號和key通常都存放在長整型中,於是建立key時可能會丟失資訊,這意味著,如果使用同一專案id,那麼對於不同檔案的兩個路徑名可能產生相同的key值。而識別符號是唯一確定的,可以用來區別於其他ipc的。

刪除訊息佇列:msgctl()

**實現:

傳送訊息:msgsnd()

接收訊息:magrcv(),這兩個函式實現程序間的雙向通訊

引數:mswww.cppcns.comqid-訊息佇列標識碼

msgp-指向訊息緩衝區的指標,此位置是用來暫時儲存傳送和接收的訊息,是乙個使用者可定義的通用結構。

msgtyp-從訊息佇列內讀取的訊息形態。如果值為0,則表示訊息佇列中,所有訊息被讀取。

msgsz:訊息的大小

返回值:成功返回0,失敗則返回-1.

那麼如何檢視系統中正在執行的訊息佇列呢?

介紹兩個命令:ipcs -q 檢視訊息佇列

ipcrm -q msgid 刪除此訊息佇列

本文標題: linux訊息佇列實現程序間通訊例項詳解

本文位址: /os/linux/196056.html

Linux訊息佇列實現程序間通訊

什麼是訊息佇列 訊息佇列提供了從乙個程序向另乙個程序傳送乙個有型別資料塊的方法。用這種方法可以避免命名管道的同步和阻塞問題。訊息佇列是基於訊息的,而管道是基於位元組流的,並且訊息佇列的讀取不一定是先入先出。訊息佇列的操作 訊息佇列的建立或者獲取 int msgget key t key,int ms...

Linux程序間通訊 訊息佇列

linux和類linux系統下程序間通訊 inter process communication,ipc 有很多種方式,包括套接字 socket 共享記憶體 shared memory 管道 pipe 訊息佇列 message queue 等,各自有各自的一些應用場景和用途,這次就來聊一聊訊息佇列這...

linux程序間通訊 訊息佇列

訊息佇列由id 唯一標識 訊息佇列就是乙個訊息的列表,使用者可在佇列中新增,讀取訊息等 可按照型別來收發訊息 int msgget key t key,int flag int msgsnd int msqid,const void msgp,size t size,int flag msqid 訊...