名 前
msgget − System V メ ッ セ ー ジ キ ュ ー 識 別 子 を 取 得 す る
書 式
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
説 明
msgget() シ ス テ ム コ ー ル は key 引 き 数 の 値 に 対 応 す る System V メ ッ セ ー ジ キ ュ ー の 識 別 子 を 返 す 。 key の 値 が IPC_PRIVATE の 場 合 、 ま た は key が IPC_PRIVATE で な く て も 、 key に 対 応 す る メ ッ セ ー ジ キ ュ ー が 存 在 せ ず 、 msgflg に IPC_CREAT が 指 定 さ れ て い る 場 合 、 新 し い メ ッ セ ー ジ キ ュ ー が 作 成 さ れ る 。
msgflg に IPC_CREAT と IPC_EXCL の 両 方 が 指 定 さ れ た 場 合 、 key に 対 応 す る メ ッ セ ー ジ キ ュ ー が 既 に 存 在 す る と 、 msgget() は 失 敗 し 、 errno に EEXIST が 設 定 さ れ る 。 (こ れ は open(2) に O_CREAT | O_EXCL を 指 定 し た 場 合 の 動 作 と 同 じ で あ る ) メ ッ セ ー ジ キ ュ ー の 作 成 時 に 、 msgflg 引 き 数 の 下 位 9 ビ ッ ト は 、 そ の メ ッ セ ー ジ キ ュ ー の ア ク セ ス 許 可 の 定 義 と し て 使 用 さ れ る 。 こ れ ら の 許 可 ビ ッ ト は open(2) の 引 き 数 mode と 同 じ 形 式 で 同 じ 意 味 で あ る 。 や creat(2) シ ス テ ム コ ー ル の ア ク セ ス 許 可 パ ラ メ ー タ ー と 同 じ 形 式 で 、 同 じ 意 味 を 持 つ 。 (但 し 、 実 行 (execute) 許 可 は 使 用 さ れ な い 。 ) 新 規 の メ ッ セ ー ジ キ ュ ー を 作 成 す る 際 、 msgget() シ ス テ ム コ ー ル は メ ッ セ ー ジ キ ュ ー の デ ー タ 構 造 体 msqid_ds を 以 下 の よ う に 初 期 化 す る (msqid_ds に つ い て は msgctl(2) を 参 照 ):
msg_perm.cuid と msg_perm.uid に 呼 び 出 し 元 プ ロ セ ス の 実 効 (effective) ユ ー ザ ー ID を 設 定 す る 。
msg_perm.cgid と msg_perm.gid に 呼 び 出 し 元 プ ロ セ ス の 実 効 (effective) グ ル ー プ ID を 設 定 す る 。
msg_perm.mode の 下 位 9 ビ ッ ト は msgflg の 下 位 9 ビ ッ ト を 設 定 す る 。
msg_qnum, msg_lspid, msg_lrpid, msg_stime, msg_rtime に 0 を 設 定 さ れ る 。
msg_ctime に 現 在 の 時 刻 を 設 定 す る 。
msg_qbytes に 、 シ ス テ ム で 決 め ら れ た メ ッ セ ー ジ キ ュ ー の 最 大 サ イ ズ MSGMNB を 設 定 す る 。 メ ッ セ ー ジ キ ュ ー が す で に 存 在 す る 場 合 は 、 ア ク セ ス 許 可 の 検 査 と 、 破 棄 (destruction) マ ー ク が な い か の 確 認 が 行 わ れ る 。
返 り 値
成 功 し た 場 合 、 返 り 値 は メ ッ セ ー ジ キ ュ ー 識 別 子 (非 負 の 整 数 ) と な る 。 失 敗 し た 場 合 は −1 が 返 さ れ 、 errno に そ の エ ラ ー が 示 さ れ る 。
エ ラ ー
失 敗 し た 場 合 、 errno に 以 下 の 値 の い ず れ か 一 つ が 設 定 さ れ る :
EACCES |
key に 対 応 す る メ ッ セ ー ジ キ ュ ー は 存 在 す る が 、 呼 び 出 し 元 プ ロ セ ス は そ の キ ュ ー に 対 す る ア ク セ ス 許 可 が な く 、 CAP_IPC_OWNER ケ ー パ ビ リ テ ィ も 持 っ て い な い 。 | ||
EEXIST |
msgflg に IPC_CREAT と IPC_EXCL が 指 定 さ れ た が 、 key に 対 応 す る メ ッ セ ー ジ キ ュ ー が す で に 存 在 す る 。 | ||
ENOENT |
key に 対 応 す る メ ッ セ ー ジ キ ュ ー が 存 在 せ ず 、 msgflg に IPC_CREAT が 指 定 さ れ て い な か っ た 。 | ||
ENOMEM |
メ ッ セ ー ジ キ ュ ー を 作 成 し よ う と し た が 、 新 し い デ ー タ 構 造 体 を 作 成 す る の に 十 分 な メ モ リ ー が シ ス テ ム に 存 在 し な い 。
ENOSPC メ ッ セ ー ジ キ ュ ー を 作 成 し よ う と し た が 、 作 成 す る と シ ス テ ム 全 体 の メ ッ セ ー ジ キ ュ ー 数 の 最 大 値 |
(MSGMNI) を 超 え て し ま う 。
準 拠
SVr4, POSIX.1−2001.
注 意
Linux や POSIX の 全 て の バ ー ジ ョ ン で は 、 <sys/types.h> と <sys/ipc.h> の イ ン ク ル ー ド は 必 要 な い 。 し か し な が ら 、 い く つ か の 古 い 実 装 で は こ れ ら の ヘ ッ ダ ー フ ァ イ ル の イ ン ク ル ー ド が 必 要 で あ り 、 SVID で も こ れ ら の イ ン ク ル ー ド を す る よ う に 記 載 さ れ て い る 。 こ の よ う な 古 い シ ス テ ム へ の 移 植 性 を 意 図 し た ア プ リ ケ ー シ ョ ン で は こ れ ら の フ ァ イ ル を イ ン ク ル ー ド す る 必 要 が あ る か も し れ な い 。
IPC_PRIVATE は フ ラ グ で は な く 、 key_t 型 で あ る 。 こ の 特 別 な 値 が key と し て 使 用 さ れ た 場 合 、 msgget() シ ス テ ム コ ー ル は msgflg の 下 位 9 ビ ッ ト 以 外 の 全 て を 無 視 し て (成 功 し た 場 合 は ) 新 し い メ ッ セ ー ジ キ ュ ー を 作 成 す る 。
msgget() シ ス テ ム コ ー ル に 影 響 を 及 ぼ す メ ッ セ ー ジ キ ュ ー の 資 源 の シ ス テ ム と し て の 制 限 を 以 下 に 示 す :
MSGMNI シ ス テ ム 全 体 の メ ッ セ ー ジ キ ュ ー 数 の 上 限 値 : 方 針 依 存 |
は 、 こ の 制 限 値 は /proc/sys/kernel/msgmni 経 由 で 参 照 し た り 、 変 更 し た り で き る )。
Linux
で の 注 意
Linux 2.3.20 ま で は 、 削
除 が 予 定 さ れ
て い る メ ッ セ
ー ジ キ ュ ー に
対 し て msgget() を 行
う と EIDRM が エ ラ
ー と し て 返 さ
れ る よ う に な
っ て い た 。
バ グ
IPC_PRIVATE と い う 名 前 を 選 ん だ の は お そ ら く 失 敗 で あ ろ う 。 IPC_NEW の 方 が よ り 明 確 に そ の 機 能 を 表 し て い る だ ろ う 。
関 連 項 目
msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), svipc(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。