EN JA
MSGCTL(2)
MSGCTL(2) FreeBSD System Calls Manual MSGCTL(2)

名称

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; /* キューの最後のメッセージ */ 
 msglen_t msg_cbytes; /* キューで使用しているバイト数 */ 
 msgqnum_t msg_qnum; /* キューのメッセージ数  */ 
 msglen_t msg_qbytes; /* キューの最大バイト数 */ 
 pid_t msg_lspid; /* 最後の msgsnd() の pid */ 
 pid_t msg_lrpid; /* 最後の msgrcv() の pid */ 
 time_t msg_stime; /* 最後の msgsnd() の時間 */ 
 time_t msg_rtime; /* 最後の msgrcv() の時間 */ 
 time_t msg_ctime; /* 最後の msgctl() の時間 */ 
};

msqid_ds 構造体の中で使用される ipc_perm 構造体は、 < sys/ipc.h> で定義され、次のようになっています:

struct ipc_perm { 
 uid_t  cuid; /* 作成者のユーザ ID */ 
 gid_t  cgid; /* 生成者のグループ ID */ 
 uid_t  uid; /* ユーザ ID */ 
 gid_t  gid; /* グループ ID */ 
 mode_t  mode; /* r/w パーミッション */ 
 unsigned short seq; /* (ユニークな ipcid を生成するための) */ 
       シーケンス番号 */ 
 key_t  key; /* ユーザ指定の msg/sem/shm キー */ 
};

msgctl() によって実行される操作は、 cmd で指定され、次の 1 つです:

IPC_STAT
メッセージキューに関する情報を集め、 buf によって指される構造体にそれを置きます。
IPC_SET
msqid に関連する構造体の msg_perm.uid, msg_perm.gid, msg_perm.modemsg_qbytes フィールドの値を設定します。この値は、 buf によって指される構造体の対応するフィールドから取られます。スーパユーザまたはメッセージキューに関連するデータ構造体の msg_perm.cuid または msg_perm.uid のいずれかと等しい実効ユーザ ID を持つプロセスのみ、この操作を実行することができます。スーパユーザによってのみ msg_qbytes の値を増加させることができます。システム制限 ( < sys/msg.h> の MSGMNB) を越える msg_qbytes の値は、黙ってその制限に切り詰められます。
IPC_RMID
msqid によって指定されるメッセージキューを削除し、それに関連するデータを破壊します。スーパユーザまたはキューに関連するデータ構造体の msg_perm.cuid または msg_perm.uid の値と等しい実効ユーザ ID があるプロセスだけが、これを行うことができます。

メッセージキュー ( msgsnd(2)msgrcv(2) 参照) から読み込むか、または書き込むパーミッションは、ファイルで行われているのと同じ方法 ( chmod(2) 参照) で msg_perm.mode フィールドによって決定されますが、実効 uid は、 msg_perm.cuid フィールドまたは msg_perm.uid フィールドのいずれかとマッチすることができ、実効 gid は、 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 と等しく、呼び出し側がスーパユーザでも、メッセージキューに関連するデータ構造体の msg_perm.uid フィールドまたは msg_perm.cuid フィールドのいずれかとマッチする実効 uid でもありません。

IPC_SET を通して msg_qbytes の値を増加させようと試みましたが、呼び出し側がスーパユーザでありません。

[ EACCES]
コマンドは、IPC_STAT ですが、呼び出し側には、このメッセージキューのための読み込みパーミッションがありません。
[ EINVAL]
msqid 引数が、有効なメッセージキュー識別子ではありません。

cmd が、有効なコマンドではありません。

[ EFAULT]
buf 引数が、無効なアドレスを指定しています。

関連項目

msgget(2), msgrcv(2), msgsnd(2)

歴史

メッセージキューは、 AT&T System V UNIX の最初のリリースで登場しました。
July 9, 2009 FreeBSD