msgget - System V
メッセージキュー識別子を取得する
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
The
msgget() system call returns the System V message queue
identifier associated with the value of the
key argument. It may be
used either to obtain the identifier of a previously created message queue
(when
msgflg is zero and
key does not have the value
IPC_PRIVATE), or to create a new set.
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
- A message queue exists for key, but the calling
process does not have permission to access the queue, and does not have
the CAP_IPC_OWNER capability in the user namespace that governs its
IPC namespace.
- EEXIST
-
msgflg に IPC_CREAT と
IPC_EXCL
が指定されたが、
key
に対応するメッセージキューがすでに存在する。
- ENOENT
-
key
に対応するメッセージキューが存在せず、
msgflg に IPC_CREAT
が指定されていなかった。
- ENOMEM
- メッセージキューを作成しようとしたが、新しいデータ構造体を作成
するのに十分なメモリーがシステムに存在しない。
- ENOSPC
- メッセージキューを作成しようとしたが、作成すると
システム全体のメッセージキュー数の最大値
( MSGMNI)
を超えてしまう。
POSIX.1-2001, POSIX.1-2008, SVr4.
Linux や POSIX
の全てのバージョンでは、
<sys/types.h> と
<sys/ipc.h>
のインクルードは必要ない。しかしながら、いくつかの古い実装ではこれらのヘッダーファイルのインクルードが必要であり、
SVID
でもこれらのインクルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれない。
IPC_PRIVATE
はフラグではなく、
key_t 型である。
この特別な値が
key
として使用された場合、
msgget()
システムコールは
msgflg
の下位 9
ビット以外の全てを無視して
(成功した場合は)
新しいメッセージキューを作成する。
msgget()
システムコールに影響を及ぼすメッセージキューの資源の
システムとしての制限を以下に示す:
- MSGMNI
- System-wide limit on the number of message queues. Before
Linux 3.19, the default value for this limit was calculated using a
formula based on available system memory. Since Linux 3.19, the default
value is 32,000. On Linux, this limit can be read and modified via
/proc/sys/kernel/msgmni.
Linux 2.3.20
までは、削除が予定されているメッセージキューに対して
msgget() を行うと
EIDRM
がエラーとして返されるようになっていた。
IPC_PRIVATE
という名前を選んだのはおそらく失敗であろう。
IPC_NEW
の方がより明確にその機能を表しているだろう。
msgctl(2),
msgrcv(2),
msgsnd(2),
ftok(3),
capabilities(7),
mq_overview(7),
sysvipc(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。