程序通訊之訊息佇列

2021-08-17 14:21:55 字數 1549 閱讀 8327

程序通訊之訊息佇列

一、前言:

前面講過,程序間管道的通訊,訊號量控制的通訊,以及一開始的訊號,這些都是程序的通訊方式。訊號通過響應某些條件產生事件,使得另一程序(即接收訊號的程序)做出相應的反應。管道是通過一端寫,另一端讀的方式進行通訊,即所謂的點對點通訊。訊號量是控制程序間對臨界資源訪問的乙個計數器,來進行同步通訊。那麼今天所說的是另外一種通訊方式-----訊息佇列。

二、訊息佇列的理論及特點

與之前的點對點通訊相比較,訊息佇列得到了很好的優化,為什麼這麼說呢?訊息佇列可以定向的傳送資料。那麼怎麼定向傳送資料這就要從它的內部傳輸資料開始分析了,它內部所傳輸的資料,也就是訊息,包含以下兩個元素:

訊息(資料塊) :    資料  ------+--------型別

所以訊息佇列就是乙個傳送帶有資料型別的資料,以及接受的程序可以通過型別獲得指定的資料,並且這些型別的資料遵循佇列的原則,即先進先出。

即然是佇列,那麼訊息佇列就有它的排隊原則:

最簡單的排隊原則就是上述所說的先進先出原則,但是當某些訊息比較緊急的時候這先進先出原則就顯得不夠用了,乙個可選的原則就是指定訊息的優先順序,這可以基於訊息的型別或者傳送者指定,另一種選擇就是接受者檢查訊息佇列選出下一條所要接收的資訊(即通過型別指定)。

訊息佇列是一列具有頭和尾的佇列,新來的資訊放在佇列尾部,而讀取的資料從佇列的頭部讀取。

如圖所示:

msga.c檔案

#include #include #include #include #include #include struct msgbuff

;void main()

讀取資料:msgb.c檔案

#include #include #include #include #include #include struct msgbuff

;int main(int argc,char *argv)

else

}

執行結果及分析:

執行./msga之前:

執行./msga之後:

used-bytes這與我們的寫入my baby的位元組剛剛好相等。

執行./msgb:讀取資料,my  和  baby 

成功讀取出來,並且是定向的接收資料。

那麼我們再看一下訊息佇列裡面是否還有資料:

顯示已經沒有資料了。

程序通訊之訊息佇列

1.測試 include include include include include include include includevoid msg show int msg id,struct msqid ds msg info printf n show msg info printf th...

程序間通訊之訊息佇列

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...

linux c 程序通訊之訊息佇列

訊息佇列是乙個存放在核心中的訊息鍊錶,每個訊息佇列由佇列識別符號標識,與管道不同的是訊息佇列是放在核心當中,只有在核心重啟,或者顯式的刪除乙個訊息佇列,該訊息佇列才會被真正的刪除,以下會有幾個操作,1.建立訊息佇列 include include key t ftok const char path...