#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf);
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 構造体は <sys/ipc.h> で以下のように定義されている (強調されたフィールドは 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 として有効な値は:
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)
を参照。
エラーの場合は -1 を返し、 errno を適切に設定する。
struct msqid_ds 内の多くのフィールドは、 Linux 2.2 では short だったが、Linux 2.4 では long になった。 この利点を生かすには、glibc-2.1.91 以降の環境下で 再コンパイルすれば十分である。 (カーネルは新しい形式の呼び出しと古い形式の呼び出しを cmd 内の IPC_64 フラグで区別する。)