スポンサーリンク

MSGCTL(3) FreeBSD ライブラリ関数マニュアル MSGCTL(3)

名称

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

ライブラリ

標準 C ライブラリ (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.cuidmsg_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.cgidmsg_perm.gid と一致します。

戻り値

関数 msgctl() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

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

FreeBSD 10.0 November 24, 1997 FreeBSD 10.0

スポンサーリンク