MSGGET
Section: Linux Programmer's Manual (2)
Updated: 2004-05-27
Index
JM Home Page
roff page
名前
msgget - メッセージ・キュー識別子を取得する
書式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key,
int msgflg);
説明
msgget()
システムコールは
key
引き数の値に対応するメッセージ・キューの識別子を返す。
key
の値が
IPC_PRIVATE
の場合、または
key
が
IPC_PRIVATE
でなくても、
key
に対応するメッセージ・キューが存在せず、
msgflg
に
IPC_CREAT
が指定されている場合、
新しいメッセージ・キューが作成される。
msgflg
に
IPC_CREAT
と
IPC_EXCL
の両方が指定された場合、
key
に対応するメッセージ・キューが既に存在すると、
msgget()
は失敗し、
errno
に
EEXIST
が設定される。
(これは
open(2)
に
O_CREAT | O_EXCL
を指定した場合の動作と同じである)
メッセージ・キューの作成時に、
msgflg
引き数の下位 9 ビットは、
そのメッセージ・キューのアクセス許可の定義として使用される。
これらの許可ビットは
open(2)
の引き数
mode
と同じ形式で同じ意味である。
や
creat(2)
システム・コールのアクセス許可パラメータと同じ形式で、同じ意味を持つ。
(但し、実行 (execute) 許可は使用されない。)
新規のメッセージ・キューを作成する際、
msgget()
システム・コールはメッセージ・キューのデータ構造体
msqid_ds
を以下のように初期化する
(msqid_ds
については
msgctl(2)
を参照):
-
msg_perm.cuid
と
msg_perm.uid
に呼び出し元プロセスの実効 (effective) ユーザーID を設定する。
-
msg_perm.cgid
と
msg_perm.gid
に呼び出し元プロセスの実効 (effective) グループ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
に対応するメッセージ・キューは存在するが、
呼び出し元プロセスはそのキューに対するアクセス許可がなく、
CAP_IPC_OWNER
ケーパビリティも持っていない。
- EEXIST
-
key
に対応するメッセージ・キューが存在し、
msgflg
に
IPC_CREAT
と
IPC_EXCL
が指定されていた。
- ENOENT
-
key
に対応するメッセージ・キューが存在せず、
msgflg
に
IPC_CREAT
が指定されていなかった。
- ENOMEM
-
メッセージ・キューを作成しようとしたが、新しいデータ構造体を作成
するのに十分なメモリがシステムに存在しない。
- ENOSPC
-
メッセージ・キューを作成しようとしたが、作成すると
システム全体のメッセージ・キュー数の最大値
(MSGMNI)
を超えてしまう。
準拠
SVr4, POSIX.1-2001.
注意
IPC_PRIVATE
はフラグではなく、
key_t
型である。
この特別な値が
key
として使用された場合、
msgget()
システムコールは
msgflg
の下位 9 ビット以外の全てを無視して
(成功した場合は) 新しいメッセージ・キューを作成する。
msgget()
システムコールに影響を及ぼすメッセージ・キューの資源の
システムとしての制限を以下に示す:
- MSGMNI
-
システム全体のメッセージ・キュー数の最大値: 方針依存
(Linux では、この制限値は
/proc/sys/kernel/msgmni
経由で参照したり、変更したりできる)。
Linux での注意
Linux 2.3.20 までは、削除が予定されているメッセージ・キューに対して
msgget()
を行うと
EIDRM
がエラーとして返されるようになっていた。
バグ
IPC_PRIVATE
という名前を選んだのはおそらく失敗であろう。
IPC_NEW の方がより明確にその機能を表しているだろう。
関連項目
msgctl(2),
msgrcv(2),
msgsnd(2),
ftok(3),
capabilities(7),
mq_overview(7),
svipc(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 注意
-
- Linux での注意
-
- バグ
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:54 GMT, November 19, 2007