| 総合手引 | セクション 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.
| “ | "I liken starting one's computing career with Unix, say as an undergraduate, to being born in East Africa. It is intolerably hot, your body is covered with lice and flies, you are malnourished and you suffer from numerous curable diseases. But, as far as young East Africans can tell, this is simply the natural condition and they live within it. By the time they find out differently, it is too late. They already think that the writing of shell scripts is a natural act." | ” |
| — Ken Pier, Xerox PARC | ||