程序間通訊之訊息佇列

2021-08-01 11:28:35 字數 2494 閱讀 3754

訊息佇列其實就是提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。 我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。此外,訊息佇列和管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列不一定是先入先出。訊息佇列與命名管道有一樣的不足,就是每個訊息的最大長度是有上限的(

msgmax

),每個訊息佇列的總的位元組數是有上限的(

msgmnb

),系統上訊息佇列的總數也有乙個上限(

核心為每乙個ipc物件都維護了乙個資料結構

訊息佇列,訊號量和共享記憶體都有這樣乙個共同的資料結構。

而訊息佇列的結構則是

可以看到第乙個條目就是ipc結構體,即是共有的,後面都是訊息佇列私有的成員。

訊息佇列是通過鍊錶實現的。

1.建立新訊息佇列或者獲取已有的訊息佇列

其中,key可以認為是乙個埠號,由函式ftok()建立,原型如下:

而msg***則是乙個標識,ipc_creat

如果ipc

不存在,則建立乙個

ipc資源,否則開啟操作;

ipc_excl

:只有在共享記憶體不存在的時候,新的共享記憶體才建立,否則就產生錯誤。

如果將ipc_creat

和ipc_excl

標誌一起使用,

***get()

將返回乙個新建的

ipc識別符號;如果該

ipc資源已存在,或者返回-1。

2.向佇列讀或寫訊息

①msgrcv()從佇列中獲取訊息

②msgsnd()往佇列中放資料

其中,msqid是訊息佇列的標識碼;而msgp是

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

struct msgstru;

msgsz是指

訊息的大小。

msgtyp是指

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

msg***

是用來指明核心程式在佇列沒有資料的情況下所應採取的行動。預設為0。

3.設定訊息佇列屬性

系統呼叫對

msgqid

標識的訊息佇列執 

cmd

操作,系統定義了 3 種

cmd

操作:

ipc_stat , ipc_set , ipc_rmid。

ipc_stat :

該命令用來獲取訊息佇列對應的

msqid_ds

資料結構,並將其儲存到

buf

指定的位址空間。

ipc_set :

該命令用來設定訊息佇列的屬性,要設定的屬性儲存在

buf中。

ipc_rmid :

從核心中刪除

msqid

標識的訊息佇列。

下面我們就去學習如何實現訊息佇列

首先這是comm.h的**:

然後是comm.c去實現標頭檔案中定義的**:

模擬實現完訊息佇列後,我們需要去測試一下:

傳送端client.c

接收端server.c

然後我們執行**:

執行兩個程式,然後在client這端輸入,然後就會在server這端顯示;

然後在server這端在隨便輸入乙個,那麼client這端就會接收到訊號,然後就可以繼續往其中輸入了,然後就會再在server這端顯示出來。

以上就是訊息佇列的模擬實現了。

程序間通訊之訊息佇列

include include define max msg buf len 512 int ikey 6004 struct ipcmsgbuf int main void 寫訊息佇列 memset msgdata,0,sizeof struct ipcmsgbuf msgdata.mtype 1...

程序間通訊之訊息佇列

訊息佇列 訊息佇列本質上是提供了一種從乙個程序向另乙個程序傳送資料快的方法。每個資料快都被認為是有乙個型別,接受者程序接收的資料塊可以有不同的型別值。訊息佇列和管道的區別 1 訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先進先出的。2 訊息佇列的生命週期是隨核心的 不隨程序...

程序間通訊之訊息佇列

一訊息佇列 1,訊息佇列就是乙個訊息的鍊錶,把訊息看做乙個記錄,具有特定格式。程序可以向其中按照一定的規則新增新訊息 另一些程序則可以從訊息佇列中讀走訊息。2,分類 posi訊息佇列,系統v訊息佇列 大量使用 3,鍵值 訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙...