総合手引 | セクション 3 | オプション |
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
各メッセージキューには、それに関連したデータ構造体があります。 その一部は 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 と一致します。
[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 が正しいアドレスを指定していない場合。 | |
MSGCTL (3) | November 24, 1997 |
総合手引 | セクション 3 | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | With features like these, who needs bugs? | ” |
— Henry Spencer |