Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
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_CREAT が oflag に指定され、かつ指定された名前 name を持つキューがすでに存在する場 合、エラー EEXIST で失敗する。 O_NONBLOCK 非停止 (nonblocking) モードでキューをオープンする。 mq_receive(3) と mq_send(3) は、通常は停止 (block) する状況において、エラー EAGAIN で失敗するようになる。 oflag に O_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 oflag に O_CREAT と O_EXCL の両方が指定されたが、指定された名前 name を持つキューが すでに存在する。 EINVAL name doesn't follow the format in mq_overview(7). EINVAL oflag に O_CREAT が指定され、かつ attr が NULL 以外だが、 attr->mq_maxmsg か attr->mq_msqsize が不正であった。 これらのフィールドは両方とも 0 より大きくなければ ならない。 プロセスが特権を持たない (CAP_SYS_RESOURCE ケーパビリティを持たない) 場 合、 attr->mq_maxmsg と attr->mq_msgsize は、それぞれ上限 msg_max、 msgsize_max 以 下でなければならない。 また、特権プロセスの場合でも、 attr->mq_maxmsg は HARD_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/ に書かれている。