Provided by: manpages-ja_0.5.0.0.20180315+dfsg-1_all
名前
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-2001 で要求されているのは最低限 0 から 31 までの優先度を実装す ることだけであり、実装によってはこの範囲の優先度しかサポートされていない。 この節の残りでは、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_default (Linux 3.5 以降) このファイルは、attr に NULL を指定して mq_open(3) を呼び出してキューが作成された際 に、 その新規キューの mq_maxmsg 設定に使用される値を定めている。 このファイルのデ フォルト値は 10 である。 最小値と最大値は /proc/sys/fs/mqueue/msg_max と同様であ る。 新規キューのデフォルトの mq_maxmsg 値は msg_default と msg_max の小さい方とな る。 Linux 2.6.28 より前は、デフォルトの mq_maxmsg は 10 であった。 Linux 2.6.28 か ら Linux 3.4 までは、 デフォルト値は msg_max 上限で規定される値であった。 /proc/sys/fs/mqueue/msg_max このファイルを使って、一つのキューに入れられるメッセージの最大数の 上限値を参照した り変更したりできる。この値は、 mq_open(3) に渡す attr->mq_maxmsg 引き数に対する上 限値として機能する。 msg_max のデフォルト値は 10 で、 最小値は 1 (2.6.28 より前の カーネルでは 10) である。 msg_max に指定できる上限値は HARD_MSGMAX である。 msg_max 上限は特権プロセス (CAP_SYS_RESOURCE) では無視されるが、上限値 HARD_MSGMAX はどん な場合にでも適用される。 HARD_MSGMAX の定義はカーネルのバージョンにより異なる。 * Linux 2.6.32 以前: 131072 / sizeof(void *) * Linux 2.6.33 以上 3.4 以下: (32768 * sizeof(void *) / 4) * Linux 3.5 以降: 65,536 /proc/sys/fs/mqueue/msgsize_default (Linux 3.5 以降) このファイルは、attr に NULL を指定して mq_open(3) を呼び出してキューが作成された際 に、 その新規キューの mq_msgsize 設定に使用される値を定めている。 このファイルのデ フォルト値は 8192 バイトである。 最小値と最大値は /proc/sys/fs/mqueue/msgsize_max と同様である。 msgsize_default が msgsize_max より大きい場合は、 新規キューのデフォ ルトの mq_msgsize 値は msgsize_max 上限となる。 Linux 2.6.28 より前は、デフォルトの mq_msgsize は 8192 であった。 Linux 2.6.28 から Linux 3.4 までは、 デフォルト値は msgsize_max 上限で規定される値であった。 /proc/sys/fs/mqueue/msgsize_max このファイルを使って、メッセージの最大サイズの上限値を参照したり変更したりできる。 この値は、 mq_open(3) に渡す attr->mq_msgsize 引き数に対する上限値として機能する。 msgsize_max のデフォルト値は 8192 バイトで、 最小値は 128 (2.6.28 より前のカーネル では 8192) である。 msgsize_max の上限はカーネルのバージョンにより異なる。 * Linux 2.6.28 より前のバージョンでは、上限は INT_MAX である。 * Linux 2.6.28 から 3.4 では、上限は 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 では、メッセージキュー記述子は実際はファイルディスクリプター (file descriptor) であ り、 select(2), poll(2), epoll(7) を使って監視することができる。 この機能の移植性はない。 IPC 名前空間 System V IPC オブジェクトと IPC 名前空間の相互の影響に関する議論は namespaces(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) に記載されている。
バグ
バージョン 3.5 以降 3.14 未満の Linux では、 queues_max 上限を増やすことができる最大値とし て 1024 (HARD_QUEUESMAX) という最大上限値がカーネルにより適用されていた。 この最大上限値は 特権プロセスにも適用されていた。 この最大上限値は Linux 3.14 で削除され、 パッチで安定版 カーネル 3.5.x から 3.13.x からもこの最大上限値は削除された。
関連項目
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)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。