kazmax - Linux で自宅サーバー

mq_overview - 約束事その他の説明 - Linux コマンド集 一覧表

  1. 名前
  2. 説明
  3. Linux 固有の詳細事項
  4. 準拠
  5. 注意
  6. 関連項目

名前

mq_overview - POSIX メッセージキューの概要

説明

POSIX メッセージキューを使用すると、プロセス間で メッセージの形でのデータのやり取りを行うことができる。 この API は System V メッセージキューの API ( msgget (2), msgsnd (2), msgrcv (2)など) とは異なるものだが、同様の機能を提供する。
メッセージキューの作成とオープンは   mq_open (3) を使って行う。この関数は メッセージキュー記述子 (message queue descriptor) ( mqd_t )を返す。これ以降のコールでは、オープンされたメッセージキューは メッセージキュー記述子 を使って参照される。 各メッセージキューは /somename の形の名前で区別することができる。 mq_open ()に同じ名前を渡すことで、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 までの優先度を 実装することだけであり、実装によってはこの範囲の優先度しか 対応していない。

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

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

バージョン

Linux では POSIX メッセージキューはカーネル 2.6.6 以降でサポートされている。 glibc ではバージョン 2.3.4 以降でサポートされている。

カーネルの設定

POSIX メッセージキューのサポートは、カーネルの設定 (configuration) オプション CONFIG_POSIX_MQUEUE で設定可能である。このオプションはデフォルトでは有効である。

持続性

POSIX メッセージキューはカーネル内で保持される。 mq_unlink ()で削除されなければ、メッセージキューは システムがシャットダウンされるまで存在し続ける。

リンク

POSIX メッセージキュー API を使用したプログラムは cc -lrt でコンパイルし、リアルタイムライブラリ librt とリンクしなければならない。

/proc インタフェース

以下のインタフェースを使って、POSIX メッセージキューが消費するカーネル メモリの量を制限することができる。

/proc/sys/fs/mqueue/msg_max
このファイルを使って、一つのキューに入れられるメッセージの最大数の 上限値を参照したり変更したりできる。この値は、   mq_open (3) に渡す attr->mq_maxmsg 引き数に対する上限値として機能する。 msg_max のデフォルト値および最小値は 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 バイトである; 上限は INT_MAX (Linux/86 では 2147483647) である。 この上限は特権プロセス ( 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行であり、 キューに関する情報が表示される。

$ ls /dev/mqueue/mymq QSIZE:129 NOTIFY:2 SIGNO:0 NOTIFY_PID:8260 $ mount -t mqueue none /dev/mqueue

各フィールドの詳細は以下の通りである:
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 メッセージキューと比べると 利用できるシステムが少ない (特に、古いシステムでは少ない)。

各種のメッセージキュー関数を使用した例が   mq_notify (3) に記載されている。

関連項目