EN JA
MQ_RECEIVE(3)
MQ_RECEIVE(3) Linux Programmer's Manual MQ_RECEIVE(3)

名前

mq_receive, mq_timedreceive -メッセージキューからメッセージを受信する

書式


#include <mqueue.h>
 

ssize_t mq_receive(mqd_t mqdes , char * msg_ptr ,
size_t msg_len , unsigned * msg_prio );
 

#include <time.h>
#include <mqueue.h>
 

ssize_t mq_timedreceive(mqd_t mqdes , char * msg_ptr ,
size_t msg_len , unsigned * msg_prio ,
const struct timespec * abs_timeout );
 
-lrt でリンクする。
 

glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
 
mq_timedreceive():
_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L

説明

mq_receive() は、記述子 mqdes で参照されるメッセージキューから最も高い優先度を持つ最も古いメッセージを削除し、そのメッセージを msg_ptr が指すバッファに格納する。 msg_len 引き数は、 msg_ptr が指すバッファの大きさを示す。この値はキューの mq_msgsize 属性よりも大きくなければならない ( mq_getattr(3) 参照)。 msg_prio が NULL 以外の場合、 msg_prio が指すバッファに受信したメッセージの優先度が格納される。
 
キューが空の場合、デフォルトでは、 mq_receive() は、新しいメッセージが届くか、関数呼び出しがシグナルハンドラにより中断されるまで、停止 (block) する。メッセージキュー記述 (message queue description) で O_NONBLOCK フラグが有効になっている場合は、 mq_receive() はエラー EAGAIN ですぐに失敗する。
 
mq_timedreceive() は mq_receive() と全く同じ動作をするが、メッセージキューが空で、メッセージキュー記述で O_NONBLOCK フラグが有効になっていない場合に、この呼び出しが停止する時間の上限を abs_timeout が指す構造体で指定する点が異なる。この上限は、タイムアウトの時刻を、時刻紀元 (Epoch; 1970-01-01 00:00:00 +0000 (UTC)) からの経過時間 (秒とナノ秒の組) で指定する。タイムアウト時刻は以下の構造体で指定する:
 


struct timespec {
time_t tv_sec; /* 秒 */
long tv_nsec; /* ナノ秒 */
};



メッセージがキューになく、関数呼び出し時にすでにタイムアウト時刻が過ぎている場合、 mq_timedreceive() はすぐに返る。

返り値

成功すると、 mq_receive() と mq_timedreceive() は受信したメッセージのバイト数を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。

エラー

EAGAIN
キューが空で、かつ mqdes で参照されるメッセージキュー記述で O_NONBLOCK フラグがセットされていた。
EBADF
mqdes で指定された記述子が不正である。
EINTR
関数呼び出しがシグナルハンドラにより中断された。 signal(7) 参照。
EINVAL
関数呼び出しは停止するはずであったが、 abs_timeout が不正であった。 abs_timeout が不正とは、 tv_sec が 0 未満、もしくは tv_nsec が 0 未満か 1,000,000,000 より大きい、ということである。
EMSGSIZE
msg_len がメッセージキューの mq_msgsize 属性よりも小さかった。
ETIMEDOUT
メッセージが転送される前に関数呼び出しがタイムアウトした。

準拠

POSIX.1-2001.

注意

Linux では、 mq_timedreceive() はシステムコールである。 mq_receive() はライブラリ関数で、 mq_timedreceive() システムコールを用いて実装されている。

関連項目

mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_send(3), mq_unlink(3), mq_overview(7), time(7)

この文書について

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