kazmax - Linux で自宅サーバー

msgget - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 注意
  7. バグ
  8. 準拠
  9. Linux での注意
  10. 関連項目

名前

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 の場合、または keyIPC_PRIVATE でなくても、 key に対応するメッセージ・キューが存在せず、 msgflgIPC_CREAT が指定されている場合、 新しいメッセージ・キューが作成される。

msgflgIPC_CREATIPC_EXCL の両方が指定された場合、 key に対応するメッセージ・キューが既に存在すると、 msgget ()は失敗し、 errnoEEXIST が設定される。 (これは   open (2) に O_CREAT | O_EXCL を指定した場合の動作と同じである)

メッセージ・キューの作成時に、 msgflg 引き数の下位 9 ビットは、 そのメッセージ・キューのアクセス許可の定義として使用される。 これらの許可ビットは   open (2) の引き数 mode と同じ形式で同じ意味である。 や creat (2)システム・コールのアクセス許可パラメータと同じ形式で、同じ意味を持つ。 (但し、実行 (execute) 許可は使用されない。)

新規のメッセージ・キューを作成する際、 msgget ()システム・コールはメッセージ・キューのデータ構造体 msqid_ds を以下のように初期化する ( msqid_ds については   msgctl (2) を参照):
msg_perm.cuidmsg_perm.uid に呼び出し元プロセスの実効 (effective) ユーザーID を設定する。
msg_perm.cgidmsg_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 に対応するメッセージ・キューが存在し、 msgflgIPC_CREATIPC_EXCL が指定されていた。
ENOENT
key に対応するメッセージ・キューが存在せず、 msgflgIPC_CREAT が指定されていなかった。
ENOMEM
メッセージ・キューを作成しようとしたが、新しいデータ構造体を作成 するのに十分なメモリがシステムに存在しない。
ENOSPC
メッセージ・キューを作成しようとしたが、作成すると システム全体のメッセージ・キュー数の最大値 ( MSGMNI )を超えてしまう。

注意

IPC_PRIVATE はフラグではなく、 key_t 型である。 この特別な値が key として使用された場合、 msgget ()システムコールは msgflg の下位 9 ビット以外の全てを無視して (成功した場合は) 新しいメッセージ・キューを作成する。

msgget ()システムコールに影響を及ぼすメッセージ・キューの資源の システムとしての制限を以下に示す:

MSGMNI
システム全体のメッセージ・キュー数の最大値: 方針依存 (Linux では、この制限値は /proc/sys/kernel/msgmni 経由で参照したり、変更したりできる)。

バグ

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

準拠

SVr4, POSIX.1-2001.

Linux での注意

Linux 2.3.20 までは、削除が予定されているメッセージ・キューに対して msgget ()を行うと EIDRM がエラーとして返されるようになっていた。

関連項目

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