Man page - msgctl(2)

Packages contains this manual

Available languages:

en fr pl ja

Manual

MSGCTL

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
関 連 項 目
こ の 文 書 に つ い て

名 前

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; /* Ownership and permissions */
time_t msg_stime; /* Time of last msgsnd(2) */
time_t msg_rtime; /* Time of last msgrcv(2) */
time_t msg_ctime; /* Time of creation or last
modification by msgctl() */
unsigned long msg_cbytes; /* # of bytes in queue */
msgqnum_t msg_qnum; /* # number of messages in queue */
msglen_t msg_qbytes; /* Maximum # of bytes in queue */
pid_t msg_lspid; /* PID of last msgsnd(2) */
pid_t msg_lrpid; /* PID of last msgrcv(2) */
};

msgid_ds 構 造 体 の フ ィ ー ル ド は 以 下 の 通 り で あ る :

msg_perm

This is an ipc_perm structure (see below) that specifies the access permissions on the message queue.

msg_stime

最 後 の msgsnd (2) シ ス テ ム コ ー ル の 時 刻 。

msg_rtime

最 後 の msgrcv (2) シ ス テ ム コ ー ル の 時 刻 。

msg_ctime

Time of creation of queue or time of last msgctl () IPC_SET operation.

msg_cbytes

Number of bytes in all messages currently on the message queue. This is a nonstandard Linux extension that is not specified in POSIX.

msg_qnum

Number of messages currently on the message queue.

msg_qbytes

Maximum number of bytes of message text allowed on the message queue.

msg_lspid

最 後 の msgsnd (2) シ ス テ ム コ ー ル を 実 行 し た プ ロ セ ス の ID。

msg_lrpid

最 後 の msgrcv (2) シ ス テ ム コ ー ル を 実 行 し た プ ロ セ ス の ID。

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; /* シ ー ケ ン ス 番 号 */
};

The least significant 9 bits of the mode field of the ipc_perm structure define the access permissions for the message queue. The permission bits are as follows:

Image grohtml-4806-1.png

ビ ッ ト 0100, 0010, 0001 (実 行 ビ ッ ト ) を シ ス テ ム は 使 用 し な い 。

cmd と し て 有 効 な 値 は :
IPC_STAT

msqid に 関 連 づ け ら れ た メ ッ セ ー ジ キ ュ ー デ ー タ 構 造 体 か ら 、 ポ イ ン タ ー buf が 指 し 示 す msqid_ds 構 造 体 に 情 報 を コ ピ ー す る 。 呼 び 出 し 側 は メ ッ セ ー ジ キ ュ ー に 対 す る 読 み 込 み 許 可 を 持 っ て い な け れ ば な ら な い 。

IPC_SET

Write the values of some members of the msqid_ds structure pointed to by buf to the kernel data structure associated with this message queue, updating also its msg_ctime member.

The following members of the structure are updated: msg_qbytes , msg_perm.uid , msg_perm.gid , and (the least significant 9 bits of) msg_perm.mode .

The effective UID of the calling process must match the owner ( msg_perm.uid ) or creator ( msg_perm.cuid ) of the message queue, or the caller must be privileged. Appropriate privilege (Linux: the CAP_SYS_RESOURCE capability) is required to raise the msg_qbytes value beyond the system parameter MSGMNB .

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 msgseg;
/* 最 大 セ グ メ ン ト 数 ; カ ー ネ ル 内 で は 未 使 用 */
};

設 定 msgmni , msgmax , msgmnb /proc に あ る 同 じ 名 前 の フ ァ イ ル 経 由 で 変 更 可 能 で あ る 。 詳 し く は proc (5) を 参 照 。

MSG_INFO (Linux 固 有 )

IPC_INFO の と き と 同 じ 情 報 を 格 納 し た msginfo 構 造 体 を 返 す 。 但 し 、 以 下 の フ ィ ー ル ド に は メ ッ セ ー ジ キ ュ ー が 消 費 し て い る シ ス テ ム 資 源 に 関 す る 情 報 が 格 納 さ れ る 点 が 異 な る 。 msgpool フ ィ ー ル ド は 現 在 シ ス テ ム 上 に 存 在 す る メ ッ セ ー ジ キ ュ ー の 数 を 返 す 。 msgmap フ ィ ー ル ド は シ ス テ ム 上 の 全 て の キ ュ ー に 入 っ て い る メ ッ セ ー ジ 総 数 を 返 す 。 msgtql フ ィ ー ル ド は シ ス テ ム 上 の 全 て の キ ュ ー に 入 っ て い る 全 メ ッ セ ー ジ の 総 バ イ ト 数 を 返 す 。

MSG_STAT (Linux 固 有 )

IPC_STAT と 同 じ く msqid_ds 構 造 体 を 返 す 。 但 し 、 msqid 引 数 は 、 キ ュ ー 識 別 子 で は な く 、 シ ス テ ム 上 の 全 て の メ ッ セ ー ジ キ ュ ー に 関 す る 情 報 を 管 理 す る カ ー ネ ル の 内 部 配 列 へ の イ ン デ ッ ク ス で あ る 。

MSG_STAT_ANY (Linux 固 有 , Linux 4.17 以 降 )

Return a msqid_ds structure as for MSG_STAT . However, msg_perm.mode is not checked for read access for msqid meaning that any user can employ this operation (just as any user may read /proc/sysvipc/msg to obtain the same information).

返 り 値

On success, IPC_STAT , IPC_SET , and IPC_RMID return 0. A successful IPC_INFO or MSG_INFO operation returns the index of the highest used entry in the kernel’s internal array recording information about all message queues. (This information can be used with repeated MSG_STAT or MSG_STAT_ANY operations to obtain information about all queues on the system.) A successful MSG_STAT or MSG_STAT_ANY operation returns the identifier of the queue whose index was given in msqid .

エ ラ ー の 場 合 は -1 を 返 し 、 errno を 適 切 に 設 定 す る 。

エ ラ ー

失 敗 し た 場 合 、 errno は 以 下 の 値 の 中 の ど れ か 一 つ に 設 定 さ れ る :

EACCES

The argument cmd is equal to IPC_STAT or MSG_STAT , but the calling process does not have read permission on the message queue msqid , and does not have the CAP_IPC_OWNER capability in the user namespace that governs its IPC namespace.

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 ケ ー パ ビ リ テ ィ を 持 っ て い な か っ た )。

準 拠

POSIX.1-2001, POSIX.1-2008, SVr4.

注 意

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), sysvipc (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。