MSGGET(2)

名前
msgget - メッセージ・キュー識別子を取得する

書式
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>

int msgget ( key_t key, int msgflg )

説明
この関数は key 引き数の値の関連したメッセージ・キュー識別子(identifier)を返す。 key に IPC_PRIVATE が指定された場合は新しいメッセージ・キューが作成される。 また key が IPC_PRIVATE でなくても key に関連するメッセージ・キューが存在せず、 msgflg に IPC_CREAT が指定された場合 ( msgflg&IPC_CREAT がゼロでない)は新しいメッセージ・キューが作成される。 msgflg に IPC_CREAT と IPC_EXCL が存在する場合は既に存在するメッセージ・キューを尊重し、 open(2) システム・コールで mode 引き数に O_CREAT と O_EXCL を指定したの同様の役割を果す: 例えば msgflg に IPC_CREAT と IPC_EXCL 両方が指定されおり、 key に対するメッセージ・キューが既に存在する場合は msgget は失敗する。

作成の場合、 msgflg 引き数の下位 9 ビットは そのメッセージ・キューのアクセス許可パラメーターを定義する。 これらの許可ビットは open(2) や creat(2) システム・コールのアクセス許可パラメーターと同じ形式、同じ意味で 使用される。(実行許可は使用されていない。)

さらに、作成の際に、システムはメッセージ・キュー・データ構造体 msqid_ds を以下のように初期化する:

    msg_perm.cuid と msg_perm.uid には呼び出したプロセスの実効(effective)ユーザー ID が設定される。

    msg_perm.cgid と msg_perm.gid には呼び出したプロセスの実効グループ ID が設定される。

    msg_perm.mode の下位 9 ビットには msgflg の下位 9 ビットが設定される。

    msg_qnum, msg_lspid, msg_lrpid, msg_stime, msg_rtime は 0 に設定される。

    msg_ctime には現在時刻が設定される。

    msg_qbytes にはシステム限界 MSGMNB が設定される。

メッセージ・キューがすでに存在する場合はアクセス許可が検査され、 破壊(destruction)マークがないかをチェックされる。

返り値
成功した場合、返り値はメッセージ・キュー識別子(非負の整数) である。そうでなければ -1 が返され、 errno にそのエラーが示される。

エラー
失敗した場合には errno に以下の値のなかのどれかが設定される:

EACCES
    key に関連するメッセージ・キューは存在するが、 呼び出したプロセスにはそのキューに対してのアクセス許可がない。

EEXIST
    key に関連するメッセージ・キューが存在し、 msgflg に IPC_CREAT と IPC_EXCL が指定されている。

EIDRM
    そのメッセージ・キューに破壊(remove)マークがある。

ENOENT
    key に関連するメッセージ・キューが存在せず、 msgflg に IPC_CREAT が指定されていない。

ENOMEM
    メッセージ・キューを作成しなればならないが、新しいデータ構造体のための 十分なメモリが存在しない。

ENOSPC
    メッセージ・キューを作成しなければならないが、メッセージ・キューの最大数の システム限界 (MSGMNI) を超えている。

注意
IPC_PRIVATE はフラグ・フィールドではなく、 key_t 型である。 この特殊な値が key に指定されると、システム・コールは msgflg の下位 9 ビット以外の全てを無視して(成功した場合) 新しいメッセージ・キューを作成する。

msgget システム・コールに影響するメッセージ・キューの資源のシステム限界には 以下のものがある:

MSGMNI
    システム全体のメッセージ・キューの最大数: 方針依存

バグ
IPC_PRIVATE の使用は他プロセスがその配分されたメッセージ・キューにアクセスすることを 妨げない。

ファイルと同様に、現在のところメッセージ・キューへの排他的なアクセスを 保証する固有の方法は存在しない。 msgflg に IPC_CREAT と IPC_EXCL の両方を指定することは、(成功した場合に)新しいメッセージ・キューが 作成されることのみを保証し、そのメッセージ・キューへの排他的なアクセスは 意味しない。

準拠
SVr4, SVID. SVr4 は EIDRM エラーについて記述していない。

関連項目
ftok(3), ipc(5), msgctl(2), msgsnd(2), msgrcv(2).