msgget

Section: System Calls (2)
Updated: 2026-02-11
Index JM Home Page roff page
 

名前

msgget - System V メッセージキュー識別子を取得する  

ライブラリ

標準 C ライブラリ (libc,~-lc)  

書式

#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) マークがないかの確認が行われる。  

返り値

On success, msgget() returns the message queue identifier (a nonnegative integer). On failure, -1 is returned, and errno is set to indicate the error.  

エラー

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-2024 XSI.  

歴史

SVr4, SUSv1, POSIX.1-2001 XSI.  

Linux

Until Linux 2.3.20, Linux would return EIDRM for a msgget() on a message queue scheduled for deletion.  

注意

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.
 

バグ

IPC_PRIVATE という名前を選んだのはおそらく失敗であろう。 IPC_NEW の方がより明確にその機能を表しているだろう。  

関連項目

msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7)


 

Index

名前
ライブラリ
書式
説明
返り値
エラー
標準規格
歴史
Linux
注意
バグ
関連項目

This document was created by man2html, using the manual pages.