EN JA
MQ_OVERVIEW(7)
MQ_OVERVIEW(7) Linux Programmer's Manual MQ_OVERVIEW(7)

名前

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) 文字の NULL 終端された文字列で、スラッシュで始まり、スラッシュ以外の文字が 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) を共有する。なぜなら、フラグはオープンメッセージキュー記述に関連付けられているからである。
 
Each message has an associated priority, and messages are always delivered to the receiving process highest priority first. Message priorities range from 0 (low) to sysconf(_SC_MQ_PRIO_MAX) - 1 (high). On Linux, sysconf(_SC_MQ_PRIO_MAX) returns 32768, but POSIX.1-2001 requires only that an implementation support at least priorities in the range 0 to 31; some implementations provide only this range.

この節の残りでは、POSIX メッセージキューの Linux の実装の詳細について説明する。

ライブラリインタフェースとシステムコール

ほとんどの場合、上記の mq_*() ライブラリインタフェースは、同じ名前の下位層のシステムコールを使って実装されている。この枠組みにあてはまらないものを以下の表に示す。
Library interface System call
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)

バージョン

Linux では POSIX メッセージキューはカーネル 2.6.6 以降でサポートされている。 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_max
このファイルを使って、一つのキューに入れられるメッセージの最大数の上限値を参照したり変更したりできる。この値は、 mq_open(3) に渡す attr->mq_maxmsg 引き数に対する上限値として機能する。 msg_max のデフォルト値は 10 で、最小値は 1 (2.6.28 より前のカーネルでは 10) である。上限は「埋め込みの固定値」 ( HARD_MAX) で (131072 / sizeof(void *)) (Linux/86 では 32768) である。この上限は特権プロセス ( CAP_SYS_RESOURCE) では無視されるが、埋め込みの固定値による上限はどんな場合にでも適用される。
/proc/sys/fs/mqueue/msgsize_max
このファイルを使って、メッセージの最大サイズの上限値を 参照したり変更したりできる。 この値は、 mq_open(3) に渡す attr->mq_msgsize 引き数に対する上限値として機能する。 msgsize_max のデフォルト値は 8192 バイトで、最小値は 128 (2.6.28 より前のカーネルでは 8192) である。 msgsize_max の上限は 1,048,576 である (2.6.28 より前のカーネルでは、上限は INT_MAX (Linux/86 では 2,147,483,647) であった)。この上限は特権プロセス ( CAP_SYS_RESOURCE) では無視される。
/proc/sys/fs/mqueue/queues_max
このファイルを使って、作成することができるメッセージキューの数に 対するシステム全体での制限を参照したり変更したりできる。 一度この上限に達すると、新しいメッセージキューを作成できるのは 特権プロセス ( CAP_SYS_RESOURCE) だけとなる。 queues_max のデフォルト値は 256 であり、 0 から INT_MAX の範囲の任意の値に変更することができる。

リソース制限

リソース上限 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 では、メッセージキュー記述子は実際はファイル記述子 (file descriptor) であり、 select(2), poll(2), epoll(7) を使って監視することができる。この機能の移植性はない。

準拠

POSIX.1-2001.

注意

System V メッセージキュー ( msgget(2), msgsnd(2), msgrcv(2) など) はプロセス間でメッセージをやり取りするための古い API である。 POSIX メッセージキューは System V メッセージキューよりもうまく設計されたインタフェースを提供している。一方で、POSIX メッセージキューは System V メッセージキューと比べると利用できるシステムが少ない (特に、古いシステムでは少ない)。
 
現在のことろ (バージョン 2.6.26 時点)、 Linux は POSIX メッセージキューに対するアクセス制御リスト (ACL) に対応していない。

各種のメッセージキュー関数を使用した例が 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)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2009-09-27 Linux