tail head cat sleep
QR code linking to this page

manページ  — MSGCTL

名称

msgctl – メッセージ制御オペレーション

内容

ライブラリ

Standard C Library (libc, -lc)

書式

#include <sys/types.h>
#include <sys/ipc.h>
#include <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 と一致します。

戻り値

The msgctl function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

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 V の最初のリリースに追加されました。

MSGCTL (3) November 24, 1997

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

With features like these, who needs bugs?
— Henry Spencer