Provided by: manpages-ja_0.5.0.0.20161015+dfsg-1_all bug

名前

       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_defaultmsg_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_defaultmsgsize_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/ に書かれている。