Manpages

名 前

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

書 式

#include <mqueue.h>

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

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

ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr,
size_t
msg_len, unsigned int *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 メ ッ セ ー ジ が 転 送 さ れ る 前 に 関 数 呼 び 出 し が タ イ ム ア ウ ト し た 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 mq_receive() と mq_timedreceive() は ス レ ッ ド セ ー フ で あ る 。

準 拠

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.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。