mq_overview - 約束事その他の説明 - Linux コマンド集 一覧表
- 名前
- 説明
- Linux 固有の詳細事項
- 準拠
- 注意
- 例
- 関連項目
名前
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
に使用されるシグナル番号。
メッセージキュー記述子のポーリング
準拠
注意
System V メッセージキュー
(
msgget
(2),
msgsnd
(2),
msgrcv
(2)など) はプロセス間でメッセージをやり取りするための古い API である。
POSIX メッセージキューは System V メッセージキューよりもうまく
設計されたインタフェースを提供している。
一方で、POSIX メッセージキューは System V メッセージキューと比べると
利用できるシステムが少ない (特に、古いシステムでは少ない)。
例
関連項目
getrlimit
(2),
mq_getsetattr
(2),
mq_close
(3),
mq_getattr
(3),
mq_notify
(3),
mq_open
(3),
mq_receive
(3),
mq_send
(3),
mq_unlink
(3),
poll
(2),
select
(2),
epoll
(4)
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする