EN JA
MQ_OPEN(2)
MQ_OPEN(2) FreeBSD System Calls Manual MQ_OPEN(2)

名称

mq_openメッセージキューをオープンする (リアルタイム)

ライブラリ

POSIX Real-time Library (librt, -lrt)

書式

#include < mqueue.h>

mqd_t
mq_open( const char *name, int oflag, ...);

解説

mq_open() システムコールは、メッセージキュー記述子でプロセスとメッセージキューとの間の接続を確立します。それは、メッセージキューを参照するオープンしているメッセージキュー記述とそのオープンしているメッセージキュー記述を参照するメッセージキュー記述子を作成します。メッセージキュー記述子は、そのメッセージキューを参照する他の関数によって使用されます。 name 引数は、メッセージキューの名前が付けられた文字列を指します。 name 引数は、パス名のための構成規則に適合するべきです。 name は、スラッシュ文字で始まるべきです。 name の同じ値で mq_open() を呼び出すプロセスは、その名前を削除されていない限り、同じメッセージキューのオブジェクトを参照します。 name 引数が既存のメッセージキューの名前でなく、作成が要求されないなら、 mq_open() は、失敗して、エラーを返します。

oflag 引数は、メッセージキューをアクセスする必要な受信および送信を要求します。呼び出しプロセスが、同等に保護されたファイルへのそれぞれ呼び込みまたは書き込みアクセスを与えられるなら、受信メッセージまたは送信メッセージへの要求されたアクセスパーミッションが、与えられます。

oflag の値は、次のリストからビット単位の包含的 OR の値です。アプリケーションは、 oflag の値で、下記の最初の 3 つの値 (アクセスモード) の 1 つを正確に指定するべきです:

O_RDONLY
受信メッセージのメッセージキューをオープンします。プロセスは、 mq_receive() で返されたメッセージキュー記述子を使用することができますが、 mq_send() のものは使用することができません。メッセージキューは、受信メッセージの同じか、または異なったプロセスで複数回をオープンされます。
O_WRONLY
送信メッセージのキューをオープンします。プロセスは、 mq_send() で返されたメッセージキュー記述子を使用することができますが、 mq_receive() のものは使用することができません。メッセージキューは、送信メッセージの同じか、または異なったプロセスで複数回をオープンされます。
O_RDWR
メッセージを受信して、送信するキューをオープンします。プロセスは、 O_RDONLYO_WRONLY で許された任意の関数で使用することができます。メッセージキューは、送信メッセージの同じか、または異なったプロセスで複数回をオープンされます。

残っているフラグのすべての組み合わせは、 oflag の値で指定されます:

O_CREAT
メッセージキューを作成します。 2 つの追加引数を必要とします: タイプ mode_tmodemq_attr 構造対へのポインタである attr です。パス名 name が、まだ存在しているメッセージキューを作成するために既に使用されていたなら、このフラグは、下記の O_EXCL で述べられることを除いて、効果がありません。そうでなければ、メッセージキューは、それにメッセージなしで作成されます。メッセージキューのユーザ ID は、プロセスの実効ユーザ ID に設定され、メッセージキューのグループ ID は、プロセスの実効グループ ID に設定されます。メッセージキューのパーミッションビットは、プロセスのファイルモード作成マスクで設定されたものを除いて、 mode 引数の値に設定されます。ファイルパーミッションビット以外の mode 中のビットが指定されるとき、効果は不特定です。 attrNULL であるなら、メッセージキューは、実装で定義されたデフォルトメッセージキュー属性で作成されます。 attr が NULL でなく、呼び出しプロセスが、名前で適切な特権があるなら、メッセージキュー mq_maxmsgmq_msgsize 属性は、 attr. によって参照される mq_attr 構造体の対応するメンバの値に設定されます。 attrNULL ではないが、呼び出しプロセスが、名前で適切な特権がないなら、 mq_open() 関数は、失敗し、メッセージキューを作成しないでエラーを返します。
O_EXCL
O_EXCLO_CREAT が設定されるなら、 mq_open() は、メッセージキューの名が存在しているなら、失敗します。
O_NONBLOCK
mq_send() または mq_receive() が、現在利用可能でないリソースまたはメッセージをウェートするかどうか決定する、または errnoEAGAIN に設定され失敗します。詳細に関しては mq_send(2)mq_receive(2) を参照してください。

mq_open() システムコールは、キューにメッセージに追加しないし、キューからメッセージを削除しません。

FreeBSD は、ファイル記述子に基づいてメッセージキューを実装しています。記述子は、 fork(2) の後に子供によって継承されます。記述子は、 exec(3) の後に新しいイメージでクローズされます。 select(2)kevent(2) システムコールは、メッセージキュー記述子に対してサポートされます。

戻り値

成功して終了するとき、関数は、メッセージキュー記述子を返します。そうでなければ、関数は、 ( mqd_t)-1 を返し、グローバル変数 errno にエラーを示す値が設定されます。

エラー

mq_open() システムコールは、次の場合に失敗します:
[ EACCES]
メッセージキューが存在していて、 oflag によって指定されたパーミッションが拒否されるか、またはメッセージキューが存在せず、メッセージキューを作成するパーミッションが否定されます。
[ EEXIST]
O_CREATO_EXCL が設定され、名前が付けられたメッセージキューが、既に存在しています。
[ EINTR]
mq_open() 関数は、シグナルによって割り込まれました。
[ EINVAL]
mq_open() 関数は、与えられた名前をサポートしていません。
[ EINVAL]
O_CREAToflag で指定され、 attr の値が NULL でなく、そして、 mq_maxmsg または mq_msgsize のどちらかが 0 以下でした。
[ EMFILE]
多すぎるメッセージキュー記述子またはファイル記述子が、現在このプロセスで使用中です。
[ ENAMETOOLONG]
name 引数の長さが{ PATH_MAX}を超えるか、またはパス名の構成要素が{ NAME_MAX}より長くなっています。
[ ENFILE]
多すぎるメッセージキューが、現在システムでオープンされています。
[ ENOENT]
O_CREAT が設定されていなくて、名前が付けられたメッセージキューが存在していません。
[ ENOSPC]
新しいメッセージキューを作成するために十分な空間がありません。

規格

mq_open() システムコールは、 IEEE Std 1003.1-2004 (“POSIX.1”) に適合しています。

歴史

POSIX メッセージキューのサポートは FreeBSD 7.0 ではじめて登場しました。

バグ

この実装は、 name の値で厳しい要件を課します。それは、スラッシュ (‘ /’) で始まり、他のスラッシュ文字含んではいけません。

COPYRIGHT

Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2004 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2004 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html.
November 29, 2005 FreeBSD