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

名称

mq_send, mq_timedsendメッセージをメッセージキューに送信する (リアルタイム)

ライブラリ

POSIX Real-time Library (librt, -lrt)

書式

#include < mqueue.h>

int
mq_send( mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio);

int
mq_timedsend( mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout);

解説

mq_send() システムコールは、引数 msg_ptr によって指されたメッセージを mqdes によって指定されたメッセージキューに追加します。 msg_len 引数は、 msg_ptr によって指されたメッセージの長さバイト単位で指定します。 msg_len の値は、メッセージキューの mq_msgsize 属性より以下であるべきです、そうでなければ mq_send() は、失敗します。

指定されたメッセージキューが満杯でないなら、 mq_send() は、まるでメッセージが msg_prio 引数で示された位置のメッセージキューに挿入されるかのようには振る舞います。 msg_prio より大きい数値があるメッセージは、 msg_prio の値より小さいメッセージの前に挿入されます。メッセージは、キューの中に msg_prio と等しい他のメッセージがあるなら、その後に、挿入されます。 msg_prio の値は{ MQ_PRIO_MAX}未満であるべきです。

指定されたメッセージキューが満杯であり、 mqdes に関連しているメッセージキュー記述で O_NONBLOCK が設定されていないなら、空間がメッセージをエンキューする (キューに入れる) ことができるようになるか、または mq_send() がシグナルによって割り込まれるまで、 mq_send() は、ブロックされます。空間がメッセージキューで利用可能になるとき、2 つ以上のスレッドが、送信することをウェートし、Priority Scheduling (優先スケジューリング) オプションがサポートされているなら、最も長い間ウェートしている最も高い優先順序のスレッドは、メッセージを送信するためにアンブロックされます。そうでなければ、どのウェートしているスレッドがアンブロックされるれるかは、不特定です。指定されたメッセージキューが満杯であり、 mqdes に関連しているメッセージキュー記述に O_NONBLOCK が設定されているなら、メッセージは、キューに入れられないで、 mq_send() は、エラーを返します。

mq_timedsend() システムコールは、 mq_send() システムコールのために定義された方法で mqdes によって指定されたメッセージキューにメッセージを追加します。しかしながら、指定されたメッセージキューが満杯であり、 mqdes に関連しているメッセージキュー記述に O_NONBLOCK が設定されているなら、キューの十分な空間に対するウェートは、指定されたタイムアウトの期限が切れるとき、終了されます。メッセージキュー記述に O_NONBLOCK が設定されているなら、このシステムコールは mq_send() と同等です。

abs_timeout によって指定された絶対的な時間が経過するとき、タイムアウトが基づいている (すなわち、そのクロックの値が、 abs_timeout と等しいか、または超えるとき) クロックによって測定されるか、または abs_timeout によって指定された絶対的な時間が呼び出し時点で既に過ぎているなら、タイムアウトは期限が切れます。

タイムアウトは、 CLOCK_REALTIME クロックに基づいています。

戻り値

成功して終了するとき、 mq_send() と mq_timedsend() システムコールは、0 の値を返します。そうでなければ、メッセージは、エンキューされず (キューに入れられず)、システムコールは-1 を返し、グローバル変数 errno にエラーを示す値が設定されます。

エラー

mq_send() と mq_timedsend() システムコールは、次の場合に失敗します:
[ EAGAIN]
O_NONBLOCK フラグは、 mqdes に関連しているメッセージキュー記述で設定され、指定されたメッセージキューは、満杯です。
[ EBADF]
mqdes 引数は、書き込み用にオープンされた有効なメッセージキュー記述子ではありません。
[ EINTR]
シグナルが mq_send() または mq_timedsend() への呼び出しを割り込みました。
[ EINVAL]
msg_prio の値は、有効な範囲外でした。
[ EINVAL]
プロセスまたはスレッドがブロックされ、 abs_timeout パラメータが、0 または 10 億以上のナノ秒フィールド値を指定しました。
[ EMSGSIZE]
指定されたメッセージの長さ msg_len は、メッセージキューのメッセージサイズ属性を超えました。
[ ETIMEDOUT]
メッセージキューがオープンされたとき、 O_NONBLOCK フラグが設定されていませんでしたが、メッセージをキューに追加する前にタイムアウトの期限が切れました。

規格

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

歴史

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

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