mq_overview
Section: Environments, Tables, and Troff Macros (7)
Updated: 2026-02-08
Index
JM Home Page
roff page
名前
mq_overview - POSIX メッセージキューの概要
説明
POSIX メッセージキューを使用すると、プロセス間で メッセージの形でのデータのやり取りを行うことができる。 この API は System V
メッセージキューの API (msgget(2), msgsnd(2), msgrcv(2) など)
とは異なるものだが、同様の機能を提供する。
メッセージキューの作成とオープンは mq_open(3) を使って行う。この関数は メッセージキュー記述子 (message queue descriptor) (mqd_t) を返す。これ以降のコールでは、オープンされたメッセージキューは メッセージキュー記述子
を使って参照される。 各メッセージキューは /somename の形の名前で区別することができる。 その名前は、最大で NAME_MAX
(すなわち 255) 文字のヌル終端された文字列で、 スラッシュで始まり、スラッシュ以外の文字が 1 文字以上続く形式である。
mq_open(3) に同じ名前を渡すことで、2つのプロセスで同一のキューを 操作することができる。
メッセージのキューへの送受信は mq_send(3) と mq_receive(3)
を使って行う。プロセスがキューの使用を終えるときには、 mq_close(3)
を使ってキューをクローズする。キューがもはや不要となった場合には、 mq_unlink(3) を使ってキューを削除できる。キューの属性は
mq_getattr(3) で取得でき、 (制限はあるが) mq_setattr(3) で変更できる。 mq_notify(3)
を使うことで、空のキューへのメッセージ到着を非同期で 通知するように要求することもできる。
メッセージキュー記述子は オープンメッセージキュー記述 (open message queue description) への参照である
(open(2) も参照)。 fork(2) 実行後は、子プロセスは親プロセスのメッセージキュー記述子のコピーを継承する。
これらの記述子は、親プロセスの対応するメッセージキュー記述子と同じオープンメッセージキュー記述を参照している。親プロセスと子プロセスの対応するメッセージキュー記述子は、フラグ
(mq_flags) を共有する。なぜなら、フラグはオープンメッセージキュー記述に 関連付けられているからである。
各メッセージにはそれぞれ 優先度 (priority) があり、メッセージの受信プロセスへの配送は常に 優先度の高いメッセージから順に行われる。
メッセージの優先度は 0 (低優先) から sysconf(_SC_MQ_PRIO_MAX) - 1 (高優先) の値を持つ。 Linux
では、 sysconf(_SC_MQ_PRIO_MAX) は 32768 を返すが、 POSIX.1 で要求されているのは最低限 0 から 31
までの優先度を実装することだけであり、実装によってはこの範囲の優先度しかサポートされていない。
この節の残りでは、POSIX メッセージキューの Linux の実装の詳細 について説明する。
ライブラリインターフェースとシステムコール
ほとんどの場合、上記の mq_*() ライブラリインターフェースは、同じ名前の下位層のシステムコールを
使って実装されている。この枠組みにあてはまらないものを 以下の表に示す。
-
バージョン
POSIX message queues have been supported since Linux 2.6.6. glibc support
has been provided since glibc 2.3.4.
カーネルの設定
POSIX メッセージキューのサポートは、カーネルの設定 (configuration) オプション CONFIG_POSIX_MQUEUE
で設定可能である。このオプションはデフォルトでは有効である。
持続性
POSIX メッセージキューはカーネル内で保持される。 mq_unlink(3) で削除されなければ、メッセージキューは
システムがシャットダウンされるまで存在し続ける。
リンク
POSIX メッセージキュー API を使用したプログラムは cc -lrt でコンパイルし、リアルタイムライブラリ librt
とリンクしなければならない。
/proc インターフェース
以下のインターフェースを使って、 POSIX メッセージキューが消費するカーネル メモリーの量を制限したり、
新規のメッセージキューのデフォルト属性を設定したりすることができる。
- /proc/sys/fs/mqueue/msg_default (Linux 3.5 以降)
-
This file defines the value used for a new queue's mq_maxmsg setting when
the queue is created with a call to mq_open(3) where attr is
specified as NULL. The default value for this file is 10. The minimum and
maximum are as for /proc/sys/fs/mqueue/msg_max. A new queue's default
mq_maxmsg value will be the smaller of msg_default and msg_max.
Before Linux 2.6.28, the default mq_maxmsg was 10; from Linux 2.6.28 to
Linux 3.4, the default was the value defined for the msg_max limit.
- /proc/sys/fs/mqueue/msg_max
-
This file can be used to view and change the ceiling value for the maximum
number of messages in a queue. This value acts as a ceiling on the
attr->mq_maxmsg argument given to mq_open(3). The default value
for msg_max is 10. The minimum value is 1 (10 before Linux 2.6.28). The
upper limit is HARD_MSGMAX. The msg_max limit is ignored for
privileged processes (CAP_SYS_RESOURCE), but the HARD_MSGMAX ceiling
is nevertheless imposed.
-
HARD_MSGMAX の定義はカーネルのバージョンにより異なる。
-
- •
-
Up to Linux 2.6.32: 131072~/~sizeof(void~*)
- •
-
Linux 2.6.33 to Linux 3.4: (32768~*~sizeof(void~*) / 4)
- •
-
Linux 3.5 以降: 65,536
- /proc/sys/fs/mqueue/msgsize_default (Linux 3.5 以降)
-
This file defines the value used for a new queue's mq_msgsize setting
when the queue is created with a call to mq_open(3) where attr is
specified as NULL. The default value for this file is 8192 (bytes). The
minimum and maximum are as for /proc/sys/fs/mqueue/msgsize_max. If
msgsize_default exceeds msgsize_max, a new queue's default
mq_msgsize value is capped to the msgsize_max limit. Before Linux
2.6.28, the default mq_msgsize was 8192; from Linux 2.6.28 to Linux 3.4,
the default was the value defined for the msgsize_max limit.
- /proc/sys/fs/mqueue/msgsize_max
-
This file can be used to view and change the ceiling on the maximum message
size. This value acts as a ceiling on the attr->mq_msgsize argument
given to mq_open(3). The default value for msgsize_max is 8192
bytes. The minimum value is 128 (8192 before Linux 2.6.28). The upper
limit for msgsize_max has varied across kernel versions:
-
- •
-
Linux 2.6.28 より前のバージョンでは、上限は INT_MAX である。
- •
-
From Linux 2.6.28 to Linux 3.4, the limit is 1,048,576.
- •
-
Linux 3.5 以降では、上限は 16,777,216 (HARD_MSGSIZEMAX) である。
-
msgsize_max 上限は特権プロセス (CAP_SYS_RESOURCE) では無視されるが、 Linux 3.5
以降では特権プロセスにも HARD_MSGSIZEMAX という上限が適用される。
- /proc/sys/fs/mqueue/queues_max
-
このファイルを使って、作成可能なメッセージキュー数のシステム全体での制限を参照したり変更したりできる。 queues_max のデフォルト値は
256 である。 queues_max に課される上限値はない。 特権プロセス (CAP_SYS_RESOURCE)
はこの上限値を超えてメッセージキューを作成できる。
リソース制限
リソース上限 RLIMIT_MSGQUEUE は、プロセスの実 UID に対応する全メッセージキューが消費する
メモリー空間の量に対して上限を設定する。 getrlimit(2) を参照。
メッセージキューファイルシステムのマウント
Linux では、メッセージキューは仮想ファイルシステム内に作成される (他の実装でも同様の機能が提供されているものもあるが、
詳細は違っているだろう)。 以下のコマンドを使うことで (スーパーユーザーは) このファイルシステムをマウントできる:
# mkdir /dev/mqueue
# mount -t mqueue none /dev/mqueue
マウントしたディレクトリのスティッキービット (sticky bit) は 自動的にオンとなる。
メッセージキューファイルシステムのマウント後は、ファイルに対して 通常使うコマンド (例えば ls(1) や rm(1))
を使って、システム上のメッセージキューを表示したり 操作したりできる。
ディレクトリ内の各ファイルの内容は 1行であり、 キューに関する情報が表示される。
$ 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 でのメッセージキュー記述子の実装
On Linux, a message queue descriptor is actually a file descriptor. (POSIX
does not require such an implementation.) This means that a message queue
descriptor can be monitored using select(2), poll(2), or epoll(7).
This is not portable.
The close-on-exec flag (see open(2)) is automatically set on the file
descriptor returned by mq_open(2).
IPC 名前空間
POSIX メッセージキューオブジェクトと IPC 名前空間の相互の影響に関する議論は ipc_namespaces(7) を参照。
注意
System V メッセージキュー (msgget(2), msgsnd(2), msgrcv(2) など)
はプロセス間でメッセージをやり取りするための古い API である。 POSIX メッセージキューは System V メッセージキューよりもうまく
設計されたインターフェースを提供している。 一方で、POSIX メッセージキューは System V メッセージキューと比べると
利用できるシステムが少ない (特に、古いシステムでは少ない)。
Linux does not currently (Linux 2.6.26) support the use of access control
lists (ACLs) for POSIX message queues.
バグ
Since Linux 3.5 to Linux 3.14, the kernel imposed a ceiling of 1024
(HARD_QUEUESMAX) on the value to which the queues_max limit could be
raised, and the ceiling was enforced even for privileged processes. This
ceiling value was removed in Linux 3.14, and patches to stable Linux 3.5.x
to Linux 3.13.x also removed the ceiling.
As originally implemented (and documented), the QSIZE field displayed the
total number of (user-supplied) bytes in all messages in the message
queue. Some changes in Linux 3.5 inadvertently changed the behavior, so
that this field also included a count of kernel overhead bytes used to store
the messages in the queue. This behavioral regression was rectified in
Linux 4.2 (and earlier stable kernel series), so that the count once more
included just the bytes of user data in messages in the queue.
例
各種のメッセージキュー関数を使用した例が mq_notify(3) に記載されている。
関連項目
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),
namespaces(7)
Index
- 名前
-
- 説明
-
- ライブラリインターフェースとシステムコール
-
- バージョン
-
- カーネルの設定
-
- 持続性
-
- リンク
-
- /proc インターフェース
-
- リソース制限
-
- メッセージキューファイルシステムのマウント
-
- Linux でのメッセージキュー記述子の実装
-
- IPC 名前空間
-
- 注意
-
- バグ
-
- 例
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.