POSIX訊息佇列

2021-07-05 11:25:55 字數 1556 閱讀 5626

訊息佇列可認為是乙個訊息鍊錶,有寫許可權的執行緒可以往訊息佇列中寫訊息,有讀許可權的執行緒可以從佇列中讀取訊息,從而實現資料共享。每個訊息都是一條記錄,具有以下屬性:

優先順序(無符號整數或長整數型別)

訊息的資料部分長度

資料本身。

1、 相關函式

標頭檔案:#include

建立和開啟:mqd_t mq_open(const char *name, int oflag, /*mode_t, struct mq_attr*attr */)

其中name為訊息佇列的名稱(需符合ipc規則——即乙個檔案的絕對路徑名),oflag引數指定讀寫(o_rdonly、o_rdwd)開啟,也可按位或上o_creat、o_excl或o_nonblock。

其用法和open函式類似,當建立乙個新佇列時,要指定mode及attr。

成功返回訊息佇列描述符,失敗返回-1

關閉:int mq_close(mgd_t mqdes) 成功返回0,若出錯則為-1

刪除:int mg_unlink(const char *name)  用法同unlink。

傳送:mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio)

接收:mq_receive(mqd_t mqdes, char *ptr, size_t len, unsigned int *prio)

獲取和設定訊息佇列屬性:

int mg_getattr(mgd_t mqdes, struct mq_attr*attr);

int mq_setattr(mqd_t mqdes, const structmq_attr *attr, struct mq_attr *oattr).

mq_attr結構如下:

struct mq_atrr{

long mq_flag; //阻塞(0)與非阻塞(o_noblock)

long mq_maxmsg; //訊息佇列最大訊息數

long mq_msgsize; //一條訊息的最大位元組數

long mq_curmsg;  //訊息佇列的訊息數

其中mq_send中的prio引數必須小於mq_prio_max(可以通過sysconf(_sc_mq_prio_max)獲取), mq_receive的len引數的值不能小於能加到所指定佇列中的訊息的最大大小(mq_attr結構中的mq_msgsize成員)。如果len小於該值,mq_receive就立即返回emsgsize錯誤。

其他的限制還包括乙個程序能夠同時開啟的訊息佇列數(可用sysconf(_sc_mq_open_max)獲取)

2、 特性

posix訊息佇列至少具有隨核心的持續性,即使當前沒有程序開啟著某個訊息佇列,該佇列及其上的各個訊息也將一直存在,直到刪除該佇列為止。

當訊息佇列中有多個訊息時,呼叫mq_receive將返回優先順序最高的訊息

posix訊息佇列允許非同步事件通知,以告知何時有乙個訊息放置到了某個空訊息佇列中。這種通知通過mq_notify函式實現,可以通過訊號或建立乙個非同步呼叫執行緒方式實現。

Posix訊息佇列

posix訊息佇列與system v訊息佇列的主要差別 1 對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列的讀則可以返回任意指定優先順序的訊息 2 當往乙個空佇列放置乙個訊息時,posix訊息佇列允許產生乙個訊號或啟動乙個執行緒,system v訊息佇列則不提供類...

posix 訊息佇列

posix 訊息佇列 訊息佇列的使用 1.建立訊息佇列mq open const char name,int oflag,mode t mode,struct mq attr attr name 訊息佇列的名稱,以 開頭 oflag 標誌,o rdonly 唯讀 o wronly 只寫 o rdwr...

POSIX訊息佇列

訊息佇列可以認為是乙個鍊錶。程序 執行緒 可以往裡寫訊息,也可以從裡面取出訊息。乙個程序可以往某個訊息佇列裡寫訊息,然後終止,另乙個程序隨時可以從訊息佇列裡取走這些訊息。這裡也說明了,訊息佇列具有隨核心的持續性,也就是系統不重啟,訊息佇列永久存在。3.2.1 建立 並開啟 關閉 刪除乙個訊息佇列 i...