MSGCTL(3) FreeBSD ライブラリ関数マニュアル MSGCTL(3)
名称
msgctl − メッセージ制御オペレーション |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.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 IPC_RMID メッセージキューからの読込み権かメッセージキューへの書込み権 ( msgsnd(3) と msgrcv(3) 参照) は、ファイルと同じように ( chmod(2) 参照)、 msg_perm.mode フィールドによって決まります。実効ユーザ ID は、 msg_perm.cuid フィールドか msg_perm.uid フィールドと一致し、実効グループ ID は、 msg_perm.cgid か msg_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] [EINVAL] cmd が正しいコマンドでない場合。 [EFAULT] 関連項目 |
歴史
メッセージキューは、 AT&T System V UNIX の最初のリリースに追加されまし た。 FreeBSD 10.0 November 24, 1997 FreeBSD 10.0 |