Provided by: manpages-ja_0.5.0.0.20131015+dfsg-2_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) 文字の  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)  を共有する。なぜなら、フラグはオープンメッセージキュー記述に  関連付けられてい
       るからである。

       各メッセージにはそれぞれ  優先度 (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_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.54 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。