Man page - mq_overview(7)

Packages contains this manual

Available languages:

en fr ja ru

Manual

MQ_OVERVIEW

名 前
説 明
ラ イ ブ ラ リ イ ン タ ー フ ェ ー ス と シ ス テ ム コ ー ル
バ ー ジ ョ ン
カ ー ネ ル の 設 定
持 続 性
リ ン ク
/proc イ ン タ ー フ ェ ー ス
リ ソ ー ス 制 限
メ ッ セ ー ジ キ ュ ー フ ァ イ ル シ ス テ ム の マ ウ ン ト
Linux で の メ ッ セ ー ジ キ ュ ー 記 述 子 の 実 装
IPC 名 前 空 間
注 意
バ グ

関 連 項 目
こ の 文 書 に つ い て

名 前

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_* () ラ イ ブ ラ リ イ ン タ ー フ ェ ー ス は 、 同 じ 名 前 の 下 位 層 の シ ス テ ム コ ー ル を 使 っ て 実 装 さ れ て い る 。 こ の 枠 組 み に あ て は ま ら な い も の を 以 下 の 表 に 示 す 。

Image grohtml-4192859-1.png

バ ー ジ ョ ン

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_default msg_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_default msgsize_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/ に 書 か れ て い る 。