Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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 の場合、または 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 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 msgflgIPC_CREATIPC_EXCL が指定されたが、 key に対応するメッセージキューがす
              でに存在する。

       ENOENT key に対応するメッセージキューが存在せず、 msgflgIPC_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/ に書かれている。