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.mode と msg_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 引数が、無効なアドレスを指定しています。
歴史
メッセージキューは、 AT&T System V UNIX の最初のリリースで登場しました。July 9, 2009 | FreeBSD |