程序間通訊 IPC 訊息佇列

2021-09-17 02:10:20 字數 2217 閱讀 7661

訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號標識。有足夠寫許可權的程序可往佇列中放置訊息,有足夠讀許可權的程序可從佇列中取走訊息。posix 和 system v 下的訊息佇列略有不同,主要體現在一下幾個方面:

這裡我們以 posix 下的訊息隊列為例來進行講解。

訊息佇列的建立

訊息佇列的 mq_open 函式如同操作檔案的 open 函式,用於開啟或建立乙個訊息佇列,其介面定義如下:

#include /* for o_* constants */

#include /* for mode constants */

#include mqd_t mq_open(const char *name, int oflag);

mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);

訊息佇列中的 mode 位同普通檔案操作的 mode 位使用是完全一致的。

呼叫 fork 之後,子程序也獲得了訊息佇列的描述符,因此子程序同樣也可以開啟這個訊息佇列。當子程序呼叫 exec 之後,由於核心實現中訊息佇列的描述符帶有 o_cloexec 標誌位,所以其開啟的訊息佇列會被自動關閉。

當程序退出時,所有開啟的訊息佇列都會被關閉。

訊息佇列的關閉和銷毀

mq_close 函式用於訊息佇列的關閉,這個函式和檔案關閉的 close 函式十分相似,其介面定義如下:

#include int mq_close(mqd_t mqdes);
posix 訊息佇列具有核心永續性,即使開啟該訊息佇列的所有程序都執行了 mq_close,訊息佇列的引用計數已經變為 0,但只要不顯式的呼叫 mq_unlink 函式,該佇列及佇列上的訊息依然存在。要想銷毀佇列,必須要呼叫 mq_unlink 函式,其介面定義如下:

#include int mq_unlink(const char *name);
訊息佇列的屬性

首先我們來看一下訊息佇列的結構體是如何定義的:

struct mq_attr
這個結構體定義在 檔案中,其中:

如果呼叫 mq_open 函式建立訊息佇列時,第四個引數為 null,那麼將使用預設屬性,使用 mq_getattr 函式可檢視訊息佇列的屬性,其介面定義如下:

#include int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
使用 mq_setattr 函式可以修改訊息佇列的 mq_flags 屬性,其介面定義如下:

#include int mq_setattr(mqd_t mqdes, struct mq_attr *newattr, struct mq_attr *oldattr);
傳送訊息

#include int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio);
第三個引數 msg_len 表示訊息體的長度,長度為 0 也是合法的,最大不能超過 mq_msgsize。如果訊息體太大,則會返回失敗,並設定 errno 為 emsgsize。

第四個引數為訊息的優先順序,是乙個非負的整數,數字越大優先順序越高,在 linux 中,優先順序的最大上限為32768。

接收訊息

#include ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);
對於 posix 訊息佇列來說,最先被取走的總是到達的訊息中優先順序最高的乙個,如果有多個訊息優先順序相同,那麼就取走最先到達的乙個。

第二個引數 msg_ptr 用於存放訊息體的記憶體緩衝區的位址。第三個引數 msg_len 是指向緩衝區的大小(必須大於等於屬性值 mq_msgsize 的值,否則返回 emsgsize )。 第四個引數為訊息的優先順序,如果 msg_prio 不為 null,那麼接收到的訊息優先順序會被複製到prio指向的位置,如果第四個引數為 null,則表示不關係該訊息體的優先順序。

程序間通訊 IPC 訊息佇列

訊息 可以簡單理解為型別 資料 訊息型別需大於等於1,0代表著不區分訊息型別,也可以認為是任何型別 struct mess 訊息佇列在同一型別上的訊息傳遞符合先進先出的規定,對於整個訊息佇列而言,類優先順序佇列 引用標頭檔案 include 建立 int msgget ket t key int f...

4 程序間通訊 訊息佇列IPC

1 建立乙個訊息佇列,然後使用msgctl函式讀取相關資訊,單程序 code 結果 root ubuntu code chap9 run1 res is 0 buf.msgmax 8192 rev msg hello world 2 使用訊息佇列實現實時通訊 注 阻塞的 可以考慮實現雙向的基於型別的...

訊息佇列IPC 用途 程序間通訊

0 下面用的標頭檔案 common.h 1 建立訊息佇列 2 配置訊息佇列 3 相乙個訊息佇列中寫訊息 4 從訊息佇列中讀取訊息 5 意除訊息佇列 5 訊息佇列api 1 函式 megget 建立乙個新的訊息佇列 或者獲取訊息佇列id 2 函式 msgsnd 向訊息佇列傳送訊息 3 函式 msgrc...