名 前
msgctl − System V メ ッ セ ー ジ 制 御 操 作
書 式
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
説 明
msgctl() は メ ッ セ ー ジ キ ュ ー 識 別 子 msqid で 指 定 さ れ た System V メ ッ セ ー ジ キ ュ ー (message queue) に 対 し て cmd で 指 定 さ れ た 制 御 操 作 を 行 な う 。
msqid_ds デ ー タ 構 造 体 は <sys/msg.h> で 以 下 の よ う に 定 義 さ れ て い る :
struct msqid_ds
{
struct ipc_perm msg_perm; /* 所 有 権
と 許 可 */
time_t msg_stime; /* 最 後 の msgsnd(2)
の 時 刻 */
time_t msg_rtime; /* 最 後 の msgrcv(2)
の 時 刻 */
time_t msg_ctime; /* 最 後 に 変
更 が 行 わ れ た
時 刻 */
unsigned long __msg_cbytes; /* キ ュ ー
に あ る 現 在 の
バ イ ト 数
(非 標 準 ) */
msgqnum_t msg_qnum; /* キ ュ ー に
あ る 現 在 入 っ
て い る メ ッ セ
ー ジ の 数
*/
msglen_t msg_qbytes; /* キ ュ ー に
許 可 さ れ て い
る 最 大 バ イ ト
数
*/
pid_t msg_lspid; /* 最 後 の msgsnd(2)
の PID */
pid_t msg_lrpid; /* 最 後 の msgrcv(2)
の PID */ };
ipc_perm 構 造 体 は 以 下 の よ う に 定 義 さ れ て い る (強 調 さ れ た フ ィ ー ル ド は IPC_SET を 使 っ て 設 定 可 能 で あ る ):
struct ipc_perm
{
key_t __key; /* msgget(2) に 与 え
る キ ー */
uid_t uid; /* 所 有 者 の
実 効 UID */
gid_t gid; /* 所 有 者 の
実 効 GID */
uid_t cuid; /* 作 成 者 の 実
効 UID */
gid_t cgid; /* 作 成 者 の 実
効 GID */
unsigned short mode; /* 許 可 */
unsigned short __seq; /* シ ー ケ ン
ス 番 号 */ };
cmd
と し て 有 効 な
値 は :
IPC_STAT
msqid に 関 連 づ け ら れ た メ ッ セ ー ジ キ ュ ー デ ー タ 構 造 体 か ら 、 ポ イ ン タ ー buf が 指 し 示 す msqid_ds 構 造 体 に 情 報 を コ ピ ー す る 。 呼 び 出 し 側 は メ ッ セ ー ジ キ ュ ー に 対 す る 読 み 込 み 許 可 を 持 っ て い な け れ ば な ら な い 。
IPC_SET ポ
イ ン タ ー buf が
指 し 示 す msqid_ds 構
造 体 の メ ン バ
ー の 値 を 、 メ
ッ セ ー ジ キ ュ
ー に 関 連 づ け
ら れ た カ ー ネ
ル デ ー タ 構 造
体 に 書 き 込 み
、 msg_ctime メ ン バ
ー も 更 新 す る
。 構 造 体 の メ
ン バ ー の う ち
、 更 新 さ れ る
も の を 以 下 に
示 す : msg_qbytes, msg_perm.uid,
msg_perm.gid, msg_perm.mode (の 下
位 9 ビ ッ ト )。 呼
び 出 し た プ ロ
セ ス の 実 効 ユ
ー ザ ー ID が 、 メ
ッ セ ー ジ キ ュ
ー の 所 有 者
(msg_perm.uid) ま た は 作
成 者 (msg_perm.cuid) と 一
致 す る か 、 呼
び 出 し 元 が 特
権 を 持 た な け
れ ば な ら な い
。 msg_qbytes を シ ス
テ ム パ ラ メ ー
タ ー の MSGMNB を 超
え て 設 定 す る
に は 、 適 切 な
特 権 (Linux で は
CAP_SYS_RESOURCE ケ ー パ ビ
リ テ ィ (capability)) が 必
要 で あ る 。
IPC_RMID メ ッ セ ー ジ
キ ュ ー を た だ
ち に 削 除 す る
。 同 時 に そ の
構 造 体 の 読 み
書 き の 待 ち 状
態 に あ っ た プ
ロ セ ス に 通 知
す る (エ ラ ー が
返 り 、 errno が
EIDRM に 設 定 さ れ
る )。 呼 び 出 し
た プ ロ セ ス が
適 切 な 特 権 を
持 っ て い る か
、 呼 び 出 し た
プ ロ セ ス の 実
効 ユ ー ザ ー ID が
メ ッ セ ー ジ キ
ュ ー の 作 成 者
か 所 有 者 の 実
効 ユ ー ザ ー ID で
な け れ ば な ら
な い 。 こ の 場
合 、 msgctl() の 第 3
引 き 数 は 無 視
さ れ る 。
IPC_INFO (Linux 固 有 ) シ ス
テ ム 全 体 で の
メ ッ セ ー ジ キ
ュ ー の 制 限 と
パ ラ メ ー タ ー
に 関 す る 情 報
を 、 buf が 指 す
構 造 体 に 入 れ
て 返 す 。 こ の
構 造 体 は msginfo 型
で あ る (そ の た
め キ ャ ス ト が
必 要 で あ る )。
msginfo は _GNU_SOURCE 機 能
検 査 マ ク ロ が
定 義 さ れ た 場
合 に <sys/msg.h> で 以
下 の よ う に 定
義 さ れ る :
struct msginfo
{
int msgpool; /* メ ッ セ ー ジ
デ ー タ の 保 持
に 使 用 さ れ る
バ ッ フ ァ ー プ
ー ル の 大 き さ
(1024 バ イ ト 単 位 );
カ ー ネ ル 内 で
は 未 使 用
*/
int msgmap; /* メ ッ セ ー ジ
マ ッ プ の 最 大
エ ン ト リ ー 数 ;
カ ー ネ ル 内 で
は 未 使 用
*/
int msgmax; /* 一 つ の メ ッ
セ ー ジ に 書 き
込 み 可 能 な 最
大 バ イ ト 数
*/
int msgmnb; /* 一 つ の キ ュ
ー に 書 き 込 み
可 能 な 最 大 バ
イ ト 数 ;
(msgget(2) で の ) キ ュ ー
作 成 中 の msg_qbytes の
初 期 化 に 使 用
さ れ る
*/
int msgmni; /* メ ッ セ ー ジ
キ ュ ー の 数 の
最 大 値 */
int msgssz; /* メ ッ セ ー ジ
セ グ メ ン ト の
サ イ ズ ; カ ー ネ
ル 内 で は 未 使
用
*/
int msgtql; /* シ ス テ ム 上
の 全 キ ュ ー の
最 大 メ ッ セ ー
ジ 数 ; カ ー ネ ル
内 で は 未 使 用
*/
unsigned short int msgseg;
/* 最 大 セ グ メ ン
ト 数 ; カ ー ネ ル
内 で は 未 使 用 */ };
設 定 msgmni , msgmax , msgmnb は
/proc に あ る 同 じ
名 前 の フ ァ イ
ル 経 由 で 変 更
可 能 で あ る 。
詳 し く は proc(5) を
参 照 。
MSG_INFO (Linux 固 有 )
IPC_INFO の と き と 同 じ 情 報 を 格 納 し た msginfo 構 造 体 を 返 す 。 但 し 、 以 下 の フ ィ ー ル ド に は メ ッ セ ー ジ キ ュ ー が 消 費 し て い る シ ス テ ム 資 源 に 関 す る 情 報 が 格 納 さ れ る 点 が 異 な る 。 msgpool フ ィ ー ル ド は 現 在 シ ス テ ム 上 に 存 在 す る メ ッ セ ー ジ キ ュ ー の 数 を 返 す 。 msgmap フ ィ ー ル ド は シ ス テ ム 上 の 全 て の キ ュ ー に 入 っ て い る メ ッ セ ー ジ 総 数 を 返 す 。 msgtql フ ィ ー ル ド は シ ス テ ム 上 の 全 て の キ ュ ー に 入 っ て い る 全 メ ッ セ ー ジ の 総 バ イ ト 数 を 返 す 。
MSG_STAT (Linux 固 有 )
IPC_STAT と 同 じ く msqid_ds 構 造 体 を 返 す 。 但 し 、 msqid 引 き 数 は 、 キ ュ ー 識 別 子 で は な く 、 シ ス テ ム 上 の 全 て の メ ッ セ ー ジ キ ュ ー に 関 す る 情 報 を 管 理 す る カ ー ネ ル の 内 部 配 列 へ の イ ン デ ッ ク ス で あ る 。
返 り 値
成 功 す る と 、 IPC_STAT, IPC_SET, IPC_RMID は 0 を 返 す 。 IPC_INFO と MSG_INFO 操 作 は 、 成 功 す る と 、 全 て の メ ッ セ ー ジ キ ュ ー に 関 す る 情 報 を 管 理 し て い る カ ー ネ ル の 内 部 配 列 の 使 用 中 エ ン ト リ ー の イ ン デ ッ ク ス の う ち 最 大 値 を 返 す (こ の 情 報 は 、 シ ス テ ム の 全 て の メ ッ セ ー ジ キ ュ ー に 関 す る 情 報 を 取 得 す る た め に 、 MSG_STAT 操 作 を 繰 り 返 し 実 行 す る 際 に 使 用 で き る )。 MSG_STAT 操 作 は 、 成 功 す る と 、 msqid で 指 定 さ れ た イ ン デ ッ ク ス を 持 つ メ ッ セ ー ジ キ ュ ー の 識 別 子 を 返 す 。 エ ラ ー の 場 合 は −1 を 返 し 、 errno を 適 切 に 設 定 す る 。
エ ラ ー
失 敗 し た 場 合 、 errno は 以 下 の 値 の 中 の ど れ か 一 つ に 設 定 さ れ る :
EACCES 引 き 数 |
cmd が IPC_STAT ま た は MSG_STAT に 等 し い が 、 呼 び 出 し た プ |
ロ セ ス が メ ッ セ ー ジ キ ュ ー msqid に 対 す る 読 み 込 み 許 可 を 持 っ て お ら ず 、 か つ CAP_IPC_OWNER ケ ー パ ビ リ テ ィ を 持 っ て い な い 。
EFAULT 引 き 数 |
cmd が IPC_SET か IPC_STAT で 、 ポ イ ン タ ー buf で 指 さ れ て |
い る ア ド レ ス が ア ク セ ス 可 能 で な い 。
EIDRM メ ッ セ ー ジ キ ュ ー が 削 除 さ れ た 。 |
||
EINVAL |
cmd ま た は msqid に 不 正 な 値 が 設 定 さ れ た 。 も し く は 、 MSG_STAT 操 作 の 場 合 に 、 msqid で 指 定 さ れ た イ ン デ ッ ク ス 値 が 現 在 未 使 用 の 配 列 の ス ロ ッ ト を 参 照 い て い た 。
EPERM 引 き 数 |
cmd が IPC_SET か IPC_RMID で あ る が 、 呼 び 出 し た プ ロ セ ス の |
実 効 ユ ー ザ ー ID が メ ッ セ ー ジ キ ュ ー の (msg_perm.cuid と し て 見 つ か る ) 作 成 者 と (msg_perm.uid と し て 見 つ か る ) 所 有 者 の い ず れ で も な く 、 か つ 呼 び 出 し 者 に 特 権 が な い (Linux で は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が な い )。
EPERM |
IPC_SET で msg_qbytes を シ ス テ ム パ ラ メ ー タ ー MSGMNB よ り 大 き な 値 に 設 定 し よ う と し た が 、 呼 び 出 し 元 が 特 権 を 持 っ て い な か っ た (Linux で は 、 CAP_SYS_RESOURCE ケ ー パ ビ リ テ ィ を 持 っ て い な か っ た )。 |
準 拠
SVr4, POSIX.1−2001.
注 意
Linux や POSIX の 全 て の バ ー ジ ョ ン で は 、 <sys/types.h> と <sys/ipc.h> の イ ン ク ル ー ド は 必 要 な い 。 し か し な が ら 、 い く つ か の 古 い 実 装 で は こ れ ら の ヘ ッ ダ ー フ ァ イ ル の イ ン ク ル ー ド が 必 要 で あ り 、 SVID で も こ れ ら の イ ン ク ル ー ド を す る よ う に 記 載 さ れ て い る 。 こ の よ う な 古 い シ ス テ ム へ の 移 植 性 を 意 図 し た ア プ リ ケ ー シ ョ ン で は こ れ ら の フ ァ イ ル を イ ン ク ル ー ド す る 必 要 が あ る か も し れ な い 。
IPC_INFO, MSG_STAT, MSG_INFO 操 作 は 、 ipcs(1) プ ロ グ ラ ム で 割 り 当 て 済 の 資 源 に 関 す る 情 報 を 提 供 す る た め に 使 用 さ れ て い る 。 将 来 、 こ れ ら の 操 作 は 変 更 さ れ た り 、 /proc フ ァ イ ル シ ス テ ム の イ ン タ ー フ ェ ー ス に 移 動 さ れ る か も し れ な い 。
struct msqid_ds 内 の 多 く の フ ィ ー ル ド は 、 Linux 2.2 で は short だ っ た が 、 Linux 2.4 で は long に な っ た 。 こ の 利 点 を 生 か す に は 、 glibc−2.1.91 以 降 の 環 境 下 で 再 コ ン パ イ ル す れ ば 十 分 で あ る 。 (カ ー ネ ル は 新 し い 形 式 の 呼 び 出 し と 古 い 形 式 の 呼 び 出 し を cmd 内 の IPC_64 フ ラ グ で 区 別 す る 。 )
関 連 項 目
msgget(2), msgrcv(2), msgsnd(2), capabilities(7), mq_overview(7), svipc(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。