Provided by: manpages-ja_0.5.0.0.20221215+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 で要求されているのは最低限 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 でのメッセージキュー記述子の実装
       On Linux, a message queue descriptor is actually  a  file  descriptor.   (POSIX  does  not
       require  such  an  implementation.)   This  means  that  a message queue descriptor can be
       monitored using select(2), poll(2), or epoll(7).  This is not portable.

       The close-on-exec flag (see open(2))  is automatically set on the file descriptor returned
       by mq_open(2).

   IPC 名前空間
       POSIX      メッセージキューオブジェクトと      IPC      名前空間の相互の影響に関する議論は
       ipc_namespaces(7) を参照。

注意

       System V メッセージキュー (msgget(2), msgsnd(2), msgrcv(2)  など) はプロセス間でメッセージ
       をやり取りするための古い API である。 POSIX メッセージキューは System V メッセージキューよ
       りもうまく  設計されたインターフェースを提供している。  一方で、POSIX   メッセージキューは
       System V メッセージキューと比べると 利用できるシステムが少ない (特に、古いシステムでは少な
       い)。

       現在のことろ (バージョン 2.6.26 時点)、 Linux は POSIX  メッセージキューに対するアクセス制
       御リスト (ACL) に 対応していない。

バグ

       バージョン 3.5 以降 3.14 未満の Linux では、 queues_max 上限を増やすことができる最大値とし
       て 1024 (HARD_QUEUESMAX) という最大上限値がカーネルにより適用されていた。 この最大上限値は
       特権プロセスにも適用されていた。  この最大上限値は  Linux 3.14 で削除され、 パッチで安定版
       カーネル 3.5.x から 3.13.x からもこの最大上限値は削除された。

       As originally implemented (and documented), the QSIZE field displayed the total number  of
       (user-supplied)   bytes  in  all messages in the message queue.  Some changes in Linux 3.5
       inadvertently changed the behavior, so that this field also included  a  count  of  kernel
       overhead  bytes  used  to store the messages in the queue.  This behavioral regression was
       rectified in Linux 4.2 (and earlier stable kernel series), so that  the  count  once  more
       included just the bytes of user data in messages in the queue.

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

この文書について

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