mq_open - ライブラリコールの説明 - Linux コマンド集 一覧表
名前
mq_open - メッセージキューをオープンする
書式
#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);
説明
mq_open
()は、新しい POSIX メッセージキューを作成するか、既存のキューを
オープンする。キューは
name
で識別される。
name
の構成の詳細については
mq_overview (7)
を参照。
oflag
引き数には、関数呼び出しの操作を制御するフラグを指定する。
oflag
には、以下のうちいずれか一つを必ず指定しなければならない。
- O_RDONLY
- メッセージの受信専用としてキューをオープンする。
- O_WRONLY
- メッセージの送信専用としてキューをオープンする。
- O_RDWR
-
メッセージの送受信両用としてキューをオープンする。
0 個以上の下記のフラグを、ビット単位の OR (論理和) で oflag に追加で指定できる。
- O_NONBLOCK
- 非停止 (non-blocking) モードでキューをオープンする。 mq_receive ()と mq_send ()は、通常は停止 (block) する状況において、エラー EAGAIN で失敗するようになる。
- O_CREAT
- 存在しない場合、メッセージキューを作成する。 メッセージキューの所有者 (ユーザ ID) とグループ所有権 (グループ ID) は、 それぞれ呼び出し元プロセスの実効ユーザ ID と実効グループ ID に設定される。
- O_EXCL
-
O_CREAT
が
oflag
に指定され、かつ指定された名前
name
を持つキューがすでに存在する場合、エラー
EEXIST
で失敗する。
oflag に O_CREAT を指定する場合、追加で 2つの引き数を与える必要がある。 mode 引き数は、新しいキューに適用される許可設定 (permission) を、 open (2) と同じように指定する。 許可設定はプロセスの umask でマスクされる。 attr 引き数は、キューの属性を指定する。詳細は、 mq_getattr (2)を参照。 attr が NULL の場合、キューは実装で定義されたデフォルト属性で作成される。
返り値
成功すると、 mq_open ()はメッセージキュー記述子 (message queue descriptor) を返す。 メッセージキュー記述子は他のメッセージキュー関連の関数で使用される。 エラーの場合、 mq_open ()は "(mqd_t)-1" を返し、 errno にエラーを示す値を設定する。
エラー
- EACCESS
- キューは存在するが、呼び出し元が指定されたモードでそのキュー をオープンする許可を持たない。
- 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) を参照。)
- EEXIST
- oflag に O_CREAT と O_EXCL の両方が指定されたが、指定された名前 name を持つキューがすでに存在する。
- EMFILE
- そのプロセスがオープンしているファイルとメッセージキューの数が プロセス毎の上限に達している。
- ENAMETOOLONG
- name が長すぎる。
- ENFILE
- システム全体でオープンしているファイルとメッセージキューの合計数が システム上限に達している。
- ENOENT
- O_CREAT フラグが oflag に指定されなかったが、指定された名前 name を持つキューが存在しない。
- ENOMEM
- 十分なメモリがない。
- ENOSPC
- 新しいメッセージキューを作成するのに十分な空間がない。 このエラーはおそらく queues_max 上限に抵触したため起こったのだろう。 mq_overview (7) を参照。
準拠
POSIX.1-2001.
バグ
2.6.14 より前のカーネルには、 プロセスの umask が mode で指定された許可設定に適用されなかった。