之前介紹了程序間通訊的pipe通訊、fifo通訊和共享記憶體,三種通訊方式各有其適用範圍。
今天介紹第四種程序通訊方式—訊息佇列。
訊息佇列從字面理解就是訊息組成的列表。程序能夠從訊息佇列新增訊息和讀取訊息。
乍一看訊息佇列類似於fifo通訊,但訊息佇列能夠實現訊息的隨機查詢,有些讀者會疑惑這是什麼意思呢?
fifo中的資訊必須按照資訊的先後順序進行讀取,而訊息佇列能夠指定讀取某條訊息,即不必按照順序讀取訊息。
另外,程序通過訊息佇列新增和讀取的訊息也儲存在linux核心中,由「佇列id」進行標識。
訊息佇列的實現較為簡單,分為以下步驟:
(1)建立並開啟訊息佇列。通過函式msgget()建立並開啟訊息佇列。
(2)新增訊息。通過函式msgsnd()函式將程序的訊息新增到訊息佇列中。
(3)讀取訊息。通過函式msfrcv()函式把訊息從訊息佇列讀取到程序中。
note:在建立訊息佇列時,需要利用ftok函式將一條已存在的路徑和乙個整數轉換成型別為key_t的鍵值,這是由於msgget()函式需要利用ftok的返回值生成訊息佇列的id。
下面是共享記憶體的**實現(在linux環境下編譯通過):
傳送程序的**實現:
//傳送程序
#include#include#include#include#include#include#include#include#define max_buffer_len 1024
//定義訊息結構體
struct message
;int main()
msg_id = msgget(key, ipc_creat|0666);//建立訊息佇列,並設定檔案許可權掩碼0666
if(msg_id == -1)
else
while(1)
msg.msg_type = getpid();
if(msgsnd(msg_id, &msg, strlen(msg.msg_text), 0) == -1)//新增訊息到訊息佇列
if(strncmp(msg.msg_text, "quit", 4) == 0)//如果接收的訊息為quit,則退出接收程序
} exit(0);//傳送程序正常結束
return 0;
}
接收程序的**實現:
//接收程序
#include#include#include#include#include#include#include#include#define max_buffer_len 1024
//定義訊息的結構體
struct message
;int main()
msg_id = msgget(key, ipc_creat|0666);//建立訊息佇列,並設定檔案許可權掩碼0666
if(msg_id == -1)
else
while(1)
else
if(strncmp(msg.msg_text, "quit", 4) == 0)//如果接收的訊息為quit,則退出接收程序
} if(msgctl(msg_id, ipc_rmid, null) < 0)//ipc_rmid為從程序中刪除訊息佇列
exit(0);//接收程序正常結束
return 0;
}
note:接收程序和傳送程序均利用msgget函式建立訊息佇列,由於使用的訊息佇列的鍵值一致,所以返回的訊息佇列id也是一樣的,從而實現程序間訊息傳遞。下圖是執行結果:
note:在兩個終端中分別執行接收程序和傳送程序。
訊息佇列是程序間通訊的一種常用方式,其廣泛應用於實際專案中多程序的通訊,感興趣的讀者可以自己在電腦上嘗試實現訊息佇列通訊。
利用共享記憶體實現訊息佇列
日曆登入管理器 2009 02 28 22 02 44 分類 windows 標籤 舉報 字型大小大中 小訂閱 在windows中沒有方便操作message queue 訊息佇列 的api 在vxworks中有msgqcreate,msgqsend,msgqreceive等操作訊息佇列的 api 訊...
Linux程序間利用訊息佇列傳送資料
訊息佇列是linux系統程序之間通訊一種方式,除此之外,程序通訊方式還有多種。本文僅討論訊息佇列通訊方式。訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少 管道只能承載無格式位元組流以及緩衝區大小受限等缺點。訊息佇列函式由msgget msgctl msgs...
程式設計師高手和程式設計師菜鳥的區別是什麼?
程式設計師的價值絕對不在於技術本身,而在於做出好用且好看程式的能力,這是乙個開放性的話題,每乙個人都是菜鳥過來的,老九君希望每乙個做技術的小夥伴都能盡快成為高手。1 命名 從程式 的命名,我們就可以看出乙個人的水平。最差的命名就是使用中文 拼音 拼音縮寫 中英混搭,接下來要麼是模仿式命名,要麼乾脆就...