MQ_RECEIVE
Section: Linux Programmer's Manual (3)
Updated: 2006-02-25
Index
JM Home Page
roff page
名前
mq_receive, mq_timedreceive - メッセージキューからメッセージを受信する
書式
#include <mqueue.h>
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
size_t msg_len, unsigned *msg_prio);
#define _XOPEN_SOURCE 600
#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 でリンクする。
説明
mq_receive()
は、記述子
mqdes
で参照されるメッセージキューから最も高い優先度を持つ
最も古いメッセージを削除し、そのメッセージを
msg_ptr
が指すバッファに格納する。
msg_len
引き数は、
msg_ptr
が指すバッファの大きさを示す。この値はキューの
mq_msgsize
属性よりも大きくなければならない
(mq_getattr(3)
参照)。
prio
が NULL 以外の場合、
prio
が指すバッファに受信したメッセージの優先度が格納される。
キューが空の場合、デフォルトでは、
mq_receive()
は、新しいメッセージが届くか、関数呼び出しがシグナルハンドラにより
中断されるまで、停止 (block) する。
メッセージキュー記述 (message queue description) で
O_NONBLOCK
フラグが有効になっている場合は、
mq_receive()
はエラー
EAGAIN
ですぐに失敗する。
mq_timedreceive()
は
mq_receive()
と全く同じ動作をするが、
メッセージキューが空で、メッセージキュー記述で
O_NONBLOCK
フラグが有効になっていない場合に、この呼び出しが停止する時間の上限を
abs_timeout
が指す構造体で指定する点が異なる。この上限は、タイムアウトの時刻を
時刻紀元 (Epoch; 1970 年 1 月 1 日 00:00:00) からの経過時間
(秒とナノ秒の組) で指定する。タイムアウト時刻は以下の構造体で指定する:
-
struct timespec {
time_t tv_sec; /* 秒 */
long tv_nsec; /* ナノ秒 */
};
メッセージがキューになく、関数呼び出し時にすでにタイムアウト時刻が
過ぎている場合、
mq_timedreceive()
はすぐに返る。
返り値
成功すると、
mq_receive()
と
mq_timedreceive()
は受信したメッセージのバイト数を返す。
エラーの場合、-1 を返し、
errno
にエラーを示す値を設定する。
エラー
- EAGAIN
-
キューが空で、かつ
mqdes
で参照されるメッセージキュー記述で
O_NONBLOCK
フラグがセットされていた。
- EBADF
-
mqdes
で指定された記述子が不正である。
- EINTR
-
関数呼び出しがシグナルハンドラにより中断された。
- EINVAL
-
関数呼び出しは停止するはずであったが、
abs_timeout
が不正であった。
abs_timeout
が不正とは、
tv_sec
が 0 未満、もしくは
tv_nsec
が 0 未満か 1,000,000,000 より大きい、ということである。
- EMSGSIZE
-
msg_len
がメッセージキューの
mq_msgsize
属性よりも小さかった。
- ETIMEDOUT
-
メッセージが転送される前に関数呼び出しがタイムアウトした。
準拠
POSIX.1-2001.
関連項目
mq_close(3),
mq_getattr(3),
mq_notify(3),
mq_open(3),
mq_send(3),
mq_unlink(3),
feature_test_macros(7),
mq_overview(7)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:53 GMT, November 19, 2007