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.

"I liken starting one's computing career with Unix, say as an undergraduate, to being born in East Africa. It is intolerably hot, your body is covered with lice and flies, you are malnourished and you suffer from numerous curable diseases. But, as far as young East Africans can tell, this is simply the natural condition and they live within it. By the time they find out differently, it is too late. They already think that the writing of shell scripts is a natural act."
— Ken Pier, Xerox PARC