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

名前

       mq_open - メッセージキューをオープンする

書式

       #include <fcntl.h>           /* For O_* constants */
       #include <sys/stat.h>        /* For mode constants */
       #include <mqueue.h>

       mqd_t mq_open(const char *name, int oflag);
       mqd_t mq_open(const char *name, int oflag, mode_t mode,
                     struct mq_attr *attr);

       -lrt でリンクする。

説明

       mq_open()    は、新しい   POSIX   メッセージキューを作成するか、既存のキューを  オープンす
       る。キューは name で識別される。 name の構成の詳細については mq_overview (7) を参照。

       oflag 引数には、関数呼び出しの操作を制御するフラグを指定する (oflag の値の定義は <fcntl.h>
       のインクルードにより得られる)。 oflag には、以下のうちいずれか一つを必ず指定しなければなら
       ない。

       O_RDONLY
              メッセージの受信専用としてキューをオープンする。

       O_WRONLY
              メッセージの送信専用としてキューをオープンする。

       O_RDWR メッセージの送受信両用としてキューをオープンする。

       0 個以上の下記のフラグを、ビット単位の OR (論理和) で oflag に追加で指定できる。

       O_CLOEXEC (Linux 2.6.26 以降)
              メッセージキュー記述子に close-on-exec フラグをセットする。  なぜこのフラグが有用か
              についての議論は open(2) を参照。

       O_CREAT
              存在しない場合、メッセージキューを作成する。 メッセージキューの所有者 (ユーザー ID)
              とグループ所有権 (グループ ID) は、 それぞれ呼び出し元プロセスの実効ユーザー ID  と
              実効グループ ID に設定される。

       O_EXCL O_CREAToflag に指定され、かつ指定された名前 name を持つキューがすでに存在する場
              合、エラー EEXIST で失敗する。

       O_NONBLOCK
              非停止 (nonblocking) モードでキューをオープンする。  mq_receive(3)   と  mq_send(3)
              は、通常は停止 (block) する状況において、エラー EAGAIN で失敗するようになる。

       oflagO_CREAT を指定する場合、追加で 2つの引数を与える必要がある。 mode 引数は、新しい
       キューに適用される許可設定 (permission) を、 open(2)  と同じように指定する (許可ビットのシ
       ンボル定義は  <sys/stat.h> のインクルードにより得られる)。 許可設定はプロセスの umask でマ
       スクされる。

       The fields of the struct mq_attr pointed to attr specify the maximum  number  of  messages
       and  the maximum size of messages that the queue will allow.  This structure is defined as
       follows:

           struct mq_attr {
               long mq_flags;       /* フラグ (mq_open() では無視される) */
               long mq_maxmsg;      /* キューの最大メッセージ数 */
               long mq_msgsize;     /* 最大メッセージサイズ (バイト単位) */
               long mq_curmsgs;     /* キューに現在入っているメッセージ数
                                       (mq_open() では無視される) */
           };

       Only the mq_maxmsg and mq_msgsize fields are employed when calling mq_open();  the  values
       in the remaining fields are ignored.

       attr が NULL の場合、キューは実装で定義されたデフォルト属性で作成される。 Linux 3.5 以降で
       は、2 つの /proc ファイルがあり、これらのデフォルト値を制御できる。 詳細は  mq_overview(7)
       を参照。

返り値

       成功すると、  mq_open()  はメッセージキュー記述子 (message queue descriptor) を返す。 メッ
       セージキュー記述子は他のメッセージキュー関連の関数で使用される。 エラーの場合、  mq_open()
       は (mqd_t) -1 を返し、 errno にエラーを示す値を設定する。

エラー

       EACCES キューは存在するが、呼び出し元が指定されたモードでそのキュー をオープンする許可を持
              たない。

       EACCES name にスラッシュが 2 個以上含まれていた。

       EEXIST oflagO_CREATO_EXCL の両方が指定されたが、指定された名前 name を持つキューが
              すでに存在する。

       EINVAL name doesn't follow the format in mq_overview(7).

       EINVAL oflagO_CREAT  が指定され、かつ  attr  が  NULL  以外だが、 attr->mq_maxmsgattr->mq_msqsize が不正であった。 これらのフィールドは両方とも 0 より大きくなければ
              ならない。  プロセスが特権を持たない (CAP_SYS_RESOURCE ケーパビリティを持たない) 場
              合、 attr->mq_maxmsgattr->mq_msgsize は、それぞれ上限 msg_maxmsgsize_max  以
              下でなければならない。  また、特権プロセスの場合でも、  attr->mq_maxmsgHARD_MAX
              上限を超えることはできない。 (これらの上限に関する詳細は mq_overview(7)  を参照。)

       EMFILE The per-process limit on the number of open file and message queue descriptors  has
              been reached (see the description of RLIMIT_NOFILE in getrlimit(2)).

       ENAMETOOLONG
              name が長過ぎる。

       ENFILE システム全体でオープンしているファイルとメッセージキューの合計数がシステム全体の上
              限に達している。

       ENOENT O_CREAT フラグが oflag に指定されなかったが、指定された名前 name を持つキューが存在
              しない。

       ENOENT name が "/" だけで、その後ろに他の文字が続いていなかった。

       ENOMEM 十分なメモリーがない。

       ENOSPC 新しいメッセージキューを作成するのに十分な空間がない。         このエラーはおそらく
              queues_max 上限に抵触したため起こったのだろう。 mq_overview(7)  を参照。

属性

       この節で使用されている用語の説明については、 attributes(7) を参照。

       ┌─────────────────┬───────────────┬─────────┐
       │インターフェース属性      │
       ├─────────────────┼───────────────┼─────────┤
       │mq_open()        │ Thread safety │ MT-Safe │
       └─────────────────┴───────────────┴─────────┘

準拠

       POSIX.1-2001, POSIX.1-2008.

注意

   C ライブラリとカーネルの違い
       The mq_open()  library function is implemented on top of a system call of the  same  name.
       The  library function performs the check that the name starts with a slash (/), giving the
       EINVAL error if it does not.  The kernel system call expects name to contain no  preceding
       slash,  so  the  C library function passes name without the preceding slash (i.e., name+1)
       to the system call.

バグ

       2.6.14 より前のカーネルには、 プロセスの umask  が  mode  で指定された許可設定に適用されな
       かった。

関連項目

       mq_close(3),   mq_getattr(3),   mq_notify(3),   mq_receive(3),  mq_send(3),  mq_unlink(3),
       mq_overview(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。