other versions
MQ_OVERVIEW(7) | Linux Programmer's Manual | MQ_OVERVIEW(7) |
名前¶
mq_overview - POSIX メッセージキューの概要説明¶
POSIX メッセージキューを使用すると、プロセス間で メッセージの形でのデータのやり取りを行うことができる。 この API は System V メッセージキューの API ( msgget(2), msgsnd(2), msgrcv(2) など) とは異なるものだが、同様の機能を提供する。ライブラリインタフェースとシステムコール¶
ほとんどの場合、上記の mq_*() ライブラリインタフェースは、同じ名前の下位層のシステムコールを 使って実装されている。この枠組みにあてはまらないものを 以下の表に示す。バージョン¶
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) は 自動的にオンとなる。
$ 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 メッセージキューと比べると 利用できるシステムが少ない (特に、古いシステムでは少ない)。例¶
各種のメッセージキュー関数を使用した例が 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.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2009-09-27 | Linux |