POSIX 訊息佇列 之 概述 鏈結方式

2021-09-06 19:52:09 字數 3812 閱讀 9309

name

mq_overview —— posix訊息佇列概述

description

posix訊息佇列允許程序以訊息的形式交換資料。此api與system v訊息佇列(msgget(2),msgsnd(2),msgrcv(2)等)有明顯不同,但做的事情差不多。

訊息佇列通過mq_open(3)建立和開啟,此函式返回乙個訊息佇列描述符(mqd_t),它用於之後的呼叫中引用開啟的訊息佇列。每個訊息佇列由乙個名字標識,該名字具有這樣的格式/somename,亦即,乙個空字元結尾,以斜線開頭,最多跟著name_max(即255)個字元,並且這些字元都不能是斜線。若傳遞相同的名字給mq_open,兩個程序可以操作同乙個佇列。

訊息通過呼叫mq_send(3)和mq_receive(3)傳遞。當乙個程序結束使用該佇列,則它呼叫mq_close(3),當乙個佇列不再需要了,則可以呼叫mq_unlink(3)刪除。佇列屬性可以呼叫mq_getattr(3)/mq_setattr(3)獲取/修改。乙個程序可以在乙個空佇列上呼叫mq_notify請求訊息到達的非同步通知。

訊息佇列描述符引用到乙個開啟的訊息佇列(模擬open(2))。fock(2)之後,子程序繼承父程序佇列描述符的拷貝,兩個描述符都引用到父程序的那個描述符。兩個程序持有的描述符共享與訊息佇列描述符相關聯的標記(mq_flags)。

每個訊息都有乙個關聯的優先順序,訊息總是從最高優先順序交給接收程序。訊息優先順序範圍從0(低優先順序)到sysconf(_sc_mq_prio_max)-1(高優先順序)。linux下,sysconf(_sc_mq_prio_max)返回32768,但是posix.1-2001只要求支援0到31的優先順序即可,許多實現也只提供這個範圍。

餘下的部分描述一些posix訊息佇列在linux實現上的特殊細節。

庫介面和系統呼叫

大多數情況下,上面列出的mq_*()庫介面對應到的底層的系統呼叫是相同的名字。對應的情況羅列於下:

庫介面 系統呼叫

mq_close(3) close(2)

mq_getattr(3) mq_getsetattr(2)

mq_notify(3) mq_notify(2)

mq_open(3) mq_open(2)

mq_receive(3) mq_timedreceive(2)

mq_send(3) mq_timedsend(2)

mq_setattr(3) mq_getsetattr(2)

mq_timedreceive(3) mq_timedreceive(2)

mq_timedsend(3) mq_timedsend(2)

mq_unlink(3) mq_unlink(2)

版本posix訊息佇列在核心2.6.6後支援。

glibc在版本2.3.4後提供支援。

核心配置

可通過config_posix_mqueue核心配置選項支援posix訊息佇列。此選項預設被啟用。

永續性posix訊息佇列具有核心永續性:如果沒有呼叫mq_unlink移除,訊息佇列將在系統關閉之前一直存在。

鏈結

使用posix訊息佇列api的程式必須帶選項編譯cc -lrt以鏈結到實時庫librt。

/proc介面

下列介面可以用於限制核心內存在posix訊息佇列上的消耗量:

/proc/sys/fs/mqueue/msg_max

此檔案可以用於檢視和修改在佇列中排隊訊息的數量的上界。此值可以作為乙個上限值在傳遞給mq_open的引數attr->mq_msgmax中給定。msg_max的預設值是10,最小值是1(在核心2.6.28之前是10)。此值上限是hard_max:131072/sizeof(void*)(x86下是32768)。特權程序(cap_sys_resource)可以忽略此限制,但是hard_max的上界依然存在。

/proc/sys/fs/mqueue/msgsize_max

此檔案可以用於檢視和修改訊息大小最大值的上界。此值可以在attr->mq_msgsize指定並傳遞給mq_open。msgsize_max的預設值是1,048,576(核心2.6.28之前的上限是int_max,x86下為2,147,483,647)。特權程序(cap_sys_resource)可以忽略此限制。

/proc/sys/fs/mqueue/queues_max

此檔案可以用於檢視和修改整個系統上可建立的訊息佇列的數量的限制值。一旦到達此限制,則只有特權程序(cap_sys_resource)才可以建立新的訊息佇列。預設值是256,可以被修改為0到int_max之間的任意值。

資源限制

資源限制rlimit_msgqueue,限制屬於乙個有效使用者id的所有訊息佇列消耗的空間量。參見getrlimit(2)。

掛載訊息佇列檔案系統

linux下,訊息佇列被建立在虛擬檔案系統中。(其它實現可能也提供這樣的特性,但細節可能不一樣)此檔案系統可以使用以下命令掛載(由超級使用者):

# mkdir /dev/mqueue

# mount -t mqueue none /dev/mqueue

該目錄的粘連位自動被啟用。

在檔案系統掛載上去之後,系統上的訊息佇列就可以像處理檔案那樣用命令檢視和處理了。(如ls, rm)

該目錄的每個檔案內容由單行組成,顯示佇列的有關資訊:

$ cat /dev/mqueue/mymq

qsize:129 notify:2 signo:0 notify_pid:8260

所有的字段如下:

qsize   佇列中的所有訊息所佔位元組數。

notify_pid

如果此值非0,則表示程序pid為此值的程序呼叫mq_notify(3)在此佇列上註冊了乙個非同步訊息通知。

餘下的字段描述通知如何發生。

notify 通知方式:0是sigev_signal,1是sigev_none,2是sigev_thread。

signo 用於sigev_signal的訊號數值。

輪詢訊息佇列描述符

linux下,訊息佇列描述符實際上是乙個檔案描述符,可以使用select,poll,epoll監視。但不可移植。

conforming to

posix.1-2001.

notes

system v訊息佇列(msgget(2), msgsnd(2), msgrcv(2), etc.)是老一些的在程序之間交換訊息的api。posix訊息佇列提供乙個設計得更好的介面,但posix訊息佇列不如system v訊息佇列那樣被廣泛支援。

linux當前(2.6.26)暫不支援對posix訊息佇列的acls。 

example

乙個使用各種訊息佇列函式的例子在mq_notify(3)中展示。

see also

getrlimit(2), mq_getsetattr(2), poll(2), select(2), mq_close(3),

mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3),

mq_unlink(3), epoll(7)

colophon

this page is part of release 3.23 of the linux man-pages project. a

description of the project, and information about reporting bugs, can

be found at

POSIX訊息佇列

訊息佇列可認為是乙個訊息鍊錶,有寫許可權的執行緒可以往訊息佇列中寫訊息,有讀許可權的執行緒可以從佇列中讀取訊息,從而實現資料共享。每個訊息都是一條記錄,具有以下屬性 優先順序 無符號整數或長整數型別 訊息的資料部分長度 資料本身。1 相關函式 標頭檔案 include 建立和開啟 mqd t mq ...

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...