訊息佇列可認為是乙個訊息鍊錶,有寫許可權的執行緒可以往訊息佇列中寫訊息,有讀許可權的執行緒可以從佇列中讀取訊息,從而實現資料共享。每個訊息都是一條記錄,具有以下屬性:
優先順序(無符號整數或長整數型別)
訊息的資料部分長度
資料本身。
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...