菜鳥程式設計師利用訊息佇列實現程序間通訊

2021-09-24 10:12:51 字數 1956 閱讀 9285

之前介紹了程序間通訊的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 命名 從程式 的命名,我們就可以看出乙個人的水平。最差的命名就是使用中文 拼音 拼音縮寫 中英混搭,接下來要麼是模仿式命名,要麼乾脆就...