程序通訊之訊息佇列
一、前言:
前面講過,程序間管道的通訊,訊號量控制的通訊,以及一開始的訊號,這些都是程序的通訊方式。訊號通過響應某些條件產生事件,使得另一程序(即接收訊號的程序)做出相應的反應。管道是通過一端寫,另一端讀的方式進行通訊,即所謂的點對點通訊。訊號量是控制程序間對臨界資源訪問的乙個計數器,來進行同步通訊。那麼今天所說的是另外一種通訊方式-----訊息佇列。
二、訊息佇列的理論及特點
與之前的點對點通訊相比較,訊息佇列得到了很好的優化,為什麼這麼說呢?訊息佇列可以定向的傳送資料。那麼怎麼定向傳送資料這就要從它的內部傳輸資料開始分析了,它內部所傳輸的資料,也就是訊息,包含以下兩個元素:
訊息(資料塊) : 資料 ------+--------型別
所以訊息佇列就是乙個傳送帶有資料型別的資料,以及接受的程序可以通過型別獲得指定的資料,並且這些型別的資料遵循佇列的原則,即先進先出。
即然是佇列,那麼訊息佇列就有它的排隊原則:
最簡單的排隊原則就是上述所說的先進先出原則,但是當某些訊息比較緊急的時候這先進先出原則就顯得不夠用了,乙個可選的原則就是指定訊息的優先順序,這可以基於訊息的型別或者傳送者指定,另一種選擇就是接受者檢查訊息佇列選出下一條所要接收的資訊(即通過型別指定)。
訊息佇列是一列具有頭和尾的佇列,新來的資訊放在佇列尾部,而讀取的資料從佇列的頭部讀取。
如圖所示:
msga.c檔案
讀取資料:msgb.c檔案#include #include #include #include #include #include struct msgbuff
;void main()
執行結果及分析:#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...