MSGCTL(2) | Linux Programmer's Manual | MSGCTL(2) |
名前
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_IPC_RESOURCE ケーパビリティ (capability)) が必要である。
- IPC_RMID
- メッセージ・キューをただちに削除する。同時にその構造体の読み書きの待ち状態にあったプロセスに通知する (エラーが返り、 errno が EIDRM に設定される)。呼び出したプロセスが適切な特権を持っているか、呼び出したプロセスの実効ユーザ ID がメッセージ・キューの作成者か所有者の実効ユーザ ID でなければならない。
- 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 で指定されたインデックスを持つメッセージ・キューの識別子を返す。エラー
失敗した場合、 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 ケーパビリティ) がない。
準拠
SVr4, POSIX.1-2001.注意
Linux や POSIX の全てのバージョンでは、 <sys/types.h> と <sys/ipc.h> のインクルードは必要ない。しかしながら、いくつかの古い実装ではこれらのヘッダファイルのインクルードが必要であり、 SVID でもこれらのインクルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれない。関連項目
msgget(2), msgrcv(2), msgsnd(2), capabilities(7), mq_overview(7), svipc(7)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-05-31 | Linux |