MSGGET

Section: Linux Programmer's Manual (2)
Updated: 2019-08-02
Index JM Home 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/ に書かれている。

関連キーワード

メッセージキュー   ビット   許可   perm   下位   インクルード   System   message queue   limit   msgget   識別子   types   system   identifier   意味   構造体   実効   effective   成功   namespace   default   kernel   call   associated   argument

Linux マニュアル 一覧

関連するコマンド・関数

msgctl.2   mq_close.3   mq_open.2   mq_open.3   mq_unlink.2   mq_unlink.3
 

Index

名前
書式
説明
返り値
エラー
準拠
注意
Linux での注意
バグ
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:39:01 GMT, October 11, 2026