MSGCTL(3)

名称
msgctl - メッセージ制御オペレーション

ライブラリ
libc

書式
<sys/types.h> <sys/ipc.h> <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf)

解説
msgctl() システムコールは、 msqid が指定するメッセージキューに対して制御オペレーションを実行します。

各メッセージキューには、それに関連したデータ構造体があります。 その一部は msgctl() で変更できます。 msgctl() のアクションを決めるデータ構造もあります。このデータ構造体は <sys/msg.h> で定義され、以下のようなメンバが含まれています (その他のメンバも あります)。

    struct msqid_ds {
            struct  ipc_perm msg_perm; /* メッセージキューのパーミッションビット */
            struct  msg *msg_first; /* キューの最初のメッセージ */
            struct  msg *msg_last; /* キューの最後のメッセージ */
            u_long  msg_cbytes; /* キューで使用しているバイト数 */
            u_long  msg_qnum; /* キューで使用しているメッセージ数 */
            u_long  msg_qbytes; /* キューで使用する最大バイト数 */
            pid_t   msg_lspid; /* 最後の msgsnd のプロセスID  */
            pid_t   msg_lrpid; /* 最後の msgrcv のプロセスID  */
            time_t  msg_stime; /* 最後の msgsnd の時間  */
            long    msg_pad1;
            time_t  msg_rtime; /* 最後の msgrcv の時間  */
            long    msg_pad2;
            time_t  msg_ctime; /* 最後の msgctl の時間  */
            long    msg_pad3;
            long    msg_pad4[4];
        };

shmid_ds 構造体の中で使用される ipc_perm 構造体は、 <sys/ipc.h> で以下のように定義されています。

    struct ipc_perm {
            ushort  cuid;   /* 生成者のユーザID */
            ushort  cgid;   /* 生成者のグループID */
            ushort  uid;    /* ユーザID */
            ushort  gid;    /* グループID */
            ushort  mode;   /* r/w パーミッション */
            ushort  seq;    /* シーケンス番号 (一意に生成された msg/sem/shm ID) */
            key_t   key;    /* ユーザが指定した msg/sem/shm キー */
    };

msgctl() が実行するオペレーションは、以下のうちの 1 つで cmd で指定されます。

IPC_STAT
    メッセージキューの情報を集め、 buf が指す構造体に配置します。

IPC_SET
    msqid に関連する構造体の msg_perm.uid フィールド、 msg_perm.gid フィールド、 msg_perm.mode フィールド、 msg_qbytes フィールドの値を設定します。この値は、 buf が指す構造体で対応するフィールドから取られます。このオペレーションを 実行できるのは、スーパユーザ、またはメッセージキューに関連する データ構造体の msg_perm.cuid か msg_perm.uid と等しい実効ユーザ ID を持つプロセスのみです。 msg_qbytes の値を増やせるのは、スーパユーザのみです。システム制限 ( <sys/msg.h> の MSGMNB) を越えた msg_qbytes の値は、その制限に切り捨てられます。

IPC_RMID
    msqid が指定するメッセージキューを削除し、 msqid に関連する データを破壊します。スーパユーザ、または、キューに 関連するデータ構造体の msg_perm.cuid または msg_perm.uid の値が、実効ユーザ ID に等しいプロセスのみが、これを実行できます。

メッセージキューからの読込み権かメッセージキューへの書込み権 ( msgsnd(3) と msgrcv(3) 参照) は、ファイルと同じように ( chmod(2) 参照)、 msg_perm.mode フィールドによって決まります。実効ユーザ ID は、 msg_perm.cuid フィールドか msg_perm.uid フィールドと一致し、実効グループ ID は、 msg_perm.cgid か msg_perm.gid と一致します。

戻り値

エラー
msgctl() は、以下のような場合にエラーとなります。

[EPERM]
    cmd が IPC_SET か IPC_RMID と等しく、呼出し側がスーパユーザではない場合。 または実効ユーザ ID がメッセージキューに関連するデータ構造の msg_perm.uid フィールドか msg_perm.cuid フィールドと一致しない場合。

    IPC_SET を用いて msg_qbytes の値を上げようとしたが、呼出し側がスーパユーザでない場合。

[EACCES]
    コマンドが IPC_STAT であるが、このメッセージキューの 読込み権が呼出し側にない場合。

[EINVAL]
    msqid が正しいメッセージキュー ID でない場合。

    cmd が正しいコマンドでない場合。

[EFAULT]
    buf が正しいアドレスを指定していない場合。

関連項目
msgget(3), msgrcv(3), msgsnd(3)

歴史
メッセージキューは、 AT&T UNIX の最初のリリースに追加されました。