MSGGET
Section: Linux Programmer's Manual (2)
Updated: 2019-08-02
Index
JM Home Page
roff page
 
名前
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 での注意
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/ に書かれている。
 Index
- 名前
 - 
 - 書式
 - 
 - 説明
 - 
 - 返り値
 - 
 - エラー
 - 
 - 準拠
 - 
 - 注意
 - 
- Linux での注意
 - 
 
 - バグ
 - 
 - 関連項目
 - 
 - この文書について
 - 
 
This document was created by
man2html,
using the manual pages.
Time: 16:46:42 GMT, November 24, 2023